diff --git a/404.html b/404.html index f94338d7c..e5d015bdb 100644 --- a/404.html +++ b/404.html @@ -8,13 +8,13 @@ - - + + -

404

There's nothing here.
+ - + diff --git a/about.html b/about.html index 233bd7e8f..a09130011 100644 --- a/about.html +++ b/about.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/assets/css/0.styles.2922c98a.css b/assets/css/0.styles.2922c98a.css new file mode 100644 index 000000000..0febff5a9 --- /dev/null +++ b/assets/css/0.styles.2922c98a.css @@ -0,0 +1 @@ +svg[data-v-49140617]{position:absolute;right:7.5px;opacity:.75;cursor:pointer}svg.hover[data-v-49140617]{opacity:0}svg[data-v-49140617]:hover{opacity:1!important}span[data-v-49140617]{position:absolute;font-size:.85rem;line-height:.425rem;right:50px;opacity:0;transition:opacity .5s}.success[data-v-49140617]{opacity:1!important}.code-copy-added:hover>.code-copy svg{opacity:.75}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#267cb9}.code-copy{position:absolute;bottom:0;right:0;z-index:3}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:1280px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:500px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}a{font-weight:500;color:#267cb9}a,a:hover{text-decoration:none}a:hover{color:#8a684f}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.sidebar .nav-links .nav-item{padding-left:0!important}.sidebar-heading{font-weight:600!important}.dropdown-wrapper{cursor:inherit!important}.dropdown-wrapper a,.dropdown-wrapper button{cursor:pointer}.dropdown-wrapper .nav-dropdown .dropdown-item em,.dropdown-wrapper .nav-dropdown .dropdown-item span{padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-subitem-wrapper .dropdown-subitem a,.dropdown-wrapper .nav-dropdown .dropdown-subitem-wrapper .dropdown-subitem em,.dropdown-wrapper .nav-dropdown .dropdown-subitem-wrapper .dropdown-subitem span{padding-left:2.2rem}.fullpage-content,.theme-default-content{height:100%}.fullpage-content img,.theme-default-content img{max-width:100%}.fullpage-content figure,.theme-default-content figure{max-width:130%;margin:0 -15%;text-align:center}.fullpage-content figcaption,.theme-default-content figcaption{margin:0 11.53%;font-style:italic;display:inline-block;text-align:left}.fullpage-content figcaption:before,.theme-default-content figcaption:before{content:"Figure: ";font-weight:700}@media (min-width:1600px){.fullpage-content img,.theme-default-content img{max-height:90%}.fullpage-content figure,.theme-default-content figure{max-width:150%;margin:0 -25%}.fullpage-content figcaption,.theme-default-content figcaption{margin:0 16.66%}}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content.custom{padding:0;margin:0}.page{padding-left:20rem;padding-bottom:0}.page p a code{font-weight:400;color:#267cb9}.page kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}.page blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}.page>p{margin:0}.page ol,.page ul{padding-left:1.2em}.page strong{font-weight:600}.page h1,.page h2,.page h3,.page h4,.page h5,.page h6{font-weight:600;line-height:1.25}.page h2,.page h3,.page h4{margin-top:-3.6rem;padding-top:3.6rem}.theme-default-content:not(.custom)>.page{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>.page+.custom-block,.theme-default-content:not(.custom)>.page+p,.theme-default-content:not(.custom)>.page+pre,.theme-default-content:not(.custom)>.page:first-child,.theme-default-content:not(.custom)>.page margin-bottom 1rem,.theme-default-content:not(.custom)>.page margin-top -1.5rem{margin-top:2rem}.page:hover .header-anchor{opacity:1}.page h1{font-size:2.2rem}.page h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}.page h3{font-size:1.35rem}.page .line-number,.page code,.page kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.page ol,.page p,.page ul{line-height:1.7}.page hr{border:0;border-top:1px solid #eaecef}.page table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}.page tr{border-top:1px solid #dfe2e5}.page tr:nth-child(2n){background-color:#f6f8fa}.page td,.page th{border:1px solid #dfe2e5;padding:.6em 1em}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:1025px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}.vue-component.search-box .icon{display:none}@media (max-width:1366px){.navbar .site-name{display:none}.fullpage-content figure,.theme-default-content figure{margin:0;max-width:100%}.fullpage-content figcaption,.theme-default-content figcaption{margin:0}}@media (max-width:1280px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}.navbar .nav-links .nav-item:first-of-type{display:none}}@media (max-width:1024px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}.navbar .site-name.can-hide{display:inline-block;width:auto}.nav-links .nav-item:first-child{margin-left:1.5rem!important}}@media (max-width:500px){.page h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}@media (max-width:300px){.navbar .site-name.can-hide{display:none}}#nprogress{pointer-events:none}#nprogress .bar{background:#267cb9;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #267cb9,0 0 5px #267cb9;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#267cb9 transparent transparent #267cb9;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.code-switcher div[class*=language-]:before{content:""}.code-switcher .tab-header ul{padding:0;text-align:right;margin-bottom:-5px;margin-top:20px}.code-switcher .tab-header li{display:inline-block;padding:0 10px;cursor:pointer;border-radius:4px;border:2px solid #eaecef;margin-left:5px;font-size:80%}.code-switcher .tab-header li.active{border-color:#267cb9}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding-top:3.6rem;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:179px;display:block;margin:1.5rem auto}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:42rem;font-size:1.4rem;line-height:1.3;color:#6a8bad}.home .hero .description.small{font-size:1.1rem}.home .hero .description a{text-decoration:underline}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#267cb9;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #2270a6}.home .hero .action-button:hover{background-color:#2b8cd1}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:49%;max-width:49%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}@media (max-width:1024px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:500px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#267cb9;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c3e50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c3e50}@media (min-width:1024px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:1024px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#267cb9}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#267cb9}@media (max-width:1280px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:1280px) and (min-width:1024px){.search-box .suggestions{left:0}}@media (max-width:1024px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:500px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:1024px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.badge[data-v-385f24c3]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;background-color:#42b983}.badge.green[data-v-385f24c3],.badge.tip[data-v-385f24c3]{background-color:#267cb9}.badge.error[data-v-385f24c3]{background-color:#da5961}.badge.warn[data-v-385f24c3],.badge.warning[data-v-385f24c3],.badge.yellow[data-v-385f24c3]{background-color:#e7c000}.badge+.badge[data-v-385f24c3]{margin-left:5px}.channels{display:flex}.channels ul{margin:0 1em 0 0;padding:0;list-style-type:none;line-height:1.9;flex-grow:1}.channels a,.channels a:hover{text-decoration:none}.channels img{vertical-align:middle;height:20px;width:20px;filter:invert(1);background-color:#d3c1af;padding:2px;margin-top:-2px;border-radius:3px}.channels .gitter img{background-color:#12e69a}.channels .julia img{background-color:#6aa74d}.channels .github img{background-color:#e7e8e8}.channels .linkedin img{background-color:#ff884a}.channels .youtube img{background-color:#0ff}.channels .x img{background-color:#fff}.channels .r img{background-color:#d8923c}.channels .pypi img{background-color:#c88a56}.channels .conda img{background-color:#bb57cc}.channels .npm img{background-color:#34c7c8}.channels .qgis img{background-color:#a769cd}iframe.stretch{width:100%;height:100%;border:0}.docgen section.action-bar{display:none}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.vue-component.loading-notice .loading:after{content:".";animation:dots 1.25s steps(5) infinite;font-size:1.5em;line-height:1em;font-weight:700}@keyframes dots{0%,20%{color:transparent;text-shadow:.25em 0 0 transparent,.5em 0 0 transparent}40%{color:#000;text-shadow:.25em 0 0 transparent,.5em 0 0 transparent}60%{text-shadow:.25em 0 0 #000,.5em 0 0 transparent}80%,to{text-shadow:.25em 0 0 #000,.5em 0 0 #000}}.vue-component.styled-description{line-height:1.25em}.vue-component.styled-description code{color:maroon;display:inline-block;padding:0 .1em}.vue-component.styled-description pre{background-color:#eee;width:100%;border:1px solid #ccc;max-height:15em;overflow-y:auto}.vue-component.styled-description pre code{background-color:transparent;display:block;margin:.5em}.vue-component.styled-description.compact pre{max-height:7em;width:auto;max-width:100%}.vue-component.styled-description.compact p{margin:.5em 0}.vue-component.styled-description.compact p:first-child{margin-top:0}.vue-component.styled-description.compact p:last-child{margin-bottom:0}.vue-component.process-example .content{border-left:5px solid #ccc;border-bottom:1px solid #ccc;padding:.5em;margin-left:3em;box-sizing:border-box}.vue-component.process-example .content .styled-description{margin-bottom:1em}.vue-component.process .namespace{font-weight:400;color:#aaa}.vue-component.process .process-bar{display:flex;align-items:baseline}.vue-component.process .process-bar .badges{margin-top:.75em}.vue-component.process .categories{flex:1}.vue-component.process .actions{text-align:right}.vue-component.process strong.deprecated{color:red}.vue-component.process strong.experimental{color:#8a2be2}.vue-component.process .exception{margin-top:.5em}.vue-component.process .exception code{font-weight:700}.vue-component.process .exception .styled-description{margin:.5em 0}.vue-component.process .exception .message{margin:.5em 0;font-size:.8em}.vue-component.process .signature{display:block;margin:1em 0}.vue-component.process .process-graph .graph{max-width:100%;height:300px;border:1px solid #ccc}.vue-component.process .process-graph .graph>.object-tree>ul{margin:0;padding:0}.vue-component.process .links:empty{display:none}.vue-component.searchable-list.expandable .heading{cursor:pointer;padding-left:1em}.vue-component.searchable-list.expandable .heading:before{content:"▸";margin-left:-1em;float:left;font-size:1em}.vue-component.searchable-list.expandable.expanded .heading:before{content:"▾"}.vue-component.searchable-list .action-bar{width:100%;display:flex;margin-bottom:1em;padding:1px;gap:.5em}.vue-component.searchable-list .action-bar:empty{display:none}.vue-component.searchable-list .action-bar>.search-box{min-width:150px;flex:1;margin:0}.vue-component.searchable-list .action-bar>.deprecated,.vue-component.searchable-list .action-bar>.experimental{white-space:nowrap;align-content:center}.vue-component.searchable-list .details{display:none}.vue-component.searchable-list .list .details h2,.vue-component.searchable-list .list .details h3,.vue-component.searchable-list .list .details h4,.vue-component.searchable-list .list .details h5,.vue-component.searchable-list .list .details h6{font-size:1em}.vue-component.searchable-list ul.list{margin-left:0;padding-left:0;list-style-type:none}.vue-component.searchable-list ul.list>li{margin-bottom:.5em}.vue-component.searchable-list ul.list>li>summary{margin-bottom:.5em;margin-left:1em;line-height:1.33em}.vue-component.searchable-list ul.list>li>summary strong{display:block;text-overflow:ellipsis;overflow:hidden}.vue-component.searchable-list ul.list>li>summary strong .copy{display:none}.vue-component.searchable-list ul.list>li>summary strong.inline{display:inline}.vue-component.searchable-list ul.list>li>summary.experimental strong{color:#8a2be2}.vue-component.searchable-list ul.list>li>summary.deprecated strong{text-decoration:line-through}.vue-component.searchable-list ul.list>li>summary:before{content:"▸";margin-left:-1em;float:left;font-size:1em}.vue-component.searchable-list ul.list>li>summary .badges.block{display:block}.vue-component.searchable-list ul.expandable>li>summary{cursor:pointer}.vue-component.searchable-list ul.expandable>li>summary:hover strong .copy{display:inline-block!important}.vue-component.searchable-list ul.expandable>li.expanded{margin-bottom:2em}.vue-component.searchable-list ul.expandable>li.expanded .details{display:block;margin-left:1em}.vue-component.searchable-list ul.expandable>li.expanded>summary:before{content:"▾"}.vue-component.searchable-list ul.expandable>li.expanded>summary .hideOnExpand{display:none}.vue-component.search-box{margin:0 1px 1em 0;display:flex;align-items:stretch}.vue-component.search-box .icon,.vue-component.search-box input{font-size:1em;margin:0}.vue-component.search-box input{flex-grow:1;padding:.3em .3em .3em 1.9em;z-index:1;border:1px solid #ccc;box-sizing:content-box;background-color:#fff;box-sizing:border-box;width:100%;margin-left:-1.3em}.vue-component.search-box .icon{display:flex;align-items:center;-webkit-user-select:none;user-select:none;margin-left:.3em;width:1em;z-index:2}.vue-component.search-box.compact{font-size:.9em;margin-bottom:0}.vue-component.search-box.compact input{padding-top:0;padding-bottom:0}.vue-component.search-box.compact .icon{margin-top:.1em;margin-left:.3em}.docgen{height:100%;font-family:Roboto Sans,sans-serif;margin:0;padding:0}.docgen code,.docgen pre .docgen kbd{font-family:Roboto Mono,Consolas,monospace}.docgen h2{font-size:1.75em;padding:.25em 0;margin:0 0 .75em;border-bottom:1px solid #ccc}.docgen h2 .copy{color:#856404;cursor:pointer}.docgen h2 .copy:hover{color:#000}.docgen h2 .copy.success{color:green;cursor:auto}.docgen h3{font-size:1.4em;margin:1.5em 0 .75em;padding:.25em 0;border-bottom:1px dotted #ccc}.docgen h4{margin:1.5em 0 .25em;font-size:1.2em}.docgen h5{margin:.5em 0 .25em;font-size:1.1em}.docgen h6{margin:.5em 0 .25em;font-size:1em}.docgen p{margin:0 0 .75em}.docgen td p{margin:.25em 0}.docgen li p{margin:0 0 .25em}.docgen a{color:#2f649a;text-decoration:none;cursor:pointer}.docgen a:hover{color:#000}.docgen .notice{margin:0 3rem 1rem 2rem;padding:1rem 3.5rem 1rem 1rem;border-radius:.25rem;position:fixed;bottom:0;color:#856404;background-color:#fff3cd;border:1px solid #856404}.docgen .notice p:last-of-type{margin-bottom:0}.docgen .notice .close{position:absolute;top:0;right:0;font-size:1.5em;padding:.5rem;margin:.5rem;font-weight:700;line-height:1;opacity:.5;background-color:transparent;border:0;color:inherit;cursor:pointer}.docgen .notice .close:hover{opacity:1;outline:0}.docgen .categories h2{display:block;text-transform:capitalize;font-size:1em;cursor:pointer;border:0;margin-top:0;margin-bottom:0}.docgen .categories ul.list{margin-left:.5em;margin-top:.25em}.docgen .categories ul.list li{margin-left:.5em}.docgen .categories .noResults{display:none}.docgen .process{margin:1em 1em 5em;padding:0}@media only screen and (min-width:1280px){.docgen .process{margin-bottom:10em}.docgen .process h3{margin-top:2em}}.docgen .no-processes-found{text-align:center;display:block}.docgen .fileChooser{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.docgen .fileChooser p{width:25%}.docgen .fileChooser input{margin-top:.5em;width:100%}.docgen .menu-container section{margin:1em}.docgen .menu-container ul{list-style-type:square;display:block;padding:0}.docgen .menu-container summary{margin-bottom:.5em}.docgen .menu-container .controls{text-align:center;display:block;margin:1em 0;padding:0;list-style-type:none}.docgen .menu-container .controls li{display:inline-block}.docgen .menu-container .controls li a{font-weight:400;background-color:#d2691e;color:#fff;display:inline-block;margin:.25em .35em;padding:.25em .5em;border-radius:3px}.docgen .menu-container .controls li a:hover{background-color:#000}.docgen .vue-component.searchable-list ul.list>li>summary{line-height:inherit}.docgen .menu-container li a{font-weight:700}.docgen .content-container.toc{padding-top:3em}.docgen .related-links{margin-top:4em;margin-bottom:2em}.docgen .filters{display:flex;justify-content:center;flex-flow:row wrap}.docgen .filters .label,.docgen .filters .show-deprecated,.docgen .filters .show-experimental{align-content:center;display:inline-block;white-space:nowrap;margin:.25rem;font-size:.9em;cursor:pointer}.docgen .filters .label{cursor:default}@media only screen and (min-width:800px){.docgen .related-links{margin-top:3em;margin-bottom:0}.docgen .page-container{display:flex;height:100%}.docgen .content-container,.docgen .menu-container{height:100%;overflow-y:scroll}.docgen .content-container.toc{flex:1;padding-top:0}.docgen .menu-container{flex:1;min-width:250px;max-width:25%;border-right:1px dotted #ccc}}@media only screen and (min-width:1280px){.docgen .menu-container{max-width:20%}}.vue-component.process-parameter .details{margin-left:3em}.vue-component.process-parameter .default{font-weight:400}.vue-component.process-parameter h4 code{font-size:1.15em}.vue-component .json-schema{border-left:5px solid #ccc;padding:.5em;box-sizing:border-box}.vue-component .json-schema.composite{border-left:0;padding-left:0}.vue-component .json-schema .schemaProcessGraph,.vue-component .json-schema td,.vue-component .json-schema th{padding:.5em}.vue-component .json-schema .schemaProcessGraph h4{font-size:1.1em;margin-top:1em}.vue-component .json-schema .data-type{font-weight:700}.vue-component .json-schema .data-types-container>.json-schema{border-left:7px solid #ccc;border-bottom:1px solid #ccc;margin-bottom:1em;margin-left:.25em}.vue-component .json-schema .inline-schema-attrs .json-schema{border:0;padding:0;width:100%;background-color:transparent}.vue-component .json-schema .schema-name{display:inline-block;border-bottom:1px dotted #000}.vue-component .json-schema .schema-attrs{width:100%;margin:-.25em}.vue-component .json-schema .schema-attrs .key{white-space:nowrap}.vue-component .json-schema .schema-attrs .value{width:90%}.vue-component .json-schema .schema-attrs>tr>td>.styled-description{margin-bottom:1em}.vue-component .json-schema p.schema-attrs{margin:1em 0 .5em}.vue-component .json-schema p.schema-attrs:first-of-type{margin:0 0 1em}.vue-component .json-schema .data-types-heading,.vue-component .json-schema .object-prop-heading{text-align:left}.vue-component .json-schema .object-properties>tr>.key{font-style:italic;font-weight:700;min-width:80px;width:8%;vertical-align:top;padding-top:.75em;padding-left:1em}.vue-component .json-schema .object-properties>tr>.value{border-bottom:1px dotted #ccc}.vue-component .json-schema .object-properties>tr:last-of-type>.value{border-bottom:0}.vue-component .json-schema .object-properties>th{padding-top:1em}.vue-component.deprecation-notice{background-color:rgba(255,0,0,.1);border:1px solid red}.vue-component.deprecation-notice strong{display:block;color:red}.vue-component.experimental-notice{background-color:rgba(138,43,226,.1);border:1px solid #8a2be2}.vue-component.experimental-notice strong{color:#8a2be2}.vue-component.model-builder .block .connector{font-size:.9em;margin:.2em 0;white-space:nowrap}.vue-component.model-builder .block .connector.noValue{color:red}.vue-component.model-builder .block .connector.editable .label,.vue-component.model-builder .block .connector.editable .value{cursor:pointer}.vue-component.model-builder .block .connector span[title]{cursor:help}.vue-component.model-builder .block .connector .input{max-width:100%;overflow:hidden;text-overflow:ellipsis}.vue-component.model-builder .block .connector .output{text-align:right}.vue-component.model-builder .block .connector .unspecified{color:red;margin-right:.3em}.vue-component.model-builder .block .connector .circle{width:.8em;height:.8em;margin:0 .2em;border:1px solid #888;background-color:transparent;display:inline-block}.vue-component.model-builder .block .connector .circle.io_active{background-color:#ffc800}.vue-component.model-builder .block .connector .circle.io_selected{background-color:#00c800!important}.vue-component.model-builder .block .connector .circle.io_issues{background-color:red}.vue-component.model-builder.editable .circle{cursor:pointer}.vue-component.model-builder .block{position:absolute;border:2px solid #ccc;margin-left:0;margin-top:0;background-color:#fafafa;opacity:.8;font-size:14px;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;color:#000}.vue-component.model-builder .block .description{display:none;width:200px;padding:3px;border:1px solid #083776;border-radius:5px;color:#001531;background-color:#91bcf6;margin-top:15px;position:absolute;font-weight:400}.vue-component.model-builder .block .blockTitle{display:flex;padding:.3em .1em;font-weight:700;background-color:#ddd;margin-bottom:.1em;cursor:move;font-size:.9em}.vue-component.model-builder .block .blockTitle .blockId{opacity:.4;margin-left:.25em;font-weight:400}.vue-component.model-builder .block .blockTitle .namespace{font-weight:400}.vue-component.model-builder .block .blockTitle .titleText{flex-grow:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vue-component.model-builder .block .blockTitle .blockicon{white-space:nowrap;text-align:center}.vue-component.model-builder .block .blockTitle .blockicon i.fas{min-width:1.4em;cursor:pointer;opacity:.5;margin-left:.1em}.vue-component.model-builder .block .blockTitle .blockicon i.fas:hover{opacity:1}.vue-component.model-builder .block .invalid{color:red;cursor:help}.vue-component.model-builder .block .inout{display:flex}.vue-component.model-builder .block .inputs{flex-grow:1;max-width:100%;overflow:hidden;text-overflow:ellipsis}.vue-component.model-builder .block .editDescription{padding:.3em .2em;box-sizing:border-box;font-size:.9em;line-height:1em;overflow:auto;border:0;border-top:1px dotted #ccc;background-color:transparent;width:100%;max-width:100%;height:3.7em;min-height:2.5em;resize:none}.vue-component.model-builder .block .editDescription:focus{outline:0}.vue-component.model-builder .block_collection{border:2px solid #6b8daf}.vue-component.model-builder .block_collection .blockTitle{background-color:#a3b7cc}.vue-component.model-builder .block_collection .field_id{display:none}.vue-component.model-builder .block_result{border:2px solid #888}.vue-component.model-builder .block_result .field_output .circle{background-color:#888;cursor:auto}.vue-component.model-builder .block_argument{border:2px solid #b28c6b}.vue-component.model-builder .block_argument .blockTitle{background-color:#ccb7a3}.vue-component.model-builder .block_selected{border:2px solid #0a0!important}.vue-component.model-builder .block_selected .blockTitle{background-color:#0c0!important}.vue-component.model-builder .block_invalid{border:2px solid red!important}.vue-component.model-builder{width:100%;height:100%;position:relative}.vue-component.model-builder.editable.focus .blocks{border-color:rgba(22,102,182,.3)}.vue-component.model-builder .blocks:focus,.vue-component.model-builder .canvas:focus,.vue-component.model-builder:focus{outline:0}.vue-component.model-builder .canvas{width:100%;height:100%;position:absolute;z-index:1}.vue-component.model-builder .blocks{box-sizing:border-box;border:1px solid transparent;overflow:hidden;position:absolute;z-index:3;width:100%;height:100%}.vue-component.model-builder.compact .blockicon .addDescription,.vue-component.model-builder.compact .blockicon .delete,.vue-component.model-builder.compact .blockicon .info,.vue-component.model-builder.compact .blockId,.vue-component.model-builder.compact .editDescription,.vue-component.model-builder.scale_s .blockicon,.vue-component.model-builder.scale_xs .blockicon,.vue-component.model-builder.scale_xs .connector .text{display:none}.vue-component.model-builder .zoomInfo{position:absolute;top:0;right:0;display:inline-block;padding:.3em;background-color:#f9f9f9;color:#000;border-radius:0 0 0 .3em;z-index:5}.vue-component.model-builder.scale_xs .editDescription{visibility:hidden}.vue-component.federation-backends{background-color:rgba(184,134,11,.1);border:1px solid #b8860b}.vue-component.federation-backends>.header{color:#b8860b}.vue-component.federation-backends{background-color:rgba(255,69,0,.1);border:1px solid #ff4500}.vue-component.federation-backends>.header{color:#ff4500}.vue-component.federation-backends .fed-title{font-weight:400}.vue-component.federation-backends .retry{float:right}.vue-component.parameter-viewer{position:absolute;width:100%;height:100%;z-index:10;overflow:auto;padding:1em;box-sizing:border-box;background-color:#fff;color:#000}.vue-component.parameter-viewer>section>.model-builder{height:400px}.vue-component.parameter-viewer>section{border-top:1px dotted grey;margin:1em 0}.vue-component.parameter-viewer>section>.description{display:flex;align-items:center;justify-content:center;margin-top:1em}.vue-component.parameter-viewer>section>.description>i.fas{margin-right:.5em;color:grey}.vue-component.parameter-viewer>section>.description>.styled-description{flex-grow:1;font-size:.9em;border-left:1px solid grey;padding-left:.5em;color:grey}.vue-component.parameter-viewer .close{position:absolute;top:1.1em;right:1em}.vue-component.parameter-viewer header h2{margin-top:0;font-size:1.2em}.vue-component.parameter-viewer h3{font-size:1.1em}.vue-component.parameter-viewer .highlight h3{color:red}.vue-component .highlight-box{box-shadow:0 0 0 .2em #c8e1ff}.vue-component code.id{color:maroon}.vue-component abbr{-webkit-text-decoration:underline dotted 1px;text-decoration:underline dotted 1px}.vue-component .unit{opacity:.6}.vue-component .status[data-value=submitted]{color:#000}.vue-component .status[data-value=running]{color:#ff8c00}.vue-component .status[data-value=queued]{color:#00008b}.vue-component .status[data-value=finished]{color:#006400}.vue-component .status[data-value=canceled]{color:#a9a9a9}.vue-component .status[data-value=error]{color:red}.vue-component.inline.process{margin-left:1em}.vue-component.inline h1{font-size:1.17em}.vue-component.inline h2{font-size:1.1em}.vue-component.inline h3{font-size:1.05em}.vue-component.inline h4,.vue-component.inline h5,.vue-component.inline h6{font-size:1em}.vue-component .comma-separated-list{display:inline;list-style:none;padding:0}.vue-component .comma-separated-list li{display:inline;padding:0}.vue-component .comma-separated-list li:after{content:", "}.vue-component .comma-separated-list li:last-child:after{content:""}.vue-component .required{color:red;font-weight:700}.vue-component.message-block{margin:1em 0;padding:.5em}.vue-component.message-block>strong{display:block;margin-bottom:.5em}.vue-component.message-block>p{margin:0}.vue-component .param-name,.vue-component .process-name{color:#369}.vue-component .param-argument,.vue-component .return-value{color:#936}.vue-component .data-type{color:#693}.vue-component .param-optional{font-weight:700}.vue-component .badges{margin:0;padding:0;list-style-type:none;display:inline-block}.vue-component .badges .badge{display:inline-block;font-size:.8em;margin:.25em;padding:.35em .5em .25em;line-height:1em;text-align:center;white-space:nowrap;text-transform:uppercase;vertical-align:baseline;border-radius:.5em;color:#fff;background-color:#6c757d}.vue-component .badges:not(.inline){margin-left:-.25em;margin-right:-.25em}.vue-component .badges.small .badge{padding:.25em .35em .2em;font-size:.75em}.vue-component .badges.inline{margin-left:.5em;border-radius:.25em}.vue-component .badges.inline .badge{margin-top:0;margin-bottom:0}.vue-component .badges .badge a{color:#fff;border-bottom:1px dotted #fff;text-decoration:none}.vue-component .badges .badge a.badge-fill{margin:-.35em -.5em;padding:.35em .5em;display:block;border-bottom:0}.vue-component .badges.small .badge a.badge-fill{margin:-.2em -.3em;padding:.25em .35em}.vue-component .badges .badge a:hover{color:#fff;border-bottom-style:solid}.vue-component .badges .default{background-color:#555}.vue-component .badges .green{background-color:green}.vue-component .badges .red{background-color:maroon}.vue-component .badges .option1{background-color:#369}.vue-component .badges .option2{background-color:#693}.vue-component .badges .option3{background-color:#936}.vue-component .badges .option4{background-color:#963}.vue-component .badges .deprecated{background-color:red}.vue-component .badges .experimental{background-color:#8a2be2}.vue-component .badges .action{border:1px solid #000;background-color:#fff;color:#000;margin:.33em;cursor:pointer;text-transform:none}.vue-component .badges .action:hover{background-color:#000;color:#fff}.vue-component .badges .action:hover>a{color:#fff}.vue-component .badges .action>a{color:#000}.vue-component .badges .docker{background-color:#0db7ed}.vue-component .tabular{display:flex;margin:.2em 0;padding:1px}.vue-component .tabular label{flex:1;font-weight:700}.vue-component .tabular .value{flex:3}.vue-component .tabular .value>.formatted>ul,.vue-component .tabular .value>ul,.vue-component .tabular .value td>div,.vue-component .tabular ul.value{max-height:15em;overflow:auto}.vue-component .tabular .value pre{margin:0}.vue-component.stac .map{background:transparent;height:350px}.vue-component.stac .tabular{margin:.5em 0}.vue-component.stac .tabular.wrap{display:block}.vue-component.stac .tabular.wrap .value{margin-top:.5em;margin-left:1em;margin-bottom:.5em}.vue-component.stac .tabular .value ul{padding-left:20px}.assets.empty,.vue-component.stac .links:empty{display:none}.vue-component.stac .thumbnails{overflow-x:auto;overflow-y:hidden;width:100%;white-space:nowrap}.vue-component.stac .thumbnails a{margin:5px;display:inline-block}.vue-component.stac .thumbnails a img{padding:2px;max-height:200px;vertical-align:middle;border:2px solid transparent}.vue-component.stac .thumbnails a:hover img{border:2px solid rgba(0,0,0,.5)}.vue-component .federation>ul>li{margin-bottom:.5em}.vue-component .federation>ul>li>small{display:block}.vue-component .federation>ul>li>h4{margin:0}.vue-component .federation .fed-header{margin:.2em 0}.vue-component .federation .fed-header>.fed-title{display:inline-block;vertical-align:bottom}.vue-component.object-tree .inline{display:inline-block}.vue-component.object-tree ol{padding-left:2em;margin-bottom:.5em}.vue-component.object-tree ol>li:only-child{list-style-type:none;margin-left:-2em}.vue-component.object-tree ol>li>div>ul{padding-left:0}.vue-component.object-tree ul{padding-left:1em}.vue-component.object-tree ul>li{list-style-type:none}.vue-component.object-tree li{margin-bottom:.25em}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#267cb9}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #267cb9;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:1024px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{font-weight:600;font-size:inherit}.dropdown-wrapper .dropdown-title:hover{color:#267cb9}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:1024px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#267cb9}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}@media (min-width:1024px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #2a89cc}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:1024px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:1280px){.page-edit{padding:2rem}}@media (max-width:500px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto;font-size:.9em}.page-edit .edit-link{display:inline-block;margin-right:1rem}.page-edit .edit-link a{color:#4e6e8e}.page-edit .last-updated{display:inline-block}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-edit .license{margin-top:.5em}@media (max-width:1024px){.page-edit{font-size:.8em}.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:1280px){.page-nav{padding:2rem}}@media (max-width:500px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#267cb9;border-left-color:#267cb9}.sidebar-heading.clickable:hover{color:#267cb9}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#267cb9}a.sidebar-link.active{font-weight:600;color:#267cb9;border-left-color:#267cb9}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:1024px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}@media (min-width:1024px){#docVersionChooser{display:inline-block;z-index:10;position:fixed;top:4.6rem;right:2rem;border-radius:.5em;border:1px solid #eaecef;background-color:#fff;font-size:.9rem}#docVersionChooser button{margin:.3rem .6rem}}@media (max-width:1024px){#docVersionChooser .dropdown-wrapper .dropdown-title:hover{color:#2c3e50}}#docVersionChooser a{color:#2c3e50}#docVersionChooser a:hover{color:#267cb9}.news-meta{margin-bottom:2em;display:block}.fullpage{width:100%;padding-top:3.6rem;height:calc(100vh - 3.6rem);border:0} \ No newline at end of file diff --git a/assets/css/0.styles.4710ed67.css b/assets/css/0.styles.4710ed67.css deleted file mode 100644 index 8c2ccb44b..000000000 --- a/assets/css/0.styles.4710ed67.css +++ /dev/null @@ -1 +0,0 @@ -svg[data-v-49140617]{position:absolute;right:7.5px;opacity:.75;cursor:pointer}svg.hover[data-v-49140617]{opacity:0}svg[data-v-49140617]:hover{opacity:1!important}span[data-v-49140617]{position:absolute;font-size:.85rem;line-height:.425rem;right:50px;opacity:0;transition:opacity .5s}.success[data-v-49140617]{opacity:1!important}.code-copy-added:hover>.code-copy svg{opacity:.75}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#267cb9}.code-copy{position:absolute;bottom:0;right:0;z-index:3}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:1280px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:500px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}a{font-weight:500;color:#267cb9}a,a:hover{text-decoration:none}a:hover{color:#8a684f}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.sidebar .nav-links .nav-item{padding-left:0!important}.sidebar-heading{font-weight:600!important}.dropdown-wrapper{cursor:inherit!important}.dropdown-wrapper a,.dropdown-wrapper button{cursor:pointer}.dropdown-wrapper .nav-dropdown .dropdown-item em,.dropdown-wrapper .nav-dropdown .dropdown-item span{padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-subitem-wrapper .dropdown-subitem a,.dropdown-wrapper .nav-dropdown .dropdown-subitem-wrapper .dropdown-subitem em,.dropdown-wrapper .nav-dropdown .dropdown-subitem-wrapper .dropdown-subitem span{padding-left:2.2rem}.fullpage-content,.theme-default-content{height:100%}.fullpage-content img,.theme-default-content img{max-width:100%}.fullpage-content figure,.theme-default-content figure{max-width:130%;margin:0 -15%;text-align:center}.fullpage-content figcaption,.theme-default-content figcaption{margin:0 11.53%;font-style:italic;display:inline-block;text-align:left}.fullpage-content figcaption:before,.theme-default-content figcaption:before{content:"Figure: ";font-weight:700}@media (min-width:1600px){.fullpage-content img,.theme-default-content img{max-height:90%}.fullpage-content figure,.theme-default-content figure{max-width:150%;margin:0 -25%}.fullpage-content figcaption,.theme-default-content figcaption{margin:0 16.66%}}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content.custom{padding:0;margin:0}.page{padding-left:20rem;padding-bottom:0}.page p a code{font-weight:400;color:#267cb9}.page kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}.page blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}.page>p{margin:0}.page ol,.page ul{padding-left:1.2em}.page strong{font-weight:600}.page h1,.page h2,.page h3,.page h4,.page h5,.page h6{font-weight:600;line-height:1.25}.page h2,.page h3,.page h4{margin-top:-3.6rem;padding-top:3.6rem}.theme-default-content:not(.custom)>.page{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>.page+.custom-block,.theme-default-content:not(.custom)>.page+p,.theme-default-content:not(.custom)>.page+pre,.theme-default-content:not(.custom)>.page:first-child,.theme-default-content:not(.custom)>.page margin-bottom 1rem,.theme-default-content:not(.custom)>.page margin-top -1.5rem{margin-top:2rem}.page:hover .header-anchor{opacity:1}.page h1{font-size:2.2rem}.page h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}.page h3{font-size:1.35rem}.page .line-number,.page code,.page kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.page ol,.page p,.page ul{line-height:1.7}.page hr{border:0;border-top:1px solid #eaecef}.page table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}.page tr{border-top:1px solid #dfe2e5}.page tr:nth-child(2n){background-color:#f6f8fa}.page td,.page th{border:1px solid #dfe2e5;padding:.6em 1em}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:1025px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}.vue-component.search-box .icon{display:none}@media (max-width:1366px){.navbar .site-name{display:none}.fullpage-content figure,.theme-default-content figure{margin:0;max-width:100%}.fullpage-content figcaption,.theme-default-content figcaption{margin:0}}@media (max-width:1280px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}.navbar .nav-links .nav-item:first-of-type{display:none}}@media (max-width:1024px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}.navbar .site-name.can-hide{display:inline-block;width:auto}.nav-links .nav-item:first-child{margin-left:1.5rem!important}}@media (max-width:500px){.page h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}@media (max-width:300px){.navbar .site-name.can-hide{display:none}}#nprogress{pointer-events:none}#nprogress .bar{background:#267cb9;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #267cb9,0 0 5px #267cb9;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#267cb9 transparent transparent #267cb9;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.code-switcher div[class*=language-]:before{content:""}.code-switcher .tab-header ul{padding:0;text-align:right;margin-bottom:-5px;margin-top:20px}.code-switcher .tab-header li{display:inline-block;padding:0 10px;cursor:pointer;border-radius:4px;border:2px solid #eaecef;margin-left:5px;font-size:80%}.code-switcher .tab-header li.active{border-color:#267cb9}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding-top:3.6rem;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:179px;display:block;margin:1.5rem auto}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:42rem;font-size:1.4rem;line-height:1.3;color:#6a8bad}.home .hero .description.small{font-size:1.1rem}.home .hero .description a{text-decoration:underline}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#267cb9;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #2270a6}.home .hero .action-button:hover{background-color:#2b8cd1}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:49%;max-width:49%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}@media (max-width:1024px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:500px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#267cb9;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c3e50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c3e50}@media (min-width:1024px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:1024px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#267cb9}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#267cb9}@media (max-width:1280px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:1280px) and (min-width:1024px){.search-box .suggestions{left:0}}@media (max-width:1024px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:500px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:1024px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.badge[data-v-385f24c3]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;background-color:#42b983}.badge.green[data-v-385f24c3],.badge.tip[data-v-385f24c3]{background-color:#267cb9}.badge.error[data-v-385f24c3]{background-color:#da5961}.badge.warn[data-v-385f24c3],.badge.warning[data-v-385f24c3],.badge.yellow[data-v-385f24c3]{background-color:#e7c000}.badge+.badge[data-v-385f24c3]{margin-left:5px}.channels{display:flex}.channels ul{margin:0 1em 0 0;padding:0;list-style-type:none;line-height:1.9;flex-grow:1}.channels a,.channels a:hover{text-decoration:none}.channels img{vertical-align:middle;height:20px;width:20px;filter:invert(1);background-color:#d3c1af;padding:2px;margin-top:-2px;border-radius:3px}.channels .gitter img{background-color:#12e69a}.channels .julia img{background-color:#6aa74d}.channels .github img{background-color:#e7e8e8}.channels .linkedin img{background-color:#ff884a}.channels .youtube img{background-color:#0ff}.channels .x img{background-color:#fff}.channels .r img{background-color:#d8923c}.channels .pypi img{background-color:#c88a56}.channels .conda img{background-color:#bb57cc}.channels .npm img{background-color:#34c7c8}.channels .qgis img{background-color:#a769cd}iframe.stretch{width:100%;height:100%;border:0}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.vue-component.loading-notice .loading:after{content:".";animation:dots 1.25s steps(5) infinite;font-size:1.5em;line-height:1em;font-weight:700}@keyframes dots{0%,20%{color:transparent;text-shadow:.25em 0 0 transparent,.5em 0 0 transparent}40%{color:#000;text-shadow:.25em 0 0 transparent,.5em 0 0 transparent}60%{text-shadow:.25em 0 0 #000,.5em 0 0 transparent}80%,to{text-shadow:.25em 0 0 #000,.5em 0 0 #000}}.vue-component.styled-description{line-height:1.25em}.vue-component.styled-description code{color:maroon;display:inline-block;padding:0 .1em}.vue-component.styled-description pre{background-color:#eee;width:100%;border:1px solid #ccc;max-height:15em;overflow-y:auto}.vue-component.styled-description pre code{background-color:transparent;display:block;margin:.5em}.vue-component.styled-description.compact pre{max-height:7em;width:auto;max-width:100%}.vue-component.styled-description.compact p{margin:.5em 0}.vue-component.styled-description.compact p:first-child{margin-top:0}.vue-component.styled-description.compact p:last-child{margin-bottom:0}.vue-component.process-example .content{border-left:5px solid #ccc;border-bottom:1px solid #ccc;padding:.5em;margin-left:3em;box-sizing:border-box}.vue-component.process-example .content .styled-description{margin-bottom:1em}.vue-component.process .namespace{font-weight:400;color:#aaa}.vue-component.process .process-bar{display:flex;align-items:baseline}.vue-component.process .process-bar .badges{margin-top:.75em}.vue-component.process .categories{flex:1}.vue-component.process .actions{text-align:right}.vue-component.process strong.deprecated{color:red}.vue-component.process strong.experimental{color:#8a2be2}.vue-component.process .exception{margin-top:.5em}.vue-component.process .exception code{font-weight:700}.vue-component.process .exception .styled-description{margin:.5em 0}.vue-component.process .exception .message{margin:.5em 0;font-size:.8em}.vue-component.process .signature{display:block;margin:1em 0}.vue-component.process .process-graph .graph{max-width:100%;height:300px;border:1px solid #ccc}.vue-component.process .process-graph .graph>.object-tree>ul{margin:0;padding:0}.vue-component.process .links:empty{display:none}.vue-component.searchable-list.expandable .heading{cursor:pointer;padding-left:1em}.vue-component.searchable-list.expandable .heading:before{content:"▸";margin-left:-1em;float:left;font-size:1em}.vue-component.searchable-list.expandable.expanded .heading:before{content:"▾"}.vue-component.searchable-list .action-bar{width:100%;display:flex;margin-bottom:1em;padding:1px;gap:.5em}.vue-component.searchable-list .action-bar:empty{display:none}.vue-component.searchable-list .action-bar>.search-box{min-width:150px;flex:1;margin:0}.vue-component.searchable-list .action-bar>.deprecated,.vue-component.searchable-list .action-bar>.experimental{white-space:nowrap;align-content:center}.vue-component.searchable-list .details{display:none}.vue-component.searchable-list .list .details h2,.vue-component.searchable-list .list .details h3,.vue-component.searchable-list .list .details h4,.vue-component.searchable-list .list .details h5,.vue-component.searchable-list .list .details h6{font-size:1em}.vue-component.searchable-list ul.list{margin-left:0;padding-left:0;list-style-type:none}.vue-component.searchable-list ul.list>li{margin-bottom:.5em}.vue-component.searchable-list ul.list>li>summary{margin-bottom:.5em;margin-left:1em;line-height:1.33em}.vue-component.searchable-list ul.list>li>summary strong{display:block;text-overflow:ellipsis;overflow:hidden}.vue-component.searchable-list ul.list>li>summary strong .copy{display:none}.vue-component.searchable-list ul.list>li>summary strong.inline{display:inline}.vue-component.searchable-list ul.list>li>summary.experimental strong{color:#8a2be2}.vue-component.searchable-list ul.list>li>summary.deprecated strong{text-decoration:line-through}.vue-component.searchable-list ul.list>li>summary:before{content:"▸";margin-left:-1em;float:left;font-size:1em}.vue-component.searchable-list ul.list>li>summary .badges.block{display:block}.vue-component.searchable-list ul.expandable>li>summary{cursor:pointer}.vue-component.searchable-list ul.expandable>li>summary:hover strong .copy{display:inline-block!important}.vue-component.searchable-list ul.expandable>li.expanded{margin-bottom:2em}.vue-component.searchable-list ul.expandable>li.expanded .details{display:block;margin-left:1em}.vue-component.searchable-list ul.expandable>li.expanded>summary:before{content:"▾"}.vue-component.searchable-list ul.expandable>li.expanded>summary .hideOnExpand{display:none}.vue-component.search-box{margin:0 1px 1em 0;display:flex;align-items:stretch}.vue-component.search-box .icon,.vue-component.search-box input{font-size:1em;margin:0}.vue-component.search-box input{flex-grow:1;padding:.3em .3em .3em 1.9em;z-index:1;border:1px solid #ccc;box-sizing:content-box;background-color:#fff;box-sizing:border-box;width:100%;margin-left:-1.3em}.vue-component.search-box .icon{display:flex;align-items:center;-webkit-user-select:none;user-select:none;margin-left:.3em;width:1em;z-index:2}.vue-component.search-box.compact{font-size:.9em;margin-bottom:0}.vue-component.search-box.compact input{padding-top:0;padding-bottom:0}.vue-component.search-box.compact .icon{margin-top:.1em;margin-left:.3em}.docgen{height:100%;font-family:Roboto Sans,sans-serif;margin:0;padding:0}.docgen code,.docgen pre .docgen kbd{font-family:Roboto Mono,Consolas,monospace}.docgen h2{font-size:1.75em;padding:.25em 0;margin:0 0 .75em;border-bottom:1px solid #ccc}.docgen h2 .copy{color:#856404;cursor:pointer}.docgen h2 .copy:hover{color:#000}.docgen h2 .copy.success{color:green;cursor:auto}.docgen h3{font-size:1.4em;margin:1.5em 0 .75em;padding:.25em 0;border-bottom:1px dotted #ccc}.docgen h4{margin:1.5em 0 .25em;font-size:1.2em}.docgen h5{margin:.5em 0 .25em;font-size:1.1em}.docgen h6{margin:.5em 0 .25em;font-size:1em}.docgen p{margin:0 0 .75em}.docgen td p{margin:.25em 0}.docgen li p{margin:0 0 .25em}.docgen a{color:#2f649a;text-decoration:none;cursor:pointer}.docgen a:hover{color:#000}.docgen .notice{margin:0 3rem 1rem 2rem;padding:1rem 3.5rem 1rem 1rem;border-radius:.25rem;position:fixed;bottom:0;color:#856404;background-color:#fff3cd;border:1px solid #856404}.docgen .notice p:last-of-type{margin-bottom:0}.docgen .notice .close{position:absolute;top:0;right:0;font-size:1.5em;padding:.5rem;margin:.5rem;font-weight:700;line-height:1;opacity:.5;background-color:transparent;border:0;color:inherit;cursor:pointer}.docgen .notice .close:hover{opacity:1;outline:0}.docgen .categories h2{display:block;text-transform:capitalize;font-size:1em;cursor:pointer;border:0;margin-top:0;margin-bottom:0}.docgen .categories ul.list{margin-left:.5em;margin-top:.25em}.docgen .categories ul.list li{margin-left:.5em}.docgen .categories .noResults{display:none}.docgen .process{margin:1em 1em 5em;padding:0}@media only screen and (min-width:1280px){.docgen .process{margin-bottom:10em}.docgen .process h3{margin-top:2em}}.docgen .no-processes-found{text-align:center;display:block}.docgen .fileChooser{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.docgen .fileChooser p{width:25%}.docgen .fileChooser input{margin-top:.5em;width:100%}.docgen .menu-container section{margin:1em}.docgen .menu-container ul{list-style-type:square;display:block;padding:0}.docgen .menu-container summary{margin-bottom:.5em}.docgen .menu-container .controls{text-align:center;display:block;margin:1em 0;padding:0;list-style-type:none}.docgen .menu-container .controls li{display:inline-block}.docgen .menu-container .controls li a{font-weight:400;background-color:#d2691e;color:#fff;display:inline-block;margin:.25em .35em;padding:.25em .5em;border-radius:3px}.docgen .menu-container .controls li a:hover{background-color:#000}.docgen .vue-component.searchable-list ul.list>li>summary{line-height:inherit}.docgen .menu-container li a{font-weight:700}.docgen .content-container.toc{padding-top:3em}.docgen .related-links{margin-top:4em;margin-bottom:2em}.docgen .filters{display:flex;justify-content:center;flex-flow:row wrap}.docgen .filters .label,.docgen .filters .show-deprecated,.docgen .filters .show-experimental{align-content:center;display:inline-block;white-space:nowrap;margin:.25rem;font-size:.9em;cursor:pointer}.docgen .filters .label{cursor:default}@media only screen and (min-width:800px){.docgen .related-links{margin-top:3em;margin-bottom:0}.docgen .page-container{display:flex;height:100%}.docgen .content-container,.docgen .menu-container{height:100%;overflow-y:scroll}.docgen .content-container.toc{flex:1;padding-top:0}.docgen .menu-container{flex:1;min-width:250px;max-width:25%;border-right:1px dotted #ccc}}@media only screen and (min-width:1280px){.docgen .menu-container{max-width:20%}}.vue-component.process-parameter .details{margin-left:3em}.vue-component.process-parameter .default{font-weight:400}.vue-component.process-parameter h4 code{font-size:1.15em}.vue-component .json-schema{border-left:5px solid #ccc;padding:.5em;box-sizing:border-box}.vue-component .json-schema.composite{border-left:0;padding-left:0}.vue-component .json-schema .schemaProcessGraph,.vue-component .json-schema td,.vue-component .json-schema th{padding:.5em}.vue-component .json-schema .schemaProcessGraph h4{font-size:1.1em;margin-top:1em}.vue-component .json-schema .data-type{font-weight:700}.vue-component .json-schema .data-types-container>.json-schema{border-left:7px solid #ccc;border-bottom:1px solid #ccc;margin-bottom:1em;margin-left:.25em}.vue-component .json-schema .inline-schema-attrs .json-schema{border:0;padding:0;width:100%;background-color:transparent}.vue-component .json-schema .schema-name{display:inline-block;border-bottom:1px dotted #000}.vue-component .json-schema .schema-attrs{width:100%;margin:-.25em}.vue-component .json-schema .schema-attrs .key{white-space:nowrap}.vue-component .json-schema .schema-attrs .value{width:90%}.vue-component .json-schema .schema-attrs>tr>td>.styled-description{margin-bottom:1em}.vue-component .json-schema p.schema-attrs{margin:1em 0 .5em}.vue-component .json-schema p.schema-attrs:first-of-type{margin:0 0 1em}.vue-component .json-schema .data-types-heading,.vue-component .json-schema .object-prop-heading{text-align:left}.vue-component .json-schema .object-properties>tr>.key{font-style:italic;font-weight:700;min-width:80px;width:8%;vertical-align:top;padding-top:.75em;padding-left:1em}.vue-component .json-schema .object-properties>tr>.value{border-bottom:1px dotted #ccc}.vue-component .json-schema .object-properties>tr:last-of-type>.value{border-bottom:0}.vue-component .json-schema .object-properties>th{padding-top:1em}.vue-component.deprecation-notice{background-color:rgba(255,0,0,.1);border:1px solid red}.vue-component.deprecation-notice strong{display:block;color:red}.vue-component.experimental-notice{background-color:rgba(138,43,226,.1);border:1px solid #8a2be2}.vue-component.experimental-notice strong{color:#8a2be2}.vue-component.model-builder .block .connector{font-size:.9em;margin:.2em 0;white-space:nowrap}.vue-component.model-builder .block .connector.noValue{color:red}.vue-component.model-builder .block .connector.editable .label,.vue-component.model-builder .block .connector.editable .value{cursor:pointer}.vue-component.model-builder .block .connector span[title]{cursor:help}.vue-component.model-builder .block .connector .input{max-width:100%;overflow:hidden;text-overflow:ellipsis}.vue-component.model-builder .block .connector .output{text-align:right}.vue-component.model-builder .block .connector .unspecified{color:red;margin-right:.3em}.vue-component.model-builder .block .connector .circle{width:.8em;height:.8em;margin:0 .2em;border:1px solid #888;background-color:transparent;display:inline-block}.vue-component.model-builder .block .connector .circle.io_active{background-color:#ffc800}.vue-component.model-builder .block .connector .circle.io_selected{background-color:#00c800!important}.vue-component.model-builder .block .connector .circle.io_issues{background-color:red}.vue-component.model-builder.editable .circle{cursor:pointer}.vue-component.model-builder .block{position:absolute;border:2px solid #ccc;margin-left:0;margin-top:0;background-color:#fafafa;opacity:.8;font-size:14px;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;color:#000}.vue-component.model-builder .block .description{display:none;width:200px;padding:3px;border:1px solid #083776;border-radius:5px;color:#001531;background-color:#91bcf6;margin-top:15px;position:absolute;font-weight:400}.vue-component.model-builder .block .blockTitle{display:flex;padding:.3em .1em;font-weight:700;background-color:#ddd;margin-bottom:.1em;cursor:move;font-size:.9em}.vue-component.model-builder .block .blockTitle .blockId{opacity:.4;margin-left:.25em;font-weight:400}.vue-component.model-builder .block .blockTitle .namespace{font-weight:400}.vue-component.model-builder .block .blockTitle .titleText{flex-grow:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vue-component.model-builder .block .blockTitle .blockicon{white-space:nowrap;text-align:center}.vue-component.model-builder .block .blockTitle .blockicon i.fas{min-width:1.4em;cursor:pointer;opacity:.5;margin-left:.1em}.vue-component.model-builder .block .blockTitle .blockicon i.fas:hover{opacity:1}.vue-component.model-builder .block .invalid{color:red;cursor:help}.vue-component.model-builder .block .inout{display:flex}.vue-component.model-builder .block .inputs{flex-grow:1;max-width:100%;overflow:hidden;text-overflow:ellipsis}.vue-component.model-builder .block .editDescription{padding:.3em .2em;box-sizing:border-box;font-size:.9em;line-height:1em;overflow:auto;border:0;border-top:1px dotted #ccc;background-color:transparent;width:100%;max-width:100%;height:3.7em;min-height:2.5em;resize:none}.vue-component.model-builder .block .editDescription:focus{outline:0}.vue-component.model-builder .block_collection{border:2px solid #6b8daf}.vue-component.model-builder .block_collection .blockTitle{background-color:#a3b7cc}.vue-component.model-builder .block_collection .field_id{display:none}.vue-component.model-builder .block_result{border:2px solid #888}.vue-component.model-builder .block_result .field_output .circle{background-color:#888;cursor:auto}.vue-component.model-builder .block_argument{border:2px solid #b28c6b}.vue-component.model-builder .block_argument .blockTitle{background-color:#ccb7a3}.vue-component.model-builder .block_selected{border:2px solid #0a0!important}.vue-component.model-builder .block_selected .blockTitle{background-color:#0c0!important}.vue-component.model-builder .block_invalid{border:2px solid red!important}.vue-component.model-builder{width:100%;height:100%;position:relative}.vue-component.model-builder.editable.focus .blocks{border-color:rgba(22,102,182,.3)}.vue-component.model-builder .blocks:focus,.vue-component.model-builder .canvas:focus,.vue-component.model-builder:focus{outline:0}.vue-component.model-builder .canvas{width:100%;height:100%;position:absolute;z-index:1}.vue-component.model-builder .blocks{box-sizing:border-box;border:1px solid transparent;overflow:hidden;position:absolute;z-index:3;width:100%;height:100%}.vue-component.model-builder.compact .blockicon .addDescription,.vue-component.model-builder.compact .blockicon .delete,.vue-component.model-builder.compact .blockicon .info,.vue-component.model-builder.compact .blockId,.vue-component.model-builder.compact .editDescription,.vue-component.model-builder.scale_s .blockicon,.vue-component.model-builder.scale_xs .blockicon,.vue-component.model-builder.scale_xs .connector .text{display:none}.vue-component.model-builder .zoomInfo{position:absolute;top:0;right:0;display:inline-block;padding:.3em;background-color:#f9f9f9;color:#000;border-radius:0 0 0 .3em;z-index:5}.vue-component.model-builder.scale_xs .editDescription{visibility:hidden}.vue-component.federation-backends{background-color:rgba(184,134,11,.1);border:1px solid #b8860b}.vue-component.federation-backends>.header{color:#b8860b}.vue-component.federation-backends{background-color:rgba(255,69,0,.1);border:1px solid #ff4500}.vue-component.federation-backends>.header{color:#ff4500}.vue-component.federation-backends .fed-title{font-weight:400}.vue-component.federation-backends .retry{float:right}.vue-component.parameter-viewer{position:absolute;width:100%;height:100%;z-index:10;overflow:auto;padding:1em;box-sizing:border-box;background-color:#fff;color:#000}.vue-component.parameter-viewer>section>.model-builder{height:400px}.vue-component.parameter-viewer>section{border-top:1px dotted grey;margin:1em 0}.vue-component.parameter-viewer>section>.description{display:flex;align-items:center;justify-content:center;margin-top:1em}.vue-component.parameter-viewer>section>.description>i.fas{margin-right:.5em;color:grey}.vue-component.parameter-viewer>section>.description>.styled-description{flex-grow:1;font-size:.9em;border-left:1px solid grey;padding-left:.5em;color:grey}.vue-component.parameter-viewer .close{position:absolute;top:1.1em;right:1em}.vue-component.parameter-viewer header h2{margin-top:0;font-size:1.2em}.vue-component.parameter-viewer h3{font-size:1.1em}.vue-component.parameter-viewer .highlight h3{color:red}.vue-component .highlight-box{box-shadow:0 0 0 .2em #c8e1ff}.vue-component code.id{color:maroon}.vue-component abbr{-webkit-text-decoration:underline dotted 1px;text-decoration:underline dotted 1px}.vue-component .unit{opacity:.6}.vue-component .status[data-value=submitted]{color:#000}.vue-component .status[data-value=running]{color:#ff8c00}.vue-component .status[data-value=queued]{color:#00008b}.vue-component .status[data-value=finished]{color:#006400}.vue-component .status[data-value=canceled]{color:#a9a9a9}.vue-component .status[data-value=error]{color:red}.vue-component.inline.process{margin-left:1em}.vue-component.inline h1{font-size:1.17em}.vue-component.inline h2{font-size:1.1em}.vue-component.inline h3{font-size:1.05em}.vue-component.inline h4,.vue-component.inline h5,.vue-component.inline h6{font-size:1em}.vue-component .comma-separated-list{display:inline;list-style:none;padding:0}.vue-component .comma-separated-list li{display:inline;padding:0}.vue-component .comma-separated-list li:after{content:", "}.vue-component .comma-separated-list li:last-child:after{content:""}.vue-component .required{color:red;font-weight:700}.vue-component.message-block{margin:1em 0;padding:.5em}.vue-component.message-block>strong{display:block;margin-bottom:.5em}.vue-component.message-block>p{margin:0}.vue-component .param-name,.vue-component .process-name{color:#369}.vue-component .param-argument,.vue-component .return-value{color:#936}.vue-component .data-type{color:#693}.vue-component .param-optional{font-weight:700}.vue-component .badges{margin:0;padding:0;list-style-type:none;display:inline-block}.vue-component .badges .badge{display:inline-block;font-size:.8em;margin:.25em;padding:.35em .5em .25em;line-height:1em;text-align:center;white-space:nowrap;text-transform:uppercase;vertical-align:baseline;border-radius:.5em;color:#fff;background-color:#6c757d}.vue-component .badges:not(.inline){margin-left:-.25em;margin-right:-.25em}.vue-component .badges.small .badge{padding:.25em .35em .2em;font-size:.75em}.vue-component .badges.inline{margin-left:.5em;border-radius:.25em}.vue-component .badges.inline .badge{margin-top:0;margin-bottom:0}.vue-component .badges .badge a{color:#fff;border-bottom:1px dotted #fff;text-decoration:none}.vue-component .badges .badge a.badge-fill{margin:-.35em -.5em;padding:.35em .5em;display:block;border-bottom:0}.vue-component .badges.small .badge a.badge-fill{margin:-.2em -.3em;padding:.25em .35em}.vue-component .badges .badge a:hover{color:#fff;border-bottom-style:solid}.vue-component .badges .default{background-color:#555}.vue-component .badges .green{background-color:green}.vue-component .badges .red{background-color:maroon}.vue-component .badges .option1{background-color:#369}.vue-component .badges .option2{background-color:#693}.vue-component .badges .option3{background-color:#936}.vue-component .badges .option4{background-color:#963}.vue-component .badges .deprecated{background-color:red}.vue-component .badges .experimental{background-color:#8a2be2}.vue-component .badges .action{border:1px solid #000;background-color:#fff;color:#000;margin:.33em;cursor:pointer;text-transform:none}.vue-component .badges .action:hover{background-color:#000;color:#fff}.vue-component .badges .action:hover>a{color:#fff}.vue-component .badges .action>a{color:#000}.vue-component .badges .docker{background-color:#0db7ed}.vue-component .tabular{display:flex;margin:.2em 0;padding:1px}.vue-component .tabular label{flex:1;font-weight:700}.vue-component .tabular .value{flex:3}.vue-component .tabular .value>.formatted>ul,.vue-component .tabular .value>ul,.vue-component .tabular .value td>div,.vue-component .tabular ul.value{max-height:15em;overflow:auto}.vue-component .tabular .value pre{margin:0}.vue-component.stac .map{background:transparent;height:350px}.vue-component.stac .tabular{margin:.5em 0}.vue-component.stac .tabular.wrap{display:block}.vue-component.stac .tabular.wrap .value{margin-top:.5em;margin-left:1em;margin-bottom:.5em}.vue-component.stac .tabular .value ul{padding-left:20px}.assets.empty,.vue-component.stac .links:empty{display:none}.vue-component.stac .thumbnails{overflow-x:auto;overflow-y:hidden;width:100%;white-space:nowrap}.vue-component.stac .thumbnails a{margin:5px;display:inline-block}.vue-component.stac .thumbnails a img{padding:2px;max-height:200px;vertical-align:middle;border:2px solid transparent}.vue-component.stac .thumbnails a:hover img{border:2px solid rgba(0,0,0,.5)}.vue-component .federation>ul>li{margin-bottom:.5em}.vue-component .federation>ul>li>small{display:block}.vue-component .federation>ul>li>h4{margin:0}.vue-component .federation .fed-header{margin:.2em 0}.vue-component .federation .fed-header>.fed-title{display:inline-block;vertical-align:bottom}.vue-component.object-tree .inline{display:inline-block}.vue-component.object-tree ol{padding-left:2em;margin-bottom:.5em}.vue-component.object-tree ol>li:only-child{list-style-type:none;margin-left:-2em}.vue-component.object-tree ol>li>div>ul{padding-left:0}.vue-component.object-tree ul{padding-left:1em}.vue-component.object-tree ul>li{list-style-type:none}.vue-component.object-tree li{margin-bottom:.25em}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#267cb9}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #267cb9;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:1024px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{font-weight:600;font-size:inherit}.dropdown-wrapper .dropdown-title:hover{color:#267cb9}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:1024px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#267cb9}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}@media (min-width:1024px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #2a89cc}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:1024px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:1280px){.page-edit{padding:2rem}}@media (max-width:500px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto;font-size:.9em}.page-edit .edit-link{display:inline-block;margin-right:1rem}.page-edit .edit-link a{color:#4e6e8e}.page-edit .last-updated{display:inline-block}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-edit .license{margin-top:.5em}@media (max-width:1024px){.page-edit{font-size:.8em}.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:1280px){.page-nav{padding:2rem}}@media (max-width:500px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#267cb9;border-left-color:#267cb9}.sidebar-heading.clickable:hover{color:#267cb9}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#267cb9}a.sidebar-link.active{font-weight:600;color:#267cb9;border-left-color:#267cb9}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:1024px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}@media (min-width:1024px){#docVersionChooser{display:inline-block;z-index:10;position:fixed;top:4.6rem;right:2rem;border-radius:.5em;border:1px solid #eaecef;background-color:#fff;font-size:.9rem}#docVersionChooser button{margin:.3rem .6rem}}@media (max-width:1024px){#docVersionChooser .dropdown-wrapper .dropdown-title:hover{color:#2c3e50}}#docVersionChooser a{color:#2c3e50}#docVersionChooser a:hover{color:#267cb9}.news-meta{margin-bottom:2em;display:block}.fullpage{width:100%;padding-top:3.6rem;height:calc(100vh - 3.6rem);border:0} \ No newline at end of file diff --git a/assets/js/1.4b733fc1.js b/assets/js/1.e5b0abdd.js similarity index 94% rename from assets/js/1.4b733fc1.js rename to assets/js/1.e5b0abdd.js index 6af0ae416..787108901 100644 --- a/assets/js/1.4b733fc1.js +++ b/assets/js/1.e5b0abdd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1,16,17,28,29,30,37],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return s})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"j",(function(){return p})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return m}));const s=/#.*$/,i=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(s,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=o(t);return r.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(s);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function p(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const s=t.charAt(0);if("/"===s)return t;if("?"===s||"#"===s)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,s,i=1){if("string"==typeof e)return p(n,e,s);if(Array.isArray(e))return Object.assign(p(n,e[0],s),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(p(n,e.path,s),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:r.map(e=>t(e,n,s,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var s=n(155),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(s.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(s.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(4),a=Object(r.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},160:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(161),n(4)),r=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},170:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},180:function(t,e,n){"use strict";n.r(e);var s=n(159),i=n(160),r=n(50),a=n.n(r),o={name:"DropdownLink",components:{NavLink:s.default,DropdownTransition:i.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t}},l=(n(174),n(4)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,s){return e("li",{key:n.link||s,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(s){return e("li",{key:s.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:s},on:{focusout:function(e){t.isLastItemOfArray(s,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},182:function(t,e,n){},184:function(t,e,n){"use strict";n(170)},185:function(t,e,n){},200:function(t,e,n){"use strict";n.r(e);var s=n(180),i={name:"NavLinks",components:{NavLink:n(159).default,DropdownLink:s.default},computed:{userLinks(){return this.$site.themeConfig.nav.map(t=>(t.userNav?(t.items=this.getNav("userNav"),t.index=Math.random()):t.devNav&&(t.items=this.getNav("devNav"),t.index=Math.random()),Object.assign(this.resolveNavLinkItem(t),{items:(t.items||[]).map(t=>this.resolveNavLinkItem(t))})))}},methods:{resolveNavLinkItem:t=>Object.assign(t,{type:t.items&&t.items.length?"links":"link"}),prepareNavLinks(t,e){if(Array.isArray(t))return t.map(t=>this.prepareNavLinks(t,e));var n=Object.assign({},t);for(var s in n)n[s]&&"object"==typeof n[s]?n[s]=this.prepareNavLinks(n[s],e):"link"!==s||n.link.match(/^(\/|[\w\d]+:)/i)||(n.link=e+n.link);return n},getNav(t){const{versions:e,defaultVersion:n}=this.$site.themeConfig;var s=e.findIndex(t=>this.$page.regularPath.startsWith(t.path));s<0&&(s=n);var i=this.prepareNavLinks(e[s][t],e[s].path);return i.push({text:"Versions",items:e.map(t=>({text:t.title,link:t.path}))}),i}}},r=(n(184),n(4)),a=Object(r.a)(i,(function(){var t=this._self._c;return this.userLinks.length?t("nav",{staticClass:"nav-links"},this._l(this.userLinks,(function(e){return t("div",{key:e.index||e.link,staticClass:"nav-item"},["links"===e.type?t("DropdownLink",{attrs:{item:e}}):t("NavLink",{attrs:{item:e}})],1)})),0):this._e()}),[],!1,null,null,null);e.default=a.exports},207:function(t,e,n){"use strict";n(182)},209:function(t,e,n){"use strict";n(185)},228:function(t,e,n){},229:function(t,e,n){},289:function(t,e,n){"use strict";n.r(e);var s={name:"AlgoliaSearchBox",props:["options"],data:()=>({placeholder:void 0}),watch:{$lang(t){this.update(this.options,t)},options(t){this.update(t,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(t){Promise.all([Promise.all([n.e(0),n.e(9)]).then(n.t.bind(null,472,7)),Promise.all([n.e(0),n.e(9)]).then(n.t.bind(null,473,7))]).then(([e])=>{e=e.default;const{algoliaOptions:n={}}=t;e(Object.assign({},t,{inputSelector:"#algolia-search-input",algoliaOptions:Object.assign({facetFilters:n.facetFilters||[]},n),handleSelected:(t,e,n)=>{const{pathname:s,hash:i}=new URL(n.url);if(n.url.includes("://openeo.org")){const t=s.replace(this.$site.base,"/"),e=decodeURIComponent(i);this.$router.push(`${t}${e}`)}else window.location.href=n.url}}))})},update(t){this.$el.innerHTML='',this.initialize(t)}}},i=(n(207),n(4)),r=Object(i.a)(s,(function(){var t=this._self._c;return t("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[t("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);e.default=r.exports},295:function(t,e,n){"use strict";n.r(e);n(209);var s=n(4),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"sidebar-button",on:{click:function(e){return t.$emit("toggle-sidebar")}}},[e("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[e("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);e.default=i.exports},296:function(t,e,n){"use strict";n(228)},297:function(t,e,n){"use strict";n(229)},463:function(t,e,n){"use strict";n.r(e);var s=n(289),i=n(51),r=n.n(i),a=(t,e,n=null)=>{let s=r()(e,"title","");return r()(e,"frontmatter.tags")&&(s+=" "+e.frontmatter.tags.join(" ")),n&&(s+=" "+n),o(t,s)};const o=(t,e)=>{const n=t=>t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp("[^\0-]"),i=t.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t);if(s.test(t))return i.some(t=>e.toLowerCase().indexOf(t)>-1);{const s=t.endsWith(" ");return new RegExp(i.map((t,e)=>i.length!==e+1||s?`(?=.*\\b${n(t)}\\b)`:`(?=.*\\b${n(t)})`).join("")+".+","gi").test(e)}};var l={name:"SearchBox",data:()=>({query:"",focused:!1,focusIndex:0,placeholder:void 0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const{pages:e}=this.$site,n=this.$site.themeConfig.searchMaxSuggestions||5,s=this.$localePath,i=[];for(let r=0;r=n);r++){const o=e[r];if(this.getPageLocalePath(o)===s&&this.isSearchable(o))if(a(t,o))i.push(o);else if(o.headers)for(let e=0;e=n);e++){const n=o.headers[e];n.title&&a(t,o,n.title)&&i.push(Object.assign({},o,{path:o.path+"#"+n.slug,header:n}))}}return i},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Array(e),e.filter(e=>t.path.match(e)).length>0)},onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+t._s(n.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,h=n(295),f=n(200);function p(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var d={name:"Navbar",components:{SidebarButton:h.default,NavLinks:f.default,SearchBox:c,AlgoliaSearchBox:s.default},data:()=>({linksWrapMaxWidth:null}),computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}},mounted(){const t=parseInt(p(this.$el,"paddingLeft"))+parseInt(p(this.$el,"paddingRight")),e=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-t-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};e(),window.addEventListener("resize",e,!1)}},g=(n(297),Object(u.a)(d,(function(){var t=this,e=t._self._c;return e("header",{staticClass:"navbar"},[e("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),e("RouterLink",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?e("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?e("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),e("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[t.isAlgoliaSearch?e("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$site.themeConfig.search&&!1!==t.$page.frontmatter.search?e("SearchBox"):t._e(),t._v(" "),e("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null));e.default=g.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[1,16,17,29,30,31,38],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return s})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"j",(function(){return p})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return m}));const s=/#.*$/,i=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(s,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=o(t);return r.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(s);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function p(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const s=t.charAt(0);if("/"===s)return t;if("?"===s||"#"===s)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,s,i=1){if("string"==typeof e)return p(n,e,s);if(Array.isArray(e))return Object.assign(p(n,e[0],s),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(p(n,e.path,s),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:r.map(e=>t(e,n,s,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var s=n(155),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(s.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(s.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(4),a=Object(r.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},160:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(161),n(4)),r=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},170:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},180:function(t,e,n){"use strict";n.r(e);var s=n(159),i=n(160),r=n(50),a=n.n(r),o={name:"DropdownLink",components:{NavLink:s.default,DropdownTransition:i.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t}},l=(n(174),n(4)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,s){return e("li",{key:n.link||s,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(s){return e("li",{key:s.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:s},on:{focusout:function(e){t.isLastItemOfArray(s,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},182:function(t,e,n){},184:function(t,e,n){"use strict";n(170)},185:function(t,e,n){},200:function(t,e,n){"use strict";n.r(e);var s=n(180),i={name:"NavLinks",components:{NavLink:n(159).default,DropdownLink:s.default},computed:{userLinks(){return this.$site.themeConfig.nav.map(t=>(t.userNav?(t.items=this.getNav("userNav"),t.index=Math.random()):t.devNav&&(t.items=this.getNav("devNav"),t.index=Math.random()),Object.assign(this.resolveNavLinkItem(t),{items:(t.items||[]).map(t=>this.resolveNavLinkItem(t))})))}},methods:{resolveNavLinkItem:t=>Object.assign(t,{type:t.items&&t.items.length?"links":"link"}),prepareNavLinks(t,e){if(Array.isArray(t))return t.map(t=>this.prepareNavLinks(t,e));var n=Object.assign({},t);for(var s in n)n[s]&&"object"==typeof n[s]?n[s]=this.prepareNavLinks(n[s],e):"link"!==s||n.link.match(/^(\/|[\w\d]+:)/i)||(n.link=e+n.link);return n},getNav(t){const{versions:e,defaultVersion:n}=this.$site.themeConfig;var s=e.findIndex(t=>this.$page.regularPath.startsWith(t.path));s<0&&(s=n);var i=this.prepareNavLinks(e[s][t],e[s].path);return i.push({text:"Versions",items:e.map(t=>({text:t.title,link:t.path}))}),i}}},r=(n(184),n(4)),a=Object(r.a)(i,(function(){var t=this._self._c;return this.userLinks.length?t("nav",{staticClass:"nav-links"},this._l(this.userLinks,(function(e){return t("div",{key:e.index||e.link,staticClass:"nav-item"},["links"===e.type?t("DropdownLink",{attrs:{item:e}}):t("NavLink",{attrs:{item:e}})],1)})),0):this._e()}),[],!1,null,null,null);e.default=a.exports},207:function(t,e,n){"use strict";n(182)},209:function(t,e,n){"use strict";n(185)},228:function(t,e,n){},229:function(t,e,n){},290:function(t,e,n){"use strict";n.r(e);var s={name:"AlgoliaSearchBox",props:["options"],data:()=>({placeholder:void 0}),watch:{$lang(t){this.update(this.options,t)},options(t){this.update(t,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(t){Promise.all([Promise.all([n.e(0),n.e(9)]).then(n.t.bind(null,474,7)),Promise.all([n.e(0),n.e(9)]).then(n.t.bind(null,475,7))]).then(([e])=>{e=e.default;const{algoliaOptions:n={}}=t;e(Object.assign({},t,{inputSelector:"#algolia-search-input",algoliaOptions:Object.assign({facetFilters:n.facetFilters||[]},n),handleSelected:(t,e,n)=>{const{pathname:s,hash:i}=new URL(n.url);if(n.url.includes("://openeo.org")){const t=s.replace(this.$site.base,"/"),e=decodeURIComponent(i);this.$router.push(`${t}${e}`)}else window.location.href=n.url}}))})},update(t){this.$el.innerHTML='',this.initialize(t)}}},i=(n(207),n(4)),r=Object(i.a)(s,(function(){var t=this._self._c;return t("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[t("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);e.default=r.exports},296:function(t,e,n){"use strict";n.r(e);n(209);var s=n(4),i=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("div",{staticClass:"sidebar-button",on:{click:function(e){return t.$emit("toggle-sidebar")}}},[e("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[e("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);e.default=i.exports},297:function(t,e,n){"use strict";n(228)},298:function(t,e,n){"use strict";n(229)},465:function(t,e,n){"use strict";n.r(e);var s=n(290),i=n(51),r=n.n(i),a=(t,e,n=null)=>{let s=r()(e,"title","");return r()(e,"frontmatter.tags")&&(s+=" "+e.frontmatter.tags.join(" ")),n&&(s+=" "+n),o(t,s)};const o=(t,e)=>{const n=t=>t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp("[^\0-]"),i=t.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t);if(s.test(t))return i.some(t=>e.toLowerCase().indexOf(t)>-1);{const s=t.endsWith(" ");return new RegExp(i.map((t,e)=>i.length!==e+1||s?`(?=.*\\b${n(t)}\\b)`:`(?=.*\\b${n(t)})`).join("")+".+","gi").test(e)}};var l={name:"SearchBox",data:()=>({query:"",focused:!1,focusIndex:0,placeholder:void 0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const{pages:e}=this.$site,n=this.$site.themeConfig.searchMaxSuggestions||5,s=this.$localePath,i=[];for(let r=0;r=n);r++){const o=e[r];if(this.getPageLocalePath(o)===s&&this.isSearchable(o))if(a(t,o))i.push(o);else if(o.headers)for(let e=0;e=n);e++){const n=o.headers[e];n.title&&a(t,o,n.title)&&i.push(Object.assign({},o,{path:o.path+"#"+n.slug,header:n}))}}return i},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Array(e),e.filter(e=>t.path.match(e)).length>0)},onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+t._s(n.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,h=n(296),f=n(200);function p(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var d={name:"Navbar",components:{SidebarButton:h.default,NavLinks:f.default,SearchBox:c,AlgoliaSearchBox:s.default},data:()=>({linksWrapMaxWidth:null}),computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}},mounted(){const t=parseInt(p(this.$el,"paddingLeft"))+parseInt(p(this.$el,"paddingRight")),e=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-t-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};e(),window.addEventListener("resize",e,!1)}},g=(n(298),Object(u.a)(d,(function(){var t=this,e=t._self._c;return e("header",{staticClass:"navbar"},[e("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),e("RouterLink",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?e("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?e("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),e("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[t.isAlgoliaSearch?e("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$site.themeConfig.search&&!1!==t.$page.frontmatter.search?e("SearchBox"):t._e(),t._v(" "),e("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null));e.default=g.exports}}]); \ No newline at end of file diff --git a/assets/js/10.a053e9f8.js b/assets/js/10.fb2e6663.js similarity index 51% rename from assets/js/10.a053e9f8.js rename to assets/js/10.fb2e6663.js index 55c5187ff..834f93e64 100644 --- a/assets/js/10.a053e9f8.js +++ b/assets/js/10.fb2e6663.js @@ -1,13 +1,13 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],Array(156).concat([function(e,t,r){"use strict";var n=r(265);const{toString:i}=Object.prototype,{getPrototypeOf:o}=Object,s=(a=Object.create(null),e=>{const t=i.call(e);return a[t]||(a[t]=t.slice(8,-1).toLowerCase())});var a;const l=e=>(e=e.toLowerCase(),t=>s(t)===e),c=e=>t=>typeof t===e,{isArray:u}=Array,p=c("undefined");const f=l("ArrayBuffer");const h=c("string"),d=c("function"),m=c("number"),g=e=>null!==e&&"object"==typeof e,y=e=>{if("object"!==s(e))return!1;const t=o(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},b=l("Date"),v=l("File"),w=l("Blob"),_=l("FileList"),x=l("URLSearchParams"),[A,S,E,C]=["ReadableStream","Request","Response","Headers"].map(l);function O(e,t,{allOwnKeys:r=!1}={}){if(null==e)return;let n,i;if("object"!=typeof e&&(e=[e]),u(e))for(n=0,i=e.length;n0;)if(n=r[i],t===n.toLowerCase())return n;return null}const k="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,L=e=>!p(e)&&e!==k;const P=(j="undefined"!=typeof Uint8Array&&o(Uint8Array),e=>j&&e instanceof j);var j;const R=l("HTMLFormElement"),D=(({hasOwnProperty:e})=>(t,r)=>e.call(t,r))(Object.prototype),N=l("RegExp"),B=(e,t)=>{const r=Object.getOwnPropertyDescriptors(e),n={};O(r,(r,i)=>{let o;!1!==(o=t(r,i,e))&&(n[i]=o||r)}),Object.defineProperties(e,n)},U="abcdefghijklmnopqrstuvwxyz",q={DIGIT:"0123456789",ALPHA:U,ALPHA_DIGIT:U+U.toUpperCase()+"0123456789"};const M=l("AsyncFunction");t.a={isArray:u,isArrayBuffer:f,isBuffer:function(e){return null!==e&&!p(e)&&null!==e.constructor&&!p(e.constructor)&&d(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||d(e.append)&&("formdata"===(t=s(e))||"object"===t&&d(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&f(e.buffer),t},isString:h,isNumber:m,isBoolean:e=>!0===e||!1===e,isObject:g,isPlainObject:y,isReadableStream:A,isRequest:S,isResponse:E,isHeaders:C,isUndefined:p,isDate:b,isFile:v,isBlob:w,isRegExp:N,isFunction:d,isStream:e=>g(e)&&d(e.pipe),isURLSearchParams:x,isTypedArray:P,isFileList:_,forEach:O,merge:function e(){const{caseless:t}=L(this)&&this||{},r={},n=(n,i)=>{const o=t&&T(r,i)||i;y(r[o])&&y(n)?r[o]=e(r[o],n):y(n)?r[o]=e({},n):u(n)?r[o]=n.slice():r[o]=n};for(let e=0,t=arguments.length;e(O(t,(t,i)=>{r&&d(t)?e[i]=Object(n.a)(t,r):e[i]=t},{allOwnKeys:i}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,r,n)=>{e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},toFlatObject:(e,t,r,n)=>{let i,s,a;const l={};if(t=t||{},null==e)return t;do{for(i=Object.getOwnPropertyNames(e),s=i.length;s-- >0;)a=i[s],n&&!n(a,e,t)||l[a]||(t[a]=e[a],l[a]=!0);e=!1!==r&&o(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:s,kindOfTest:l,endsWith:(e,t,r)=>{e=String(e),(void 0===r||r>e.length)&&(r=e.length),r-=t.length;const n=e.indexOf(t,r);return-1!==n&&n===r},toArray:e=>{if(!e)return null;if(u(e))return e;let t=e.length;if(!m(t))return null;const r=new Array(t);for(;t-- >0;)r[t]=e[t];return r},forEachEntry:(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let n;for(;(n=r.next())&&!n.done;){const r=n.value;t.call(e,r[0],r[1])}},matchAll:(e,t)=>{let r;const n=[];for(;null!==(r=e.exec(t));)n.push(r);return n},isHTMLForm:R,hasOwnProperty:D,hasOwnProp:D,reduceDescriptors:B,freezeMethods:e=>{B(e,(t,r)=>{if(d(e)&&-1!==["arguments","caller","callee"].indexOf(r))return!1;const n=e[r];d(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")}))})},toObjectSet:(e,t)=>{const r={},n=e=>{e.forEach(e=>{r[e]=!0})};return u(e)?n(e):n(String(e).split(t)),r},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:T,global:k,isContextDefined:L,ALPHABET:q,generateString:(e=16,t=q.ALPHA_DIGIT)=>{let r="";const{length:n}=t;for(;e--;)r+=t[Math.random()*n|0];return r},isSpecCompliantForm:function(e){return!!(e&&d(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),r=(e,n)=>{if(g(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[n]=e;const i=u(e)?[]:{};return O(e,(e,t)=>{const o=r(e,n+1);!p(o)&&(i[t]=o)}),t[n]=void 0,i}}return e};return r(e,0)},isAsyncFn:M,isThenable:e=>e&&(g(e)||d(e))&&d(e.then)&&d(e.catch)}},function(e,t,r){"use strict";var n=r(194),i=r(294),o={name:"Errored"},s=r(4),a=Object(s.a)(o,(function(){return(0,this._self._c)("p",{staticClass:"vue-component component-error-notice"},[this._v("\n\tSorry, could not load user interface from server. Please try again.\n")])}),[],!1,null,null,null).exports;const l=/[\s\.,;:"'!&\(\{\[\)\}\]]+/g,c=(e,t)=>null===t?"":"string"==typeof t?t.replace(/\s+/g," "):t;class u extends n.Utils{static kebabToCamelCase(e){return e.replace(/-(\w)/g,(e,t)=>t?t.toUpperCase():"")}static enableHtmlProps(e){u.isObject(e.$root)&&e.$root.$options.shadowRoot&&("complete"===document.readyState?u.readHtmlProps(e):document.addEventListener("readystatechange",()=>u.enableHtmlProps(e),{once:!0}))}static readHtmlProps(e){if(!u.isObject(e)||!u.isObject(e.$slots)||!Array.isArray(e.$slots.default))return;let t=e.$slots.default.filter(e=>"string"==typeof e.tag&&"SCRIPT"===e.tag.toUpperCase()&&"string"==typeof e.data.attrs.type&&e.data.attrs.type.includes("application/json"));for(let r of t){let t=null;try{"string"==typeof r.data.attrs.prop&&r.data.attrs.prop.length>0&&(t=u.kebabToCamelCase(r.data.attrs.prop));let n=JSON.parse(r.data.domProps.innerHTML);if(t)u.setProp(e,t,n);else if(u.isObject(n))for(let t in n)u.setProp(e,t,n[t]);else console.error("Props passed via script tag must be contained in an object.")}catch(e){t?console.error(`Prop '${t}' passed via script tag is invalid: ${e.message}`):console.error("Props passed via script tag are invalid: "+e.message)}}}static loadFontAwesome(e){let t=u.isObject(e.$root)&&e.$root.$options.shadowRoot,r=Array.from((t||document).styleSheets);for(let e of r)if("string"==typeof e.href&&e.href.includes("fontawesome"))return;if(!t){let e=document.createElement("link");e.as="font",e.type="font/woff2",e.crossOrigin=!0,e.href="https://use.fontawesome.com/releases/v5.13.0/webfonts/fa-solid-900.woff2",document.head.appendChild(e)}let n=document.createElement("link");n.rel="stylesheet",n.type="text/css",n.media="all",n.href="https://use.fontawesome.com/releases/v5.13.0/css/all.css",(t||document.head).appendChild(n)}static setProp(e,t,r){let n=u.isObject(e.$props)?e.$props:e.$options.propsData;e.$set(n,u.kebabToCamelCase(t),r)}static loadAsyncComponent(e){return{component:e,loading:i.a,error:a,delay:0,timeout:1e4}}static dataType(e,t=!1,r=2,i=0){let o=new n.ProcessSchema(e);var s=new Set;for(let e in o.schemas){let n=o.schemas[e],a=n.nativeDataType(),l=n.dataType();if(n.isEditable()){if(t&&o.schemas.filter(e=>e.nativeDataType()===a).length>r){s.add(a);continue}}else a=l;let c=a===l?l:`${l}:${a}`;if("array"===a&&u.isObject(n.schema.items)){let e=u.dataType(n.schema.items,t,r,i+1);"any"!==e&&(c+=`<${e}>`)}s.add(c)}return s.has("any")?"any":Array.from(s).join(t||i>0?"|":", ")}static htmlentities_decode(e){return"string"!=typeof e&&(e=String(e)),e.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'")}static htmlentities(e){return"string"!=typeof e&&(e=String(e)),e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}static countObjectKeys(e){var t={};for(var r in e){var n=e[r];if("object"!=typeof n||null===n||Array.isArray(n))return null;for(var i in n)void 0===t[i]?t[i]=1:t[i]++}return t}static isTableLike(e,t=!1){if("object"!=typeof e||null===e)return[];var r=u.countObjectKeys(e);if(null!==r){if(!0===t)return Object.keys(r);var n=0,i=0;for(var o in r)n++,i+=r[o];var s=i/n,a=Array.isArray(a)?e.length:Object.keys(e).length;if(s>a/2)return Object.keys(r)}return[]}static isUrl(e,t=!0){if(!u.hasText(e))return!1;try{let r=new URL(e);return!(t&&!r.protocol.match(/^https?:$/i))}catch(e){return!1}}static prettifyAbbreviation(e){return"string"==typeof e&&null===e.match(/[A-Z]+/)?e.toUpperCase():e}static ensurePoint(e,t=null){return"function"!=typeof t&&(t=()=>[0,0]),Array.isArray(e)?("number"!=typeof e[0]&&(e[0]=t()[0]||0),"number"!=typeof e[1]&&(e[1]=t()[1]||0),e):t()}static formatRef(e){if(this.isRef(e)){if(e.from_node)return"#"+e.from_node;if(e.from_parameter)return"$"+e.from_parameter}return e}static isRef(e){return u.isObject(e)&&(e.from_parameter||e.from_node)}static isRefEqual(e,t){return!(!u.isRef(e)||!u.isRef(t))&&(!(!e.from_parameter||e.from_parameter!==t.from_parameter)||!(!e.from_node||e.from_node!==t.from_node))}static detectGeoJson(e){if(!u.isObject(e))return!1;if("string"!=typeof e.type)return!1;switch(e.type){case"Point":case"MultiPoint":case"LineString":case"MultiLineString":case"Polygon":case"MultiPolygon":return!!Array.isArray(e.coordinates);case"GeometryCollection":return!!Array.isArray(e.geometries);case"Feature":return!(null!==e.geometry&&!u.isObject(e.geometry))&&!(null!==e.properties&&!u.isObject(e.properties));case"FeatureCollection":return!!Array.isArray(e.features);default:return!1}}static toProcessParameters(e){if(u.isObject(e)){let t=[];for(let r in e){let n=e[r],i=u.omitFromObject(n,["description","required","default","federation:backends"]);t.push({name:r,description:n.description,optional:!n.required,default:n.default,"federation:backends":n["federation:backends"],schema:i})}return t.sort((e,t)=>u.compareStringCaseInsensitive(e.name,t.name))}return[]}static formatCurrency(e,t,r=""){if("number"!=typeof e)return r;try{return e.toLocaleString(void 0,{style:"currency",currency:t})}catch(r){let n=e.toLocaleString(void 0,{maximumFractionDigits:2});return"string"==typeof t&&(n+=" ",n+=t),n.trim()}}static formatBudget(e,t,r="Unlimited"){return null===e?r:u.formatCurrency(e,t)}static formatTimestamp(e,t="n/a"){if("string"==typeof e)try{return new Date(e).toLocaleString(void 0,{timeZone:"UTC",timeZoneName:"short"})}catch(e){}return t}static formatFileSize(e,t="n/a"){if("number"!=typeof e)return t;let r=0==e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,r)).toLocaleString(void 0,{maximumFractionDigits:1})} ${["B","kB","MB","GB","TB","PB"][r]}`}static formatProcessSignature(e,t=!0){let r=[];if(Array.isArray(e.parameters))for(let n in e.parameters){let i,o=e.parameters[n],s=u.dataType(o.schema,!0,1),a=o.optional?"?":"",l="";o.optional&&void 0!==o.default&&(l=JSON.stringify(o.default)),t?(i=`${a}${u.htmlentities(s)} ${u.htmlentities(o.name)}`,l&&(l.length>30&&(l=``),i+=` = ${l}`)):i=a+s+" "+o.name+l,r.push(i)}let n="("+r.join(", ")+") : ",i=u.isObject(e.returns)&&e.returns.schema&&"object"==typeof e.returns.schema?e.returns.schema:{},o=u.dataType(i,!0,2);return t?`${u.htmlentities(e.process.id)}${n}${u.htmlentities(o)}`:e.process.id+n+o}static search(e,t,r=!0){if("string"!=typeof e||0===e.length)return!1;if(u.isObject(t)?t=Object.values(t):"string"==typeof t&&(t=[t]),!Array.isArray(t))return!1;return e=e.toLowerCase().split(l),t=t.map(e=>"string"==typeof e?e:JSON.stringify(e,c,0)).join(" ").replace(l," ").toLowerCase(),e[r?"every":"some"](e=>t.includes(e))}}t.a=u},,,,,,,,function(e,t,r){var n=r(345);class i{static isObject(e){return"object"==typeof e&&e===Object(e)&&!Array.isArray(e)}static hasText(e){return"string"==typeof e&&e.length>0}static equals(e,t){return n(e,t)}static pickFromObject(e,t){e=Object(e),"string"==typeof t&&(t=[t]);const r={};return t.forEach(t=>r[t]=e[t]),r}static omitFromObject(e,t){e=Object(e),"string"==typeof t&&(t=[t]);var r=Object.assign({},e);for(let e of t)delete r[e];return r}static mapObject(e,t){const r=Object.keys(e),n=new Array(r.length);return r.forEach((r,i)=>{n[i]=t(e[r],r,e)}),n}static mapObjectValues(e,t){e=Object(e);const r={};return Object.keys(e).forEach(n=>{r[n]=t(e[n],n,e)}),r}static unique(e,t=!1){return t?e.filter((e,t,r)=>r.findIndex(t=>i.equals(e,t))===t):[...new Set(e)]}static size(e){return"object"==typeof e&&null!==e?Array.isArray(e)?e.length:Object.keys(e).length:0}static isNumeric(e){return!isNaN(parseFloat(e))&&isFinite(e)}static deepClone(e){return JSON.parse(JSON.stringify(e))}static normalizeUrl(e,t=null){let r=e.replace(/\/$/,"");return"string"==typeof t&&("/"!==t.substr(0,1)&&(t="/"+t),r+=t.replace(/\/$/,"")),r}static replacePlaceholders(e,t={}){if("string"==typeof e&&i.isObject(t))for(var r in t){let n=t[r];e=e.replace("{"+r+"}",Array.isArray(n)?n.join("; "):n)}return e}static compareStringCaseInsensitive(e,t){return"string"!=typeof e&&(e=String(e)),"string"!=typeof t&&(t=String(t)),e.localeCompare(t,void 0,{numeric:!0,sensitivity:"base"})}static prettifyString(e,t="; "){return Array.isArray(e)||(e=[String(e)]),(e=e.map(e=>{if(e.length>=3){const t=(e,t,r)=>t+" "+r.toUpperCase();return(e=e.includes("_")?e.replace(/([a-zA-Z\d])_([a-zA-Z\d])/g,t):e.includes("-")?e.replace(/([a-zA-Z\d])-([a-zA-Z\d])/g,t):e.replace(/([a-z])([A-Z])/g,t)).charAt(0).toUpperCase()+e.substr(1)}return e})).join(t)}static friendlyLinks(e,t=!0,r=["self"]){let n=[];if(!Array.isArray(e))return n;for(let t of e)t=Object.assign({},t),"string"==typeof t.rel&&r.includes(t.rel.toLowerCase())||("string"==typeof t.title&&0!==t.title.length||("string"==typeof t.rel&&t.rel.length>1?t.title=i.prettifyString(t.rel):t.title=t.href.replace(/^https?:\/\/(www.)?/i,"").replace(/\/$/i,"")),n.push(t));return t&&n.sort((e,t)=>i.compareStringCaseInsensitive(e.title,t.title)),n}}e.exports=i},function(e,t,r){"use strict";var n=r(156);function i(e,t,r,n,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),i&&(this.response=i)}n.a.inherits(i,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:n.a.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const o=i.prototype,s={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{s[e]={value:e}}),Object.defineProperties(i,s),Object.defineProperty(o,"isAxiosError",{value:!0}),i.from=(e,t,r,s,a,l)=>{const c=Object.create(o);return n.a.toFlatObject(e,c,(function(e){return e!==Error.prototype}),e=>"isAxiosError"!==e),i.call(c,e.message,t,r,s,a),c.cause=e,c.name=e.name,l&&Object.assign(c,l),c},t.a=i},,function(e,t,r){"use strict";var n=r(360),i=r(361),o=r(362),s=r(363),a=r(242),l=r(169),c=r(364),u=Function,p=function(e){try{return u('"use strict"; return ('+e+").constructor;")()}catch(e){}},f=Object.getOwnPropertyDescriptor;if(f)try{f({},"")}catch(e){f=null}var h=function(){throw new l},d=f?function(){try{return h}catch(e){try{return f(arguments,"callee").get}catch(e){return h}}}():h,m=r(243)(),g=r(365)(),y=Object.getPrototypeOf||(g?function(e){return e.__proto__}:null),b={},v="undefined"!=typeof Uint8Array&&y?y(Uint8Array):void 0,w={__proto__:null,"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":m&&y?y([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":b,"%AsyncGenerator%":b,"%AsyncGeneratorFunction%":b,"%AsyncIteratorPrototype%":b,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?void 0:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?void 0:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":n,"%eval%":eval,"%EvalError%":i,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":u,"%GeneratorFunction%":b,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":m&&y?y(y([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&m&&y?y((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":o,"%ReferenceError%":s,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&m&&y?y((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":m&&y?y(""[Symbol.iterator]()):void 0,"%Symbol%":m?Symbol:void 0,"%SyntaxError%":a,"%ThrowTypeError%":d,"%TypedArray%":v,"%TypeError%":l,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":c,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet};if(y)try{null.error}catch(e){var _=y(y(e));w["%Error.prototype%"]=_}var x={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},A=r(216),S=r(366),E=A.call(Function.call,Array.prototype.concat),C=A.call(Function.apply,Array.prototype.splice),O=A.call(Function.call,String.prototype.replace),T=A.call(Function.call,String.prototype.slice),k=A.call(Function.call,RegExp.prototype.exec),L=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,P=/\\(\\)?/g,j=function(e){var t=T(e,0,1),r=T(e,-1);if("%"===t&&"%"!==r)throw new a("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==t)throw new a("invalid intrinsic syntax, expected opening `%`");var n=[];return O(e,L,(function(e,t,r,i){n[n.length]=r?O(i,P,"$1"):t||e})),n},R=function(e,t){var r,n=e;if(S(x,n)&&(n="%"+(r=x[n])[0]+"%"),S(w,n)){var i=w[n];if(i===b&&(i=function e(t){var r;if("%AsyncFunction%"===t)r=p("async function () {}");else if("%GeneratorFunction%"===t)r=p("function* () {}");else if("%AsyncGeneratorFunction%"===t)r=p("async function* () {}");else if("%AsyncGenerator%"===t){var n=e("%AsyncGeneratorFunction%");n&&(r=n.prototype)}else if("%AsyncIteratorPrototype%"===t){var i=e("%AsyncGenerator%");i&&y&&(r=y(i.prototype))}return w[t]=r,r}(n)),void 0===i&&!t)throw new l("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:r,name:n,value:i}}throw new a("intrinsic "+e+" does not exist!")};e.exports=function(e,t){if("string"!=typeof e||0===e.length)throw new l("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof t)throw new l('"allowMissing" argument must be a boolean');if(null===k(/^%?[^%]*%?$/,e))throw new a("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=j(e),n=r.length>0?r[0]:"",i=R("%"+n+"%",t),o=i.name,s=i.value,c=!1,u=i.alias;u&&(n=u[0],C(r,E([0,1],u)));for(var p=1,h=!0;p=r.length){var y=f(s,d);s=(h=!!y)&&"get"in y&&!("originalValue"in y.get)?y.get:s[d]}else h=S(s,d),s=s[d];h&&!c&&(w[o]=s)}}return s}},function(e,t,r){"use strict";e.exports=TypeError},,,,,,,,function(e,t,r){"use strict";t.a={components:{FederationNotice:()=>Promise.all([r.e(0),r.e(34)]).then(r.bind(null,469)),FederationMissingNotice:()=>Promise.all([r.e(0),r.e(31)]).then(r.bind(null,470))},props:{federation:{type:Object,default:()=>({})}}}},,,,,,,,,,,,,,,,,function(e,t,r){const n=r(344),i=r(347),o=r(348),s=r(234),a=r(349),l=r(235),c=r(196),u=r(236),p=r(195),f=r(165);e.exports={MigrateCapabilities:n,MigrateCollections:i,MigrateProcesses:o,ProcessDataType:s,ProcessParameter:a,ProcessSchema:l,ProcessUtils:c,ProcessRegistry:u,Versions:p,Utils:f}},function(e,t,r){const n=r(346);class i{static compare(e,t,r=null){return null!==r?n.compare(e,t,r):n(e,t)}static validate(e){return n.validate(e)}static findCompatible(e,t=!0,r=null,n=null){if(!Array.isArray(e)||0===e.length)return[];let o=e.filter(e=>{if("string"==typeof e.url&&i.validate(e.api_version)){let t=i.validate(r),o=i.validate(n);return t&&o?i.compare(e.api_version,r,">=")&&i.compare(e.api_version,n,"<="):t?i.compare(e.api_version,r,">="):!o||i.compare(e.api_version,n,"<=")}return!1});return 0===o.length?[]:o.sort((e,r)=>{let n=!0===e.production,o=!0===r.production;return t&&n!==o?n?-1:1:-1*i.compare(e.api_version,r.api_version)})}static findLatest(e,t=!0,r=null,n=null){let o=i.findCompatible(e,t,r,n);return o.length>0?o[0]:null}}e.exports=i},function(e,t,r){const n=r(165);class i{static normalizeJsonSchema(e,t=!1){e=n.isObject(e)?[e]:Array.isArray(e)?e:[];let r=[];for(let t of e)if(Array.isArray(t.allOf))r.push(Object.assign({},...t.allOf));else if(Array.isArray(t.oneOf)||Array.isArray(t.anyOf)){let e=n.omitFromObject(t,["oneOf","anyOf"]),i=t.oneOf||t.anyOf;for(let t of i)r.push(Object.assign({},e,t))}else r.push(t);if(!t)return r;e=[];for(let t of r)Array.isArray(t.type)?e=e.concat(t.type.map(e=>Object.assign({},t,{type:e}))):e.push(t);return e}static getCallbackParameters(e,t=[]){if(!n.isObject(e)||!e.schema)return[];let r,o=i.normalizeJsonSchema(e.schema);for(;r=t.shift();)o=o.map(e=>i.normalizeJsonSchema(i.getElementJsonSchema(e,r))),o=o.concat(...o);let s=[];for(let e of o){let t=null;if(Array.isArray(e.parameters)?t=e.parameters:n.isObject(e.additionalProperties)&&Array.isArray(e.additionalProperties.parameters)&&(t=e.additionalProperties.parameters),Array.isArray(t)){if(s.length>0&&!n.equals(s,t))throw new Error("Multiple schemas with different callback parameters found.");s=t}}return s}static getCallbackParametersForProcess(e,t,r=[]){if(!n.isObject(e)||!Array.isArray(e.parameters))return[];let o=e.parameters.find(e=>e.name===t);return i.getCallbackParameters(o,r)}static getNativeTypesForJsonSchema(e,t=!1){if(n.isObject(e)&&Array.isArray(e.type)){let r=n.unique(e.type).filter(e=>i.JSON_SCHEMA_TYPES.includes(e));return r.length>0&&r.length-1?i(r):r}},,,,,function(e,t,r){"use strict";var n=r(368),i="function"==typeof Symbol&&"symbol"==typeof Symbol("foo"),o=Object.prototype.toString,s=Array.prototype.concat,a=r(245),l=r(247)(),c=function(e,t,r,n){if(t in e)if(!0===n){if(e[t]===r)return}else if("function"!=typeof(i=n)||"[object Function]"!==o.call(i)||!n())return;var i;l?a(e,t,r,!0):a(e,t,r)},u=function(e,t){var r=arguments.length>2?arguments[2]:{},o=n(t);i&&(o=s.call(o,Object.getOwnPropertySymbols(t)));for(var a=0;an.isObject(e)&&"string"==typeof e.href).map(e=>("string"!=typeof e.rel&&(e.rel=r),e)):[]}static migrateDiscoveryParameters(e,t){if(i.compare(t,"1.0.0-rc.2","<="))for(var r in e){if(!n.isObject(e[r])){delete e[r];continue}let t=e[r].type;"string"==typeof t&&(e[r].type=[t,"null"]);let i=e[r].example;void 0!==i&&(e[r].examples=[i],delete e[r].example)}return e}}},function(e,t,r){"use strict";var n=r(216),i=r(168),o=r(367),s=r(169),a=i("%Function.prototype.apply%"),l=i("%Function.prototype.call%"),c=i("%Reflect.apply%",!0)||n.call(l,a),u=r(217),p=i("%Math.max%");e.exports=function(e){if("function"!=typeof e)throw new s("a function is required");var t=c(n,l,arguments);return o(t,1+p(0,e.length-(arguments.length-1)),!0)};var f=function(){return c(n,a,arguments)};u?u(e.exports,"apply",{value:f}):e.exports.apply=f},function(e,t,r){"use strict";var n=r(359);e.exports=Function.prototype.bind||n},function(e,t,r){"use strict";var n=r(168)("%Object.defineProperty%",!0)||!1;if(n)try{n({},"a",{value:1})}catch(e){n=!1}e.exports=n},function(e,t,r){"use strict";var n=r(169);e.exports=function(e){if(null==e)throw new n(arguments.length>0&&arguments[1]||"Cannot call method on "+e);return e}},,,,,,,,,,,,,,,,function(e,t,r){const n=r(165);class i{constructor(e,t=null,r){this.schema=e,void 0===this.schema.default&&(this.schema.default=r),this.parent=t}toJSON(){return Object.assign({},this.schema,{default:this.default()})}isAny(){return"any"===this.dataType()}isNull(){return"null"===this.schema.type}nullable(){return this.isNull()||this.isAny()}isEditable(){return!i.NON_EDITABLE.includes(this.dataType())}dataType(e=!1){let t=this.schema.type||"any";return e?t:this.schema.subtype||t}nativeDataType(){return this.dataType(!0)}isEnum(){return Array.isArray(this.schema.enum)&&this.schema.enum.length>0}getEnumChoices(){return this.isEnum()?this.schema.enum:[]}getCallbackParameters(){return Array.isArray(this.schema.parameters)?this.schema.parameters:n.isObject(this.schema.additionalProperties)&&Array.isArray(this.schema.additionalProperties.parameters)?this.schema.additionalProperties.parameters:[]}group(){return n.hasText(this.schema.group)?this.schema.group:i.DEFAULT_GROUP}title(){return n.hasText(this.schema.title)?this.schema.title:n.prettifyString(this.dataType())}description(){return n.hasText(this.schema.description)?this.schema.description:""}default(){return"function"==typeof this.schema.default?this.schema.default():this.schema.default}}i.DEFAULT_GROUP="Other",i.NON_EDITABLE=["raster-cube","vector-cube","labeled-array"],e.exports=i},function(e,t,r){const n=r(196),i=r(234),o=r(165);e.exports=class{constructor(e=null,t){if(o.isObject(e)||Array.isArray(e))if(this.unspecified=!1,this.schemas=n.normalizeJsonSchema(e,!0).map(e=>new i(e,this,t)),void 0===t){let e=this.schemas.map(e=>e.default()).filter(e=>void 0!==e);this.default=e[0]}else this.default=t;else this.unspecified=!0,this.schemas=[];this.refs=[]}toJSON(){return this.schemas.map(e=>e.toJSON())}isEditable(){return this.unspecified||this.schemas.filter(e=>e.isEditable()&&!e.isNull()).length>0}is(e){var t=this.dataTypes();return 1===t.length&&t[0]===e}nativeDataType(){return this.dataType(!0)}dataType(e=!1){var t=this.dataTypes(!0,e),r=t.indexOf("null");return 1===t.length?t[0]:2===t.length&&-1!==r?t[0===r?1:0]:"mixed"}dataTypes(e=!1,t=!1){var r=this.schemas.map(e=>e.dataType(t)).filter((e,t,r)=>r.indexOf(e)===t);return 0===r.length||r.includes("any")?["any"]:e?r:r.filter(e=>"null"!==e)}nullable(){return this.unspecified||this.schemas.filter(e=>e.nullable()).length>0}}},function(e,t,r){const n=r(165);class i{constructor(e=[],t=!1){if(this.listeners=[],this.processes={},this.addNamespace=t,e instanceof i)for(let t in e.processes)this.addAll(e.processes[t]);else this.addAll(e)}onChange(e,t,r){for(let n of this.listeners)n(e,t,r)}addAll(e,t="backend"){for(var r in e)this.add(e[r],t,!1);this.onChange("addAll",e,t)}add(e,t="backend",r=!0){if(!n.isObject(e))throw new Error("Invalid process; not an object.");if("string"!=typeof e.id)throw new Error("Invalid process; no id specified.");if("string"!=typeof t)throw new Error("Invalid namespace; not a string.");this.processes[t]||(this.processes[t]={}),e=Object.assign(this.addNamespace?{namespace:t}:{},e),this.processes[t][e.id]=e,r&&this.onChange("add",e,t)}count(){return n.size(this.all())}all(){let e=[];for(let t in this.processes)e=e.concat(Object.values(this.processes[t]));return e}hasNamespace(e){return"string"==typeof e&&Boolean(this.processes[e])}namespaces(){return Object.keys(this.processes).sort()}namespace(e){if("string"!=typeof e)return[];let t=this.processes[e];return t?Object.values(t):[]}has(e,t=null){return Boolean(this.get(e,t))}get(e,t=null){return"string"!=typeof e?null:null===t?this.get(e,"user")||this.get(e,"backend"):this.processes[t]&&this.processes[t][e]||null}remove(e=null,t="user"){if("string"!=typeof t)return!1;if(this.processes[t]){if("string"!=typeof e)return delete this.processes[t],this.onChange("remove",null,t),!0;if(this.processes[t][e]){let r=this.processes[t][e];return delete this.processes[t][e],0===n.size(this.processes[t])&&delete this.processes[t],this.onChange("remove",r,t),!0}}return!1}}e.exports=i},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXMLStrict=t.decodeHTML5Strict=t.decodeHTML4Strict=t.decodeHTML5=t.decodeHTML4=t.decodeHTMLStrict=t.decodeHTML=t.decodeXML=t.encodeHTML5=t.encodeHTML4=t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=t.encode=t.decodeStrict=t.decode=t.EncodingMode=t.DecodingMode=t.EntityLevel=void 0;var n,i,o,s=r(239),a=r(240);!function(e){e[e.XML=0]="XML",e[e.HTML=1]="HTML"}(n=t.EntityLevel||(t.EntityLevel={})),function(e){e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict"}(i=t.DecodingMode||(t.DecodingMode={})),function(e){e[e.UTF8=0]="UTF8",e[e.ASCII=1]="ASCII",e[e.Extensive=2]="Extensive"}(o=t.EncodingMode||(t.EncodingMode={})),t.decode=function(e,t){void 0===t&&(t=n.XML);var r="number"==typeof t?{level:t}:t;return r.level===n.HTML?r.mode===i.Strict?s.decodeHTMLStrict(e):s.decodeHTML(e):s.decodeXML(e)},t.decodeStrict=function(e,t){void 0===t&&(t=n.XML);var r="number"==typeof t?{level:t}:t;return r.level===n.HTML?r.mode===i.Legacy?s.decodeHTML(e):s.decodeHTMLStrict(e):s.decodeXML(e)},t.encode=function(e,t){void 0===t&&(t=n.XML);var r="number"==typeof t?{level:t}:t;return r.mode===o.UTF8?a.escapeUTF8(e):r.level===n.HTML?r.mode===o.ASCII?a.encodeNonAsciiHTML(e):a.encodeHTML(e):a.encodeXML(e)};var l=r(240);Object.defineProperty(t,"encodeXML",{enumerable:!0,get:function(){return l.encodeXML}}),Object.defineProperty(t,"encodeHTML",{enumerable:!0,get:function(){return l.encodeHTML}}),Object.defineProperty(t,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return l.encodeNonAsciiHTML}}),Object.defineProperty(t,"escape",{enumerable:!0,get:function(){return l.escape}}),Object.defineProperty(t,"escapeUTF8",{enumerable:!0,get:function(){return l.escapeUTF8}}),Object.defineProperty(t,"encodeHTML4",{enumerable:!0,get:function(){return l.encodeHTML}}),Object.defineProperty(t,"encodeHTML5",{enumerable:!0,get:function(){return l.encodeHTML}});var c=r(239);Object.defineProperty(t,"decodeXML",{enumerable:!0,get:function(){return c.decodeXML}}),Object.defineProperty(t,"decodeHTML",{enumerable:!0,get:function(){return c.decodeHTML}}),Object.defineProperty(t,"decodeHTMLStrict",{enumerable:!0,get:function(){return c.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML4",{enumerable:!0,get:function(){return c.decodeHTML}}),Object.defineProperty(t,"decodeHTML5",{enumerable:!0,get:function(){return c.decodeHTML}}),Object.defineProperty(t,"decodeHTML4Strict",{enumerable:!0,get:function(){return c.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML5Strict",{enumerable:!0,get:function(){return c.decodeHTMLStrict}}),Object.defineProperty(t,"decodeXMLStrict",{enumerable:!0,get:function(){return c.decodeXML}})},function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXML=t.decodeHTMLStrict=t.decodeHTML=t.determineBranch=t.JUMP_OFFSET_BASE=t.BinTrieFlags=t.xmlDecodeTree=t.htmlDecodeTree=void 0;var i=n(r(352));t.htmlDecodeTree=i.default;var o=n(r(353));t.xmlDecodeTree=o.default;var s,a=n(r(354));function l(e){return function(t,r){for(var n="",i=0,o=0;(o=t.indexOf("&",o))>=0;)if(n+=t.slice(i,o),i=o,o+=1,35!==t.charCodeAt(o)){for(var l=null,u=1,p=0,f=e[p];o=48&&m<=57||16===d&&(32|m)>=97&&(32|m)<=102;);if(h!==o){var g=t.substring(h,o),y=parseInt(g,d);if(59===t.charCodeAt(o))o+=1;else if(r)continue;n+=a.default(y),i=o}}return n+t.slice(i)}}function c(e,r,n,i){if(r<=128)return i===r?n:-1;var o=(r&s.BRANCH_LENGTH)>>8;if(0===o)return-1;if(1===o)return i===e[n]?n+1:-1;var a=r&s.JUMP_TABLE;if(a){var l=i-t.JUMP_OFFSET_BASE-a;return l<0||l>o?-1:e[n+l]-1}for(var c=n,u=c+o-1;c<=u;){var p=c+u>>>1,f=e[p];if(fi))return e[p+o];u=p-1}}return-1}!function(e){e[e.HAS_VALUE=32768]="HAS_VALUE",e[e.BRANCH_LENGTH=32512]="BRANCH_LENGTH",e[e.MULTI_BYTE=128]="MULTI_BYTE",e[e.JUMP_TABLE=127]="JUMP_TABLE"}(s=t.BinTrieFlags||(t.BinTrieFlags={})),t.JUMP_OFFSET_BASE=47,t.determineBranch=c;var u=l(i.default),p=l(o.default);t.decodeHTML=function(e){return u(e,!1)},t.decodeHTMLStrict=function(e){return u(e,!0)},t.decodeXML=function(e){return p(e,!0)}},function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=void 0;var i=n(r(355)),o=r(356),s=p(n(r(241)).default,!0),a=p(i.default,!0),l=p(i.default,!1),c=new Map(Object.keys(i.default).map((function(e){return[i.default[e].charCodeAt(0),"&"+e+";"]})));function u(e){for(var t,r="",n=0;null!==(t=a.exec(e));){var i=t.index,s=e.charCodeAt(i),l=c.get(s);l?(r+=e.substring(n,i)+l,n=i+1):(r+=e.substring(n,i)+"&#x"+o.getCodePoint(e,i).toString(16)+";",n=a.lastIndex+=Number(55296==(65408&s)))}return r+e.substr(n)}function p(e,t){for(var r=Object.keys(e).map((function(t){return"\\"+e[t].charAt(0)})).filter((function(e){return!t||e.charCodeAt(1)<128})).sort((function(e,t){return e.charCodeAt(1)-t.charCodeAt(1)})).filter((function(e,t,r){return e!==r[t+1]})),n=0;n","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},function(e,t,r){"use strict";e.exports=SyntaxError},function(e,t,r){"use strict";var n="undefined"!=typeof Symbol&&Symbol,i=r(244);e.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&i())))}},function(e,t,r){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),r=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var n=Object.getOwnPropertySymbols(e);if(1!==n.length||n[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var i=Object.getOwnPropertyDescriptor(e,t);if(42!==i.value||!0!==i.enumerable)return!1}return!0}},function(e,t,r){"use strict";var n=r(217),i=r(242),o=r(169),s=r(246);e.exports=function(e,t,r){if(!e||"object"!=typeof e&&"function"!=typeof e)throw new o("`obj` must be an object or a function`");if("string"!=typeof t&&"symbol"!=typeof t)throw new o("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new o("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new o("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new o("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new o("`loose`, if provided, must be a boolean");var a=arguments.length>3?arguments[3]:null,l=arguments.length>4?arguments[4]:null,c=arguments.length>5?arguments[5]:null,u=arguments.length>6&&arguments[6],p=!!s&&s(e,t);if(n)n(e,t,{configurable:null===c&&p?p.configurable:!c,enumerable:null===a&&p?p.enumerable:!a,value:r,writable:null===l&&p?p.writable:!l});else{if(!u&&(a||l||c))throw new i("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");e[t]=r}}},function(e,t,r){"use strict";var n=r(168)("%Object.getOwnPropertyDescriptor%",!0);if(n)try{n([],"length")}catch(e){n=null}e.exports=n},function(e,t,r){"use strict";var n=r(217),i=function(){return!!n};i.hasArrayLengthDefineBug=function(){if(!n)return null;try{return 1!==n([],"length",{value:1}).length}catch(e){return!0}},e.exports=i},function(e,t,r){"use strict";var n=Object.prototype.toString;e.exports=function(e){var t=n.call(e),r="[object Arguments]"===t;return r||(r="[object Array]"!==t&&null!==e&&"object"==typeof e&&"number"==typeof e.length&&e.length>=0&&"[object Function]"===n.call(e.callee)),r}},function(e,t,r){"use strict"; -/*! https://mths.be/repeat v1.0.0 by @mathias */var n=r(370),i=r(371),o=r(372);e.exports=function(e){var t=n(this),r=i(t),s=o(e);if(s<0||s==1/0)throw RangeError("String.prototype.repeat argument must be greater than or equal to 0 and not be Infinity");for(var a="";s;)s%2==1&&(a+=r),s>1&&(r+=r),s>>=1;return a}},function(e,t,r){"use strict";e.exports=function(e){return null===e||"function"!=typeof e&&"object"!=typeof e}},function(e,t,r){"use strict";var n,i,o=Function.prototype.toString,s="object"==typeof Reflect&&null!==Reflect&&Reflect.apply;if("function"==typeof s&&"function"==typeof Object.defineProperty)try{n=Object.defineProperty({},"length",{get:function(){throw i}}),i={},s((function(){throw 42}),null,n)}catch(e){e!==i&&(s=null)}else s=null;var a=/^\s*class\b/,l=function(e){try{var t=o.call(e);return a.test(t)}catch(e){return!1}},c=function(e){try{return!l(e)&&(o.call(e),!0)}catch(e){return!1}},u=Object.prototype.toString,p="function"==typeof Symbol&&!!Symbol.toStringTag,f=!(0 in[,]),h=function(){return!1};if("object"==typeof document){var d=document.all;u.call(d)===u.call(document.all)&&(h=function(e){if((f||!e)&&(void 0===e||"object"==typeof e))try{var t=u.call(e);return("[object HTMLAllCollection]"===t||"[object HTML document.all class]"===t||"[object HTMLCollection]"===t||"[object Object]"===t)&&null==e("")}catch(e){}return!1})}e.exports=s?function(e){if(h(e))return!0;if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;try{s(e,null,n)}catch(e){if(e!==i)return!1}return!l(e)&&c(e)}:function(e){if(h(e))return!0;if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;if(p)return c(e);if(l(e))return!1;var t=u.call(e);return!("[object Function]"!==t&&"[object GeneratorFunction]"!==t&&!/^\[object HTML/.test(t))&&c(e)}},function(e,t,r){"use strict";var n=r(197),i=r(379),o=n("RegExp.prototype.exec"),s=r(169);e.exports=function(e){if(!i(e))throw new s("`regex` must be a RegExp");return function(t){return null!==o(e,t)}}},function(e,t,r){"use strict";var n=r(244);e.exports=function(){return n()&&!!Symbol.toStringTag}},function(e,t,r){"use strict";e.exports=Number.isNaN||function(e){return e!=e}},function(e,t,r){"use strict";var n=r(218),i=r(385),o=r(197)("String.prototype.replace"),s=/^\s$/.test("᠎"),a=s?/^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/:/^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/,l=s?/[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/:/[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;e.exports=function(){var e=i(n(this));return o(o(e,a,""),l,"")}},function(e,t,r){"use strict";var n=r(255);e.exports=function(){return String.prototype.trim&&"​"==="​".trim()&&"᠎"==="᠎".trim()&&"_᠎"==="_᠎".trim()&&"᠎_"==="᠎_".trim()?String.prototype.trim:n}},function(e,t,r){"use strict"; -/*! https://mths.be/repeat v1.0.0 by @mathias */var n=r(249);e.exports=function(){return String.prototype.repeat||n}},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){"use strict";function n(e,t){return function(){return e.apply(t,arguments)}}r.d(t,"a",(function(){return n}))},function(e,t,r){"use strict";t.a=null},function(e,t,r){},,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";var n={name:"Loading"},i=(r(350),r(4)),o=Object(i.a)(n,(function(){this._self._c;return this._m(0)}),[function(){var e=this._self._c;return e("div",{staticClass:"vue-component loading-notice"},[e("span",{staticClass:"loading"},[this._v("Loading")])])}],!1,null,null,null);t.a=o.exports},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){const n=r(165),i=r(195),o=r(214);const s=["raster","vector","table","other"];function a(e,t){n.isObject(e)||(e={});for(let r in e)n.isObject(e[r].parameters)?e[r].parameters=o.migrateDiscoveryParameters(e[r].parameters,t):e[r].parameters={},Array.isArray(e[r].gis_data_types)?e[r].gis_data_types=e[r].gis_data_types.filter(e=>s.includes(e)):e[r].gis_data_types=[],void 0!==e[r].links&&(e[r].links=o.migrateLinks(e[r].links,t));return e}e.exports=class{static guessApiVersion(e){if(!n.isObject(e))return"0.0.0";if(i.validate(e.api_version))return e.api_version;if(i.validate(e.version))return e.version;if(Array.isArray(e.endpoints)){if(e.endpoints.find(e=>"/file_formats"===e.path||"/conformance"===e.path||"/files"===e.path))return"1.0.0";if(e.endpoints.find(e=>"/output_formats"===e.path||"/files/{user_id}"===e.path))return"0.4.2";if(!(e.backend_version||e.title||e.description||e.links))return"0.3.1"}return"0.0.0"}static convertCapabilitiesToLatestSpec(e,t=null,r=!0,s=!0,a="unknown",l="Unknown",c="0.0.0"){if(null===t&&(t=this.guessApiVersion(e)),"0.0.0"===t)return{};if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";let u=n.deepClone(e);return u.api_version=r?"1.0.0":t,n.isObject(u.billing)?u.billing=this.convertBillingToLatestSpec(u.billing,t):delete u.billing,u.endpoints=this.convertEndpointsToLatestSpec(u.endpoints,t,s),!r&&i.compare(t,"0.4.x","=")?u.stac_version="0.6.2":(r||"string"!=typeof u.stac_version)&&(u.stac_version="0.9.0"),"boolean"!=typeof u.production&&(u.production=!(!i.compare(t,"1.0.0-rc.1","=")&&!i.compare(t,"1.0.0-rc.2","="))),"string"!=typeof u.backend_version&&(u.backend_version=c),"string"!=typeof u.id&&(u.id=a),"string"!=typeof u.title&&(u.title=l),"string"!=typeof u.description&&(u.description=""),u.links=o.migrateLinks(u.links,t),u}static convertBillingToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return"string"!=typeof(e=n.isObject(e)?n.deepClone(e):{}).currency&&(e.currency=null),e}static convertEndpointsToLatestSpec(e,t,r=!1){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if(!Array.isArray(e))return[];if(e=n.deepClone(e),r){let r=i.compare(t,"0.4.x","="),n=i.compare(t,"1.0.0-rc.2","<"),s=function(e){let t="/process_graphs/{process_graph_id}",r=e.findIndex(e=>e.path===t);return r>=0?-1===e[r].methods.indexOf("PUT")&&e[r].methods.push("PUT"):e.push({path:t,methods:["PUT"]}),e};for(var o in e){let t=e[o];if(r)switch(t.path){case"/output_formats":t.path="/file_formats";break;case"/files/{user_id}":t.path="/files";break;case"/files/{user_id}/{path}":t.path="/files/{path}"}if(n)switch(t.path){case"/process_graphs":let r=t.methods.indexOf("POST");r>=0&&(t.methods.splice(r,1),s(e));break;case"/process_graphs/{process_graph_id}":let n=t.methods.indexOf("PATCH");n>=0&&(t.methods.splice(n,1),s(e))}}}return e}static convertOutputFormatsToLatestSpec(e,t){return this.convertFileFormatsToLatestSpec(e,t)}static convertFileFormatsToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return e=n.isObject(e)?n.deepClone(e):{},i.compare(t,"0.4.x","=")&&n.isObject(e)&&(e={output:e}),e.input=a(e.input,t),e.output=a(e.output,t),e}static convertServiceTypesToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if(!n.isObject(e))return{};e=n.deepClone(e);for(let r in e)n.isObject(e[r])||(e[r]={}),i.compare(t,"0.4.x","=")&&(delete e[r].attributes,n.isObject(e[r].parameters)&&(e[r].configuration=e[r].parameters),delete e[r].parameters,Array.isArray(e[r].variables)&&(e[r].process_parameters=e[r].variables.map(e=>{let t={name:e.variable_id,description:"string"==typeof e.description?e.description:"",schema:{type:["string"==typeof e.type?e.type:"string","null"]}};return void 0!==e.default&&(t.default=e.default),t})),delete e[r].variables),n.isObject(e[r].configuration)?e[r].configuration=o.migrateDiscoveryParameters(e[r].configuration,t):e[r].configuration={},Array.isArray(e[r].process_parameters)||(e[r].process_parameters=[]),void 0!==e[r].links&&(e[r].links=o.migrateLinks(e[r].links,t));return e}static convertUdfRuntimesToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if(!n.isObject(e))return{};e=n.deepClone(e);for(let r in e){if(i.compare(t,"0.4.x","=")){if(!n.isObject(e[r])){delete e[r];continue}null===e[r].description&&(e[r].description="")}"string"!=typeof e[r].type&&("string"==typeof e[r].docker?e[r].type="docker":e[r].type="language"),void 0!==e[r].links&&(e[r].links=o.migrateLinks(e[r].links,t))}return e}}},function(e,t,r){"use strict";e.exports=function e(t,r){if(t===r)return!0;if(t&&r&&"object"==typeof t&&"object"==typeof r){if(t.constructor!==r.constructor)return!1;var n,i,o;if(Array.isArray(t)){if((n=t.length)!=r.length)return!1;for(i=n;0!=i--;)if(!e(t[i],r[i]))return!1;return!0}if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(i of t.entries())if(!r.has(i[0]))return!1;for(i of t.entries())if(!e(i[1],r.get(i[0])))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(i of t.entries())if(!r.has(i[0]))return!1;return!0}if(ArrayBuffer.isView(t)&&ArrayBuffer.isView(r)){if((n=t.length)!=r.length)return!1;for(i=n;0!=i--;)if(t[i]!==r[i])return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if((n=(o=Object.keys(t)).length)!==Object.keys(r).length)return!1;for(i=n;0!=i--;)if(!Object.prototype.hasOwnProperty.call(r,o[i]))return!1;for(i=n;0!=i--;){var s=o[i];if(!e(t[s],r[s]))return!1}return!0}return t!=t&&r!=r}},function(e,t,r){var n,i,o;i=[],void 0===(o="function"==typeof(n=function(){var e=/^v?(?:\d+)(\.(?:[x*]|\d+)(\.(?:[x*]|\d+)(\.(?:[x*]|\d+))?(?:-[\da-z\-]+(?:\.[\da-z\-]+)*)?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i;function t(e){var t,r,n=e.replace(/^v/,"").replace(/\+.*$/,""),i=(r="-",-1===(t=n).indexOf(r)?t.length:t.indexOf(r)),o=n.substring(0,i).split(".");return o.push(n.substring(i+1)),o}function r(e){return isNaN(Number(e))?e:Number(e)}function n(t){if("string"!=typeof t)throw new TypeError("Invalid argument expected string");if(!e.test(t))throw new Error("Invalid argument not valid semver ('"+t+"' received)")}function i(e,i){[e,i].forEach(n);for(var o=t(e),s=t(i),a=0;ac)return 1;if(c>l)return-1}var u=o[o.length-1],p=s[s.length-1];if(u&&p){var f=u.split(".").map(r),h=p.split(".").map(r);for(a=0;ah[a])return 1;if(h[a]>f[a])return-1}}else if(u||p)return u?-1:1;return 0}var o=[">",">=","=","<","<="],s={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]};return i.validate=function(t){return"string"==typeof t&&e.test(t)},i.compare=function(e,t,r){!function(e){if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===o.indexOf(e))throw new TypeError("Invalid operator, expected one of "+o.join("|"))}(r);var n=i(e,t);return s[r].indexOf(n)>-1},i})?n.apply(t,i):n)||(e.exports=o)},function(e,t,r){const n=r(165),i=r(195),o=r(214),s={cube:"datacube",eo:"eo",label:"label",pc:"pointcloud",proj:"projection",sar:"sar",sat:"sat",sci:"scientific",view:"view"},a={"item:license":"license","item:providers":"providers","eo:instrument":"instruments","eo:platform":"platform","eo:constellation":"constellation","eo:epsg":"proj:epsg","eo:off_nadir":"view:off_nadir","eo:azimuth":"view:azimuth","eo:sun_azimuth":"view:sun_azimuth","eo:sun_elevation":"view:sun_elevation","dtr:start_datetime":"start_datetime","dtr:end_datetime":"end_datetime","pc:schema":"pc:schemas","sar:type":"sar:product_type","sar:polarization":"sar:polarizations","sar:instrument":"instruments","sar:platform":"platform","sar:constellation":"constellation","sar:off_nadir":"sat:off_nadir_angle","sar:relative_orbit":"sat:relative_orbit","sar:pass_direction":"sat:orbit_state"},l=["cube:dimensions","sci:publications","sci:doi","sci:citation"],c=["spatial","temporal","bands","other"];class u{static convertCollectionsToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return e=n.deepClone(e),Array.isArray(e.collections)?e.collections=e.collections.map(e=>u.convertCollectionToLatestSpec(e,t)).filter(e=>"string"==typeof e.id):e.collections=[],e.links=o.migrateLinks(e.links,t),e}static convertCollectionToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";let r=n.deepClone(e);if("string"!=typeof r.id||0===r.id.length)return{};if(i.validate(r.stac_version)&&!i.compare(r.stac_version,"0.9.0","<")||(r.stac_version="0.9.0"),n.isObject(r.extent)||(r.extent={}),i.compare(t,"0.4.x","=")){if(Array.isArray(r.extent.spatial)&&(r.extent.spatial={bbox:[r.extent.spatial]}),Array.isArray(r.extent.temporal)&&(r.extent.temporal={interval:[r.extent.temporal]}),n.isObject(r.properties)){n.isObject(r.other_properties)||(r.other_properties={});for(let e in r.properties)r.other_properties[e]={values:[r.properties[e]]}}delete r.properties;let e=n.isObject(r.other_properties)?r.other_properties:{};for(let t in e){let i=e[t];n.isObject(i)&&(Array.isArray(i.extent)||Array.isArray(i.values))?Array.isArray(i.extent)?e[t]={min:i.extent[0],max:i.extent[1]}:-1===i.values.findIndex(e=>!Array.isArray(e))?i.values.length<=1?e[t]=i.values[0]:e[t]=i.values.reduce((e,t)=>e.concat(t)):e[t]=i.values:(void 0===r[t]&&(r[t]=i),delete e[t])}delete r.other_properties,n.isObject(r.summaries)||(r.summaries={});for(let t in e){let n=e[t];"sar:pass_direction"===t&&(n=n.map(e=>null===e?"geostationary":e)),("sar:resolution"===t||"sar:pixel_spacing"===t||"sar:looks"===t)&&Array.isArray(n)&&n.length>=2?(r.summaries[t+"_range"]=n.slice(0,1),r.summaries[t+"_azimuth"]=n.slice(1,2),n.length>2&&(r.summaries[t+"_equivalent_number"]=n.slice(2,3))):"string"==typeof a[t]?r.summaries[a[t]]=n:l.includes(t)&&Array.isArray(n)&&1===n.length?r[t]=n[0]:r.summaries[t]=n}}if("string"!=typeof r.description&&(r.description=""),n.isObject(r.extent.spatial)||(r.extent.spatial={}),n.isObject(r.extent.temporal)||(r.extent.temporal={}),"string"!=typeof r.license&&(r.license="proprietary"),n.isObject(r.summaries)||(r.summaries={}),n.isObject(r["cube:dimensions"]))for(var u in r["cube:dimensions"])n.isObject(r["cube:dimensions"][u])&&!c.includes(r["cube:dimensions"][u].type)&&(r["cube:dimensions"][u].type="other");else r["cube:dimensions"]={};r.links=o.migrateLinks(r.links);var p=Array.isArray(r.stac_extensions)?r.stac_extensions:[];for(var f in r){let e=null,t=f.split(":",1);"deprecated"===f||"version"===f?e="version":"string"==typeof s[t]&&(e=s[t]),null===e||p.includes(e)||p.push(e)}return p.sort(),r.stac_extensions=p,r}}e.exports=u},function(e,t,r){const n=r(165),i=r(195),o=r(214);class s{static convertProcessesToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return e=n.deepClone(e),Array.isArray(e.processes)?e.processes=e.processes.map(e=>s.convertProcessToLatestSpec(e,t)).filter(e=>"string"==typeof e.id):e.processes=[],e.links=o.migrateLinks(e.links,t),e}static convertProcessToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if("string"!=typeof(e=n.deepClone(e)).id||0===e.id.length)return{};if(i.compare(t,"0.4.x","=")){if(!Array.isArray(e.parameter_order)||0===e.parameter_order.length){e.parameter_order=[];for(let t in e.parameters)e.parameter_order.push(t)}let t=[];for(let r of e.parameter_order){let i={name:r};n.isObject(e.parameters[r])&&Object.assign(i,e.parameters[r]),i.required||(i.optional=!0),delete i.required,t.push(i)}delete e.parameter_order,e.parameters=t}if("string"!=typeof e.description&&(e.description=""),Array.isArray(e.parameters))for(var r=e.parameters.length-1;r>=0;r--){let i=e.parameters[r];n.isObject(i)?("string"!=typeof i.description&&(i.description=""),e.parameters[r]=a(i,t)):e.parameters.splice(r,1)}else e.parameters=[];return n.isObject(e.returns)||(e.returns={}),e.returns=a(e.returns,t,!1),Array.isArray(e.examples)&&(e.examples=e.examples.filter(e=>n.isObject(e)&&n.isObject(e.arguments))),void 0!==e.links&&(e.links=o.migrateLinks(e.links,t)),e}}function a(e,t,r=!0){var n={};if(e.schema&&"object"==typeof e.schema&&(n=e.schema),i.compare(t,"0.4.x","=")){for(let t of["anyOf","oneOf"])if(Array.isArray(n[t])){r&&void 0!==n.default&&(e.default=n.default),n=n[t];break}let o=i.compare(t,"0.4.x")<=0&&void 0!==e.media_type,s=Array.isArray(n)?n:[n];for(let t of s)t=l(t),r&&void 0!==t.default&&(e.default=t.default,delete t.default),o&&(t.contentMediaType=e.media_type);o&&delete e.media_type}return i.compare(t,"0.4.x",">")&&void 0!==e.default&&(e.optional=!0),e.schema=n,e}function l(e){if(n.isObject(e)&&void 0!==e.type&&"string"==typeof e.format){switch(e.format){case"url":e.format="uri";break;case"proj-definition":e.deprecated=!0;break;case"callback":if(e.format="process-graph",n.isObject(e.parameters)){let t=[];for(let r in e.parameters){let n=e.parameters[r],i={name:r,description:"string"==typeof n.description?n.description:"",schema:n};t.push(i)}e.parameters=t}}e.subtype=e.format,["date-time","time","date","uri"].includes(e.format)||delete e.format}for(let t in e)e[t]&&"object"==typeof e[t]&&(e[t]=l(e[t]));return e}e.exports=s},function(e,t,r){const n=r(235);e.exports=class extends n{constructor(e){super(e.schema,e.default),Object.assign(this,e)}}},function(e,t,r){"use strict";r(237)},function(e,t,r){"use strict";var n={};function i(e,t,r){var o,s,a,l,c,u="";for("string"!=typeof t&&(r=t,t=i.defaultChars),void 0===r&&(r=!0),c=function(e){var t,r,i=n[e];if(i)return i;for(i=n[e]=[],t=0;t<128;t++)r=String.fromCharCode(t),/^[0-9a-z]$/i.test(r)?i.push(r):i.push("%"+("0"+t.toString(16).toUpperCase()).slice(-2));for(t=0;t=55296&&a<=57343){if(a>=55296&&a<=56319&&o+1=56320&&l<=57343){u+=encodeURIComponent(e[o]+e[o+1]),o++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[o]);return u}i.defaultChars=";/?:@&=+$,-_.!~*'()#",i.componentChars="-_.!~*'()",e.exports=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array([14866,60,237,340,721,1312,1562,1654,1838,1957,2183,2239,2301,2958,3037,3893,4123,4298,4330,4801,5191,5395,5752,5903,5943,5972,6050,0,0,0,0,0,0,6135,6565,7422,8183,8738,9242,9503,9938,10189,10573,10637,10715,11950,12246,13539,13950,14445,14533,15364,16514,16980,17390,17763,17849,18036,18125,4096,69,77,97,98,99,102,103,108,109,110,111,112,114,115,116,117,92,100,106,115,122,137,142,151,157,163,167,182,196,204,220,229,108,105,103,33024,198,59,32768,198,80,33024,38,59,32768,38,99,117,116,101,33024,193,59,32768,193,114,101,118,101,59,32768,258,512,105,121,127,134,114,99,33024,194,59,32768,194,59,32768,1040,114,59,32896,55349,56580,114,97,118,101,33024,192,59,32768,192,112,104,97,59,32768,913,97,99,114,59,32768,256,100,59,32768,10835,512,103,112,172,177,111,110,59,32768,260,102,59,32896,55349,56632,112,108,121,70,117,110,99,116,105,111,110,59,32768,8289,105,110,103,33024,197,59,32768,197,512,99,115,209,214,114,59,32896,55349,56476,105,103,110,59,32768,8788,105,108,100,101,33024,195,59,32768,195,109,108,33024,196,59,32768,196,2048,97,99,101,102,111,114,115,117,253,278,282,310,315,321,327,332,512,99,114,258,267,107,115,108,97,115,104,59,32768,8726,583,271,274,59,32768,10983,101,100,59,32768,8966,121,59,32768,1041,768,99,114,116,289,296,306,97,117,115,101,59,32768,8757,110,111,117,108,108,105,115,59,32768,8492,97,59,32768,914,114,59,32896,55349,56581,112,102,59,32896,55349,56633,101,118,101,59,32768,728,99,114,59,32768,8492,109,112,101,113,59,32768,8782,3584,72,79,97,99,100,101,102,104,105,108,111,114,115,117,368,373,380,426,461,466,487,491,495,533,593,695,701,707,99,121,59,32768,1063,80,89,33024,169,59,32768,169,768,99,112,121,387,393,419,117,116,101,59,32768,262,512,59,105,398,400,32768,8914,116,97,108,68,105,102,102,101,114,101,110,116,105,97,108,68,59,32768,8517,108,101,121,115,59,32768,8493,1024,97,101,105,111,435,441,449,454,114,111,110,59,32768,268,100,105,108,33024,199,59,32768,199,114,99,59,32768,264,110,105,110,116,59,32768,8752,111,116,59,32768,266,512,100,110,471,478,105,108,108,97,59,32768,184,116,101,114,68,111,116,59,32768,183,114,59,32768,8493,105,59,32768,935,114,99,108,101,1024,68,77,80,84,508,513,520,526,111,116,59,32768,8857,105,110,117,115,59,32768,8854,108,117,115,59,32768,8853,105,109,101,115,59,32768,8855,111,512,99,115,539,562,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,32768,8754,101,67,117,114,108,121,512,68,81,573,586,111,117,98,108,101,81,117,111,116,101,59,32768,8221,117,111,116,101,59,32768,8217,1024,108,110,112,117,602,614,648,664,111,110,512,59,101,609,611,32768,8759,59,32768,10868,768,103,105,116,621,629,634,114,117,101,110,116,59,32768,8801,110,116,59,32768,8751,111,117,114,73,110,116,101,103,114,97,108,59,32768,8750,512,102,114,653,656,59,32768,8450,111,100,117,99,116,59,32768,8720,110,116,101,114,67,108,111,99,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,32768,8755,111,115,115,59,32768,10799,99,114,59,32896,55349,56478,112,512,59,67,713,715,32768,8915,97,112,59,32768,8781,2816,68,74,83,90,97,99,101,102,105,111,115,743,758,763,768,773,795,809,821,826,910,1295,512,59,111,748,750,32768,8517,116,114,97,104,100,59,32768,10513,99,121,59,32768,1026,99,121,59,32768,1029,99,121,59,32768,1039,768,103,114,115,780,786,790,103,101,114,59,32768,8225,114,59,32768,8609,104,118,59,32768,10980,512,97,121,800,806,114,111,110,59,32768,270,59,32768,1044,108,512,59,116,815,817,32768,8711,97,59,32768,916,114,59,32896,55349,56583,512,97,102,831,897,512,99,109,836,891,114,105,116,105,99,97,108,1024,65,68,71,84,852,859,877,884,99,117,116,101,59,32768,180,111,581,864,867,59,32768,729,98,108,101,65,99,117,116,101,59,32768,733,114,97,118,101,59,32768,96,105,108,100,101,59,32768,732,111,110,100,59,32768,8900,102,101,114,101,110,116,105,97,108,68,59,32768,8518,2113,920,0,0,0,925,946,0,1139,102,59,32896,55349,56635,768,59,68,69,931,933,938,32768,168,111,116,59,32768,8412,113,117,97,108,59,32768,8784,98,108,101,1536,67,68,76,82,85,86,961,978,996,1080,1101,1125,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,32768,8751,111,1093,985,0,0,988,59,32768,168,110,65,114,114,111,119,59,32768,8659,512,101,111,1001,1034,102,116,768,65,82,84,1010,1017,1029,114,114,111,119,59,32768,8656,105,103,104,116,65,114,114,111,119,59,32768,8660,101,101,59,32768,10980,110,103,512,76,82,1041,1068,101,102,116,512,65,82,1049,1056,114,114,111,119,59,32768,10232,105,103,104,116,65,114,114,111,119,59,32768,10234,105,103,104,116,65,114,114,111,119,59,32768,10233,105,103,104,116,512,65,84,1089,1096,114,114,111,119,59,32768,8658,101,101,59,32768,8872,112,1042,1108,0,0,1115,114,114,111,119,59,32768,8657,111,119,110,65,114,114,111,119,59,32768,8661,101,114,116,105,99,97,108,66,97,114,59,32768,8741,110,1536,65,66,76,82,84,97,1152,1179,1186,1236,1272,1288,114,114,111,119,768,59,66,85,1163,1165,1170,32768,8595,97,114,59,32768,10515,112,65,114,114,111,119,59,32768,8693,114,101,118,101,59,32768,785,101,102,116,1315,1196,0,1209,0,1220,105,103,104,116,86,101,99,116,111,114,59,32768,10576,101,101,86,101,99,116,111,114,59,32768,10590,101,99,116,111,114,512,59,66,1229,1231,32768,8637,97,114,59,32768,10582,105,103,104,116,805,1245,0,1256,101,101,86,101,99,116,111,114,59,32768,10591,101,99,116,111,114,512,59,66,1265,1267,32768,8641,97,114,59,32768,10583,101,101,512,59,65,1279,1281,32768,8868,114,114,111,119,59,32768,8615,114,114,111,119,59,32768,8659,512,99,116,1300,1305,114,59,32896,55349,56479,114,111,107,59,32768,272,4096,78,84,97,99,100,102,103,108,109,111,112,113,115,116,117,120,1344,1348,1354,1363,1386,1391,1396,1405,1413,1460,1475,1483,1514,1527,1531,1538,71,59,32768,330,72,33024,208,59,32768,208,99,117,116,101,33024,201,59,32768,201,768,97,105,121,1370,1376,1383,114,111,110,59,32768,282,114,99,33024,202,59,32768,202,59,32768,1069,111,116,59,32768,278,114,59,32896,55349,56584,114,97,118,101,33024,200,59,32768,200,101,109,101,110,116,59,32768,8712,512,97,112,1418,1423,99,114,59,32768,274,116,121,1060,1431,0,0,1444,109,97,108,108,83,113,117,97,114,101,59,32768,9723,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,32768,9643,512,103,112,1465,1470,111,110,59,32768,280,102,59,32896,55349,56636,115,105,108,111,110,59,32768,917,117,512,97,105,1489,1504,108,512,59,84,1495,1497,32768,10869,105,108,100,101,59,32768,8770,108,105,98,114,105,117,109,59,32768,8652,512,99,105,1519,1523,114,59,32768,8496,109,59,32768,10867,97,59,32768,919,109,108,33024,203,59,32768,203,512,105,112,1543,1549,115,116,115,59,32768,8707,111,110,101,110,116,105,97,108,69,59,32768,8519,1280,99,102,105,111,115,1572,1576,1581,1620,1648,121,59,32768,1060,114,59,32896,55349,56585,108,108,101,100,1060,1591,0,0,1604,109,97,108,108,83,113,117,97,114,101,59,32768,9724,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,32768,9642,1601,1628,0,1633,0,0,1639,102,59,32896,55349,56637,65,108,108,59,32768,8704,114,105,101,114,116,114,102,59,32768,8497,99,114,59,32768,8497,3072,74,84,97,98,99,100,102,103,111,114,115,116,1678,1683,1688,1701,1708,1729,1734,1739,1742,1748,1828,1834,99,121,59,32768,1027,33024,62,59,32768,62,109,109,97,512,59,100,1696,1698,32768,915,59,32768,988,114,101,118,101,59,32768,286,768,101,105,121,1715,1721,1726,100,105,108,59,32768,290,114,99,59,32768,284,59,32768,1043,111,116,59,32768,288,114,59,32896,55349,56586,59,32768,8921,112,102,59,32896,55349,56638,101,97,116,101,114,1536,69,70,71,76,83,84,1766,1783,1794,1803,1809,1821,113,117,97,108,512,59,76,1775,1777,32768,8805,101,115,115,59,32768,8923,117,108,108,69,113,117,97,108,59,32768,8807,114,101,97,116,101,114,59,32768,10914,101,115,115,59,32768,8823,108,97,110,116,69,113,117,97,108,59,32768,10878,105,108,100,101,59,32768,8819,99,114,59,32896,55349,56482,59,32768,8811,2048,65,97,99,102,105,111,115,117,1854,1861,1874,1880,1884,1897,1919,1934,82,68,99,121,59,32768,1066,512,99,116,1866,1871,101,107,59,32768,711,59,32768,94,105,114,99,59,32768,292,114,59,32768,8460,108,98,101,114,116,83,112,97,99,101,59,32768,8459,833,1902,0,1906,102,59,32768,8461,105,122,111,110,116,97,108,76,105,110,101,59,32768,9472,512,99,116,1924,1928,114,59,32768,8459,114,111,107,59,32768,294,109,112,533,1940,1950,111,119,110,72,117,109,112,59,32768,8782,113,117,97,108,59,32768,8783,3584,69,74,79,97,99,100,102,103,109,110,111,115,116,117,1985,1990,1996,2001,2010,2025,2030,2034,2043,2077,2134,2155,2160,2167,99,121,59,32768,1045,108,105,103,59,32768,306,99,121,59,32768,1025,99,117,116,101,33024,205,59,32768,205,512,105,121,2015,2022,114,99,33024,206,59,32768,206,59,32768,1048,111,116,59,32768,304,114,59,32768,8465,114,97,118,101,33024,204,59,32768,204,768,59,97,112,2050,2052,2070,32768,8465,512,99,103,2057,2061,114,59,32768,298,105,110,97,114,121,73,59,32768,8520,108,105,101,115,59,32768,8658,837,2082,0,2110,512,59,101,2086,2088,32768,8748,512,103,114,2093,2099,114,97,108,59,32768,8747,115,101,99,116,105,111,110,59,32768,8898,105,115,105,98,108,101,512,67,84,2120,2127,111,109,109,97,59,32768,8291,105,109,101,115,59,32768,8290,768,103,112,116,2141,2146,2151,111,110,59,32768,302,102,59,32896,55349,56640,97,59,32768,921,99,114,59,32768,8464,105,108,100,101,59,32768,296,828,2172,0,2177,99,121,59,32768,1030,108,33024,207,59,32768,207,1280,99,102,111,115,117,2193,2206,2211,2217,2232,512,105,121,2198,2203,114,99,59,32768,308,59,32768,1049,114,59,32896,55349,56589,112,102,59,32896,55349,56641,820,2222,0,2227,114,59,32896,55349,56485,114,99,121,59,32768,1032,107,99,121,59,32768,1028,1792,72,74,97,99,102,111,115,2253,2258,2263,2269,2283,2288,2294,99,121,59,32768,1061,99,121,59,32768,1036,112,112,97,59,32768,922,512,101,121,2274,2280,100,105,108,59,32768,310,59,32768,1050,114,59,32896,55349,56590,112,102,59,32896,55349,56642,99,114,59,32896,55349,56486,2816,74,84,97,99,101,102,108,109,111,115,116,2323,2328,2333,2374,2396,2775,2780,2797,2804,2934,2954,99,121,59,32768,1033,33024,60,59,32768,60,1280,99,109,110,112,114,2344,2350,2356,2360,2370,117,116,101,59,32768,313,98,100,97,59,32768,923,103,59,32768,10218,108,97,99,101,116,114,102,59,32768,8466,114,59,32768,8606,768,97,101,121,2381,2387,2393,114,111,110,59,32768,317,100,105,108,59,32768,315,59,32768,1051,512,102,115,2401,2702,116,2560,65,67,68,70,82,84,85,86,97,114,2423,2470,2479,2530,2537,2561,2618,2666,2683,2690,512,110,114,2428,2441,103,108,101,66,114,97,99,107,101,116,59,32768,10216,114,111,119,768,59,66,82,2451,2453,2458,32768,8592,97,114,59,32768,8676,105,103,104,116,65,114,114,111,119,59,32768,8646,101,105,108,105,110,103,59,32768,8968,111,838,2485,0,2498,98,108,101,66,114,97,99,107,101,116,59,32768,10214,110,805,2503,0,2514,101,101,86,101,99,116,111,114,59,32768,10593,101,99,116,111,114,512,59,66,2523,2525,32768,8643,97,114,59,32768,10585,108,111,111,114,59,32768,8970,105,103,104,116,512,65,86,2546,2553,114,114,111,119,59,32768,8596,101,99,116,111,114,59,32768,10574,512,101,114,2566,2591,101,768,59,65,86,2574,2576,2583,32768,8867,114,114,111,119,59,32768,8612,101,99,116,111,114,59,32768,10586,105,97,110,103,108,101,768,59,66,69,2604,2606,2611,32768,8882,97,114,59,32768,10703,113,117,97,108,59,32768,8884,112,768,68,84,86,2626,2638,2649,111,119,110,86,101,99,116,111,114,59,32768,10577,101,101,86,101,99,116,111,114,59,32768,10592,101,99,116,111,114,512,59,66,2659,2661,32768,8639,97,114,59,32768,10584,101,99,116,111,114,512,59,66,2676,2678,32768,8636,97,114,59,32768,10578,114,114,111,119,59,32768,8656,105,103,104,116,97,114,114,111,119,59,32768,8660,115,1536,69,70,71,76,83,84,2716,2730,2741,2750,2756,2768,113,117,97,108,71,114,101,97,116,101,114,59,32768,8922,117,108,108,69,113,117,97,108,59,32768,8806,114,101,97,116,101,114,59,32768,8822,101,115,115,59,32768,10913,108,97,110,116,69,113,117,97,108,59,32768,10877,105,108,100,101,59,32768,8818,114,59,32896,55349,56591,512,59,101,2785,2787,32768,8920,102,116,97,114,114,111,119,59,32768,8666,105,100,111,116,59,32768,319,768,110,112,119,2811,2899,2904,103,1024,76,82,108,114,2821,2848,2860,2887,101,102,116,512,65,82,2829,2836,114,114,111,119,59,32768,10229,105,103,104,116,65,114,114,111,119,59,32768,10231,105,103,104,116,65,114,114,111,119,59,32768,10230,101,102,116,512,97,114,2868,2875,114,114,111,119,59,32768,10232,105,103,104,116,97,114,114,111,119,59,32768,10234,105,103,104,116,97,114,114,111,119,59,32768,10233,102,59,32896,55349,56643,101,114,512,76,82,2911,2922,101,102,116,65,114,114,111,119,59,32768,8601,105,103,104,116,65,114,114,111,119,59,32768,8600,768,99,104,116,2941,2945,2948,114,59,32768,8466,59,32768,8624,114,111,107,59,32768,321,59,32768,8810,2048,97,99,101,102,105,111,115,117,2974,2978,2982,3007,3012,3022,3028,3033,112,59,32768,10501,121,59,32768,1052,512,100,108,2987,2998,105,117,109,83,112,97,99,101,59,32768,8287,108,105,110,116,114,102,59,32768,8499,114,59,32896,55349,56592,110,117,115,80,108,117,115,59,32768,8723,112,102,59,32896,55349,56644,99,114,59,32768,8499,59,32768,924,2304,74,97,99,101,102,111,115,116,117,3055,3060,3067,3089,3201,3206,3874,3880,3889,99,121,59,32768,1034,99,117,116,101,59,32768,323,768,97,101,121,3074,3080,3086,114,111,110,59,32768,327,100,105,108,59,32768,325,59,32768,1053,768,103,115,119,3096,3160,3194,97,116,105,118,101,768,77,84,86,3108,3121,3145,101,100,105,117,109,83,112,97,99,101,59,32768,8203,104,105,512,99,110,3128,3137,107,83,112,97,99,101,59,32768,8203,83,112,97,99,101,59,32768,8203,101,114,121,84,104,105,110,83,112,97,99,101,59,32768,8203,116,101,100,512,71,76,3168,3184,114,101,97,116,101,114,71,114,101,97,116,101,114,59,32768,8811,101,115,115,76,101,115,115,59,32768,8810,76,105,110,101,59,32768,10,114,59,32896,55349,56593,1024,66,110,112,116,3215,3222,3238,3242,114,101,97,107,59,32768,8288,66,114,101,97,107,105,110,103,83,112,97,99,101,59,32768,160,102,59,32768,8469,3328,59,67,68,69,71,72,76,78,80,82,83,84,86,3269,3271,3293,3312,3352,3430,3455,3551,3589,3625,3678,3821,3861,32768,10988,512,111,117,3276,3286,110,103,114,117,101,110,116,59,32768,8802,112,67,97,112,59,32768,8813,111,117,98,108,101,86,101,114,116,105,99,97,108,66,97,114,59,32768,8742,768,108,113,120,3319,3327,3345,101,109,101,110,116,59,32768,8713,117,97,108,512,59,84,3335,3337,32768,8800,105,108,100,101,59,32896,8770,824,105,115,116,115,59,32768,8708,114,101,97,116,101,114,1792,59,69,70,71,76,83,84,3373,3375,3382,3394,3404,3410,3423,32768,8815,113,117,97,108,59,32768,8817,117,108,108,69,113,117,97,108,59,32896,8807,824,114,101,97,116,101,114,59,32896,8811,824,101,115,115,59,32768,8825,108,97,110,116,69,113,117,97,108,59,32896,10878,824,105,108,100,101,59,32768,8821,117,109,112,533,3437,3448,111,119,110,72,117,109,112,59,32896,8782,824,113,117,97,108,59,32896,8783,824,101,512,102,115,3461,3492,116,84,114,105,97,110,103,108,101,768,59,66,69,3477,3479,3485,32768,8938,97,114,59,32896,10703,824,113,117,97,108,59,32768,8940,115,1536,59,69,71,76,83,84,3506,3508,3515,3524,3531,3544,32768,8814,113,117,97,108,59,32768,8816,114,101,97,116,101,114,59,32768,8824,101,115,115,59,32896,8810,824,108,97,110,116,69,113,117,97,108,59,32896,10877,824,105,108,100,101,59,32768,8820,101,115,116,101,100,512,71,76,3561,3578,114,101,97,116,101,114,71,114,101,97,116,101,114,59,32896,10914,824,101,115,115,76,101,115,115,59,32896,10913,824,114,101,99,101,100,101,115,768,59,69,83,3603,3605,3613,32768,8832,113,117,97,108,59,32896,10927,824,108,97,110,116,69,113,117,97,108,59,32768,8928,512,101,105,3630,3645,118,101,114,115,101,69,108,101,109,101,110,116,59,32768,8716,103,104,116,84,114,105,97,110,103,108,101,768,59,66,69,3663,3665,3671,32768,8939,97,114,59,32896,10704,824,113,117,97,108,59,32768,8941,512,113,117,3683,3732,117,97,114,101,83,117,512,98,112,3694,3712,115,101,116,512,59,69,3702,3705,32896,8847,824,113,117,97,108,59,32768,8930,101,114,115,101,116,512,59,69,3722,3725,32896,8848,824,113,117,97,108,59,32768,8931,768,98,99,112,3739,3757,3801,115,101,116,512,59,69,3747,3750,32896,8834,8402,113,117,97,108,59,32768,8840,99,101,101,100,115,1024,59,69,83,84,3771,3773,3781,3793,32768,8833,113,117,97,108,59,32896,10928,824,108,97,110,116,69,113,117,97,108,59,32768,8929,105,108,100,101,59,32896,8831,824,101,114,115,101,116,512,59,69,3811,3814,32896,8835,8402,113,117,97,108,59,32768,8841,105,108,100,101,1024,59,69,70,84,3834,3836,3843,3854,32768,8769,113,117,97,108,59,32768,8772,117,108,108,69,113,117,97,108,59,32768,8775,105,108,100,101,59,32768,8777,101,114,116,105,99,97,108,66,97,114,59,32768,8740,99,114,59,32896,55349,56489,105,108,100,101,33024,209,59,32768,209,59,32768,925,3584,69,97,99,100,102,103,109,111,112,114,115,116,117,118,3921,3927,3936,3951,3958,3963,3972,3996,4002,4034,4037,4055,4071,4078,108,105,103,59,32768,338,99,117,116,101,33024,211,59,32768,211,512,105,121,3941,3948,114,99,33024,212,59,32768,212,59,32768,1054,98,108,97,99,59,32768,336,114,59,32896,55349,56594,114,97,118,101,33024,210,59,32768,210,768,97,101,105,3979,3984,3989,99,114,59,32768,332,103,97,59,32768,937,99,114,111,110,59,32768,927,112,102,59,32896,55349,56646,101,110,67,117,114,108,121,512,68,81,4014,4027,111,117,98,108,101,81,117,111,116,101,59,32768,8220,117,111,116,101,59,32768,8216,59,32768,10836,512,99,108,4042,4047,114,59,32896,55349,56490,97,115,104,33024,216,59,32768,216,105,573,4060,4067,100,101,33024,213,59,32768,213,101,115,59,32768,10807,109,108,33024,214,59,32768,214,101,114,512,66,80,4085,4109,512,97,114,4090,4094,114,59,32768,8254,97,99,512,101,107,4101,4104,59,32768,9182,101,116,59,32768,9140,97,114,101,110,116,104,101,115,105,115,59,32768,9180,2304,97,99,102,104,105,108,111,114,115,4141,4150,4154,4159,4163,4166,4176,4198,4284,114,116,105,97,108,68,59,32768,8706,121,59,32768,1055,114,59,32896,55349,56595,105,59,32768,934,59,32768,928,117,115,77,105,110,117,115,59,32768,177,512,105,112,4181,4194,110,99,97,114,101,112,108,97,110,101,59,32768,8460,102,59,32768,8473,1024,59,101,105,111,4207,4209,4251,4256,32768,10939,99,101,100,101,115,1024,59,69,83,84,4223,4225,4232,4244,32768,8826,113,117,97,108,59,32768,10927,108,97,110,116,69,113,117,97,108,59,32768,8828,105,108,100,101,59,32768,8830,109,101,59,32768,8243,512,100,112,4261,4267,117,99,116,59,32768,8719,111,114,116,105,111,110,512,59,97,4278,4280,32768,8759,108,59,32768,8733,512,99,105,4289,4294,114,59,32896,55349,56491,59,32768,936,1024,85,102,111,115,4306,4313,4318,4323,79,84,33024,34,59,32768,34,114,59,32896,55349,56596,112,102,59,32768,8474,99,114,59,32896,55349,56492,3072,66,69,97,99,101,102,104,105,111,114,115,117,4354,4360,4366,4395,4417,4473,4477,4481,4743,4764,4776,4788,97,114,114,59,32768,10512,71,33024,174,59,32768,174,768,99,110,114,4373,4379,4383,117,116,101,59,32768,340,103,59,32768,10219,114,512,59,116,4389,4391,32768,8608,108,59,32768,10518,768,97,101,121,4402,4408,4414,114,111,110,59,32768,344,100,105,108,59,32768,342,59,32768,1056,512,59,118,4422,4424,32768,8476,101,114,115,101,512,69,85,4433,4458,512,108,113,4438,4446,101,109,101,110,116,59,32768,8715,117,105,108,105,98,114,105,117,109,59,32768,8651,112,69,113,117,105,108,105,98,114,105,117,109,59,32768,10607,114,59,32768,8476,111,59,32768,929,103,104,116,2048,65,67,68,70,84,85,86,97,4501,4547,4556,4607,4614,4671,4719,4736,512,110,114,4506,4519,103,108,101,66,114,97,99,107,101,116,59,32768,10217,114,111,119,768,59,66,76,4529,4531,4536,32768,8594,97,114,59,32768,8677,101,102,116,65,114,114,111,119,59,32768,8644,101,105,108,105,110,103,59,32768,8969,111,838,4562,0,4575,98,108,101,66,114,97,99,107,101,116,59,32768,10215,110,805,4580,0,4591,101,101,86,101,99,116,111,114,59,32768,10589,101,99,116,111,114,512,59,66,4600,4602,32768,8642,97,114,59,32768,10581,108,111,111,114,59,32768,8971,512,101,114,4619,4644,101,768,59,65,86,4627,4629,4636,32768,8866,114,114,111,119,59,32768,8614,101,99,116,111,114,59,32768,10587,105,97,110,103,108,101,768,59,66,69,4657,4659,4664,32768,8883,97,114,59,32768,10704,113,117,97,108,59,32768,8885,112,768,68,84,86,4679,4691,4702,111,119,110,86,101,99,116,111,114,59,32768,10575,101,101,86,101,99,116,111,114,59,32768,10588,101,99,116,111,114,512,59,66,4712,4714,32768,8638,97,114,59,32768,10580,101,99,116,111,114,512,59,66,4729,4731,32768,8640,97,114,59,32768,10579,114,114,111,119,59,32768,8658,512,112,117,4748,4752,102,59,32768,8477,110,100,73,109,112,108,105,101,115,59,32768,10608,105,103,104,116,97,114,114,111,119,59,32768,8667,512,99,104,4781,4785,114,59,32768,8475,59,32768,8625,108,101,68,101,108,97,121,101,100,59,32768,10740,3328,72,79,97,99,102,104,105,109,111,113,115,116,117,4827,4842,4849,4856,4889,4894,4949,4955,4967,4973,5059,5065,5070,512,67,99,4832,4838,72,99,121,59,32768,1065,121,59,32768,1064,70,84,99,121,59,32768,1068,99,117,116,101,59,32768,346,1280,59,97,101,105,121,4867,4869,4875,4881,4886,32768,10940,114,111,110,59,32768,352,100,105,108,59,32768,350,114,99,59,32768,348,59,32768,1057,114,59,32896,55349,56598,111,114,116,1024,68,76,82,85,4906,4917,4928,4940,111,119,110,65,114,114,111,119,59,32768,8595,101,102,116,65,114,114,111,119,59,32768,8592,105,103,104,116,65,114,114,111,119,59,32768,8594,112,65,114,114,111,119,59,32768,8593,103,109,97,59,32768,931,97,108,108,67,105,114,99,108,101,59,32768,8728,112,102,59,32896,55349,56650,1091,4979,0,0,4983,116,59,32768,8730,97,114,101,1024,59,73,83,85,4994,4996,5010,5052,32768,9633,110,116,101,114,115,101,99,116,105,111,110,59,32768,8851,117,512,98,112,5016,5033,115,101,116,512,59,69,5024,5026,32768,8847,113,117,97,108,59,32768,8849,101,114,115,101,116,512,59,69,5043,5045,32768,8848,113,117,97,108,59,32768,8850,110,105,111,110,59,32768,8852,99,114,59,32896,55349,56494,97,114,59,32768,8902,1024,98,99,109,112,5079,5102,5155,5158,512,59,115,5084,5086,32768,8912,101,116,512,59,69,5093,5095,32768,8912,113,117,97,108,59,32768,8838,512,99,104,5107,5148,101,101,100,115,1024,59,69,83,84,5120,5122,5129,5141,32768,8827,113,117,97,108,59,32768,10928,108,97,110,116,69,113,117,97,108,59,32768,8829,105,108,100,101,59,32768,8831,84,104,97,116,59,32768,8715,59,32768,8721,768,59,101,115,5165,5167,5185,32768,8913,114,115,101,116,512,59,69,5176,5178,32768,8835,113,117,97,108,59,32768,8839,101,116,59,32768,8913,2816,72,82,83,97,99,102,104,105,111,114,115,5213,5221,5227,5241,5252,5274,5279,5323,5362,5368,5378,79,82,78,33024,222,59,32768,222,65,68,69,59,32768,8482,512,72,99,5232,5237,99,121,59,32768,1035,121,59,32768,1062,512,98,117,5246,5249,59,32768,9,59,32768,932,768,97,101,121,5259,5265,5271,114,111,110,59,32768,356,100,105,108,59,32768,354,59,32768,1058,114,59,32896,55349,56599,512,101,105,5284,5300,835,5289,0,5297,101,102,111,114,101,59,32768,8756,97,59,32768,920,512,99,110,5305,5315,107,83,112,97,99,101,59,32896,8287,8202,83,112,97,99,101,59,32768,8201,108,100,101,1024,59,69,70,84,5335,5337,5344,5355,32768,8764,113,117,97,108,59,32768,8771,117,108,108,69,113,117,97,108,59,32768,8773,105,108,100,101,59,32768,8776,112,102,59,32896,55349,56651,105,112,108,101,68,111,116,59,32768,8411,512,99,116,5383,5388,114,59,32896,55349,56495,114,111,107,59,32768,358,5426,5417,5444,5458,5473,0,5480,5485,0,0,0,0,0,5494,5500,5564,5579,0,5726,5732,5738,5745,512,99,114,5421,5429,117,116,101,33024,218,59,32768,218,114,512,59,111,5435,5437,32768,8607,99,105,114,59,32768,10569,114,820,5449,0,5453,121,59,32768,1038,118,101,59,32768,364,512,105,121,5462,5469,114,99,33024,219,59,32768,219,59,32768,1059,98,108,97,99,59,32768,368,114,59,32896,55349,56600,114,97,118,101,33024,217,59,32768,217,97,99,114,59,32768,362,512,100,105,5504,5548,101,114,512,66,80,5511,5535,512,97,114,5516,5520,114,59,32768,95,97,99,512,101,107,5527,5530,59,32768,9183,101,116,59,32768,9141,97,114,101,110,116,104,101,115,105,115,59,32768,9181,111,110,512,59,80,5555,5557,32768,8899,108,117,115,59,32768,8846,512,103,112,5568,5573,111,110,59,32768,370,102,59,32896,55349,56652,2048,65,68,69,84,97,100,112,115,5595,5624,5635,5648,5664,5671,5682,5712,114,114,111,119,768,59,66,68,5606,5608,5613,32768,8593,97,114,59,32768,10514,111,119,110,65,114,114,111,119,59,32768,8645,111,119,110,65,114,114,111,119,59,32768,8597,113,117,105,108,105,98,114,105,117,109,59,32768,10606,101,101,512,59,65,5655,5657,32768,8869,114,114,111,119,59,32768,8613,114,114,111,119,59,32768,8657,111,119,110,97,114,114,111,119,59,32768,8661,101,114,512,76,82,5689,5700,101,102,116,65,114,114,111,119,59,32768,8598,105,103,104,116,65,114,114,111,119,59,32768,8599,105,512,59,108,5718,5720,32768,978,111,110,59,32768,933,105,110,103,59,32768,366,99,114,59,32896,55349,56496,105,108,100,101,59,32768,360,109,108,33024,220,59,32768,220,2304,68,98,99,100,101,102,111,115,118,5770,5776,5781,5785,5798,5878,5883,5889,5895,97,115,104,59,32768,8875,97,114,59,32768,10987,121,59,32768,1042,97,115,104,512,59,108,5793,5795,32768,8873,59,32768,10982,512,101,114,5803,5806,59,32768,8897,768,98,116,121,5813,5818,5866,97,114,59,32768,8214,512,59,105,5823,5825,32768,8214,99,97,108,1024,66,76,83,84,5837,5842,5848,5859,97,114,59,32768,8739,105,110,101,59,32768,124,101,112,97,114,97,116,111,114,59,32768,10072,105,108,100,101,59,32768,8768,84,104,105,110,83,112,97,99,101,59,32768,8202,114,59,32896,55349,56601,112,102,59,32896,55349,56653,99,114,59,32896,55349,56497,100,97,115,104,59,32768,8874,1280,99,101,102,111,115,5913,5919,5925,5930,5936,105,114,99,59,32768,372,100,103,101,59,32768,8896,114,59,32896,55349,56602,112,102,59,32896,55349,56654,99,114,59,32896,55349,56498,1024,102,105,111,115,5951,5956,5959,5965,114,59,32896,55349,56603,59,32768,926,112,102,59,32896,55349,56655,99,114,59,32896,55349,56499,2304,65,73,85,97,99,102,111,115,117,5990,5995,6e3,6005,6014,6027,6032,6038,6044,99,121,59,32768,1071,99,121,59,32768,1031,99,121,59,32768,1070,99,117,116,101,33024,221,59,32768,221,512,105,121,6019,6024,114,99,59,32768,374,59,32768,1067,114,59,32896,55349,56604,112,102,59,32896,55349,56656,99,114,59,32896,55349,56500,109,108,59,32768,376,2048,72,97,99,100,101,102,111,115,6066,6071,6078,6092,6097,6119,6123,6128,99,121,59,32768,1046,99,117,116,101,59,32768,377,512,97,121,6083,6089,114,111,110,59,32768,381,59,32768,1047,111,116,59,32768,379,835,6102,0,6116,111,87,105,100,116,104,83,112,97,99,101,59,32768,8203,97,59,32768,918,114,59,32768,8488,112,102,59,32768,8484,99,114,59,32896,55349,56501,5938,6159,6168,6175,0,6214,6222,6233,0,0,0,0,6242,6267,6290,6429,6444,0,6495,6503,6531,6540,0,6547,99,117,116,101,33024,225,59,32768,225,114,101,118,101,59,32768,259,1536,59,69,100,105,117,121,6187,6189,6193,6196,6203,6210,32768,8766,59,32896,8766,819,59,32768,8767,114,99,33024,226,59,32768,226,116,101,33024,180,59,32768,180,59,32768,1072,108,105,103,33024,230,59,32768,230,512,59,114,6226,6228,32768,8289,59,32896,55349,56606,114,97,118,101,33024,224,59,32768,224,512,101,112,6246,6261,512,102,112,6251,6257,115,121,109,59,32768,8501,104,59,32768,8501,104,97,59,32768,945,512,97,112,6271,6284,512,99,108,6276,6280,114,59,32768,257,103,59,32768,10815,33024,38,59,32768,38,1077,6295,0,0,6326,1280,59,97,100,115,118,6305,6307,6312,6315,6322,32768,8743,110,100,59,32768,10837,59,32768,10844,108,111,112,101,59,32768,10840,59,32768,10842,1792,59,101,108,109,114,115,122,6340,6342,6345,6349,6391,6410,6422,32768,8736,59,32768,10660,101,59,32768,8736,115,100,512,59,97,6356,6358,32768,8737,2098,6368,6371,6374,6377,6380,6383,6386,6389,59,32768,10664,59,32768,10665,59,32768,10666,59,32768,10667,59,32768,10668,59,32768,10669,59,32768,10670,59,32768,10671,116,512,59,118,6397,6399,32768,8735,98,512,59,100,6405,6407,32768,8894,59,32768,10653,512,112,116,6415,6419,104,59,32768,8738,59,32768,197,97,114,114,59,32768,9084,512,103,112,6433,6438,111,110,59,32768,261,102,59,32896,55349,56658,1792,59,69,97,101,105,111,112,6458,6460,6463,6469,6472,6476,6480,32768,8776,59,32768,10864,99,105,114,59,32768,10863,59,32768,8778,100,59,32768,8779,115,59,32768,39,114,111,120,512,59,101,6488,6490,32768,8776,113,59,32768,8778,105,110,103,33024,229,59,32768,229,768,99,116,121,6509,6514,6517,114,59,32896,55349,56502,59,32768,42,109,112,512,59,101,6524,6526,32768,8776,113,59,32768,8781,105,108,100,101,33024,227,59,32768,227,109,108,33024,228,59,32768,228,512,99,105,6551,6559,111,110,105,110,116,59,32768,8755,110,116,59,32768,10769,4096,78,97,98,99,100,101,102,105,107,108,110,111,112,114,115,117,6597,6602,6673,6688,6701,6707,6768,6773,6891,6898,6999,7023,7309,7316,7334,7383,111,116,59,32768,10989,512,99,114,6607,6652,107,1024,99,101,112,115,6617,6623,6632,6639,111,110,103,59,32768,8780,112,115,105,108,111,110,59,32768,1014,114,105,109,101,59,32768,8245,105,109,512,59,101,6646,6648,32768,8765,113,59,32768,8909,583,6656,6661,101,101,59,32768,8893,101,100,512,59,103,6667,6669,32768,8965,101,59,32768,8965,114,107,512,59,116,6680,6682,32768,9141,98,114,107,59,32768,9142,512,111,121,6693,6698,110,103,59,32768,8780,59,32768,1073,113,117,111,59,32768,8222,1280,99,109,112,114,116,6718,6731,6738,6743,6749,97,117,115,512,59,101,6726,6728,32768,8757,59,32768,8757,112,116,121,118,59,32768,10672,115,105,59,32768,1014,110,111,117,59,32768,8492,768,97,104,119,6756,6759,6762,59,32768,946,59,32768,8502,101,101,110,59,32768,8812,114,59,32896,55349,56607,103,1792,99,111,115,116,117,118,119,6789,6809,6834,6850,6872,6879,6884,768,97,105,117,6796,6800,6805,112,59,32768,8898,114,99,59,32768,9711,112,59,32768,8899,768,100,112,116,6816,6821,6827,111,116,59,32768,10752,108,117,115,59,32768,10753,105,109,101,115,59,32768,10754,1090,6840,0,0,6846,99,117,112,59,32768,10758,97,114,59,32768,9733,114,105,97,110,103,108,101,512,100,117,6862,6868,111,119,110,59,32768,9661,112,59,32768,9651,112,108,117,115,59,32768,10756,101,101,59,32768,8897,101,100,103,101,59,32768,8896,97,114,111,119,59,32768,10509,768,97,107,111,6905,6976,6994,512,99,110,6910,6972,107,768,108,115,116,6918,6927,6935,111,122,101,110,103,101,59,32768,10731,113,117,97,114,101,59,32768,9642,114,105,97,110,103,108,101,1024,59,100,108,114,6951,6953,6959,6965,32768,9652,111,119,110,59,32768,9662,101,102,116,59,32768,9666,105,103,104,116,59,32768,9656,107,59,32768,9251,770,6981,0,6991,771,6985,0,6988,59,32768,9618,59,32768,9617,52,59,32768,9619,99,107,59,32768,9608,512,101,111,7004,7019,512,59,113,7009,7012,32896,61,8421,117,105,118,59,32896,8801,8421,116,59,32768,8976,1024,112,116,119,120,7032,7037,7049,7055,102,59,32896,55349,56659,512,59,116,7042,7044,32768,8869,111,109,59,32768,8869,116,105,101,59,32768,8904,3072,68,72,85,86,98,100,104,109,112,116,117,118,7080,7101,7126,7147,7182,7187,7208,7233,7240,7246,7253,7274,1024,76,82,108,114,7089,7092,7095,7098,59,32768,9559,59,32768,9556,59,32768,9558,59,32768,9555,1280,59,68,85,100,117,7112,7114,7117,7120,7123,32768,9552,59,32768,9574,59,32768,9577,59,32768,9572,59,32768,9575,1024,76,82,108,114,7135,7138,7141,7144,59,32768,9565,59,32768,9562,59,32768,9564,59,32768,9561,1792,59,72,76,82,104,108,114,7162,7164,7167,7170,7173,7176,7179,32768,9553,59,32768,9580,59,32768,9571,59,32768,9568,59,32768,9579,59,32768,9570,59,32768,9567,111,120,59,32768,10697,1024,76,82,108,114,7196,7199,7202,7205,59,32768,9557,59,32768,9554,59,32768,9488,59,32768,9484,1280,59,68,85,100,117,7219,7221,7224,7227,7230,32768,9472,59,32768,9573,59,32768,9576,59,32768,9516,59,32768,9524,105,110,117,115,59,32768,8863,108,117,115,59,32768,8862,105,109,101,115,59,32768,8864,1024,76,82,108,114,7262,7265,7268,7271,59,32768,9563,59,32768,9560,59,32768,9496,59,32768,9492,1792,59,72,76,82,104,108,114,7289,7291,7294,7297,7300,7303,7306,32768,9474,59,32768,9578,59,32768,9569,59,32768,9566,59,32768,9532,59,32768,9508,59,32768,9500,114,105,109,101,59,32768,8245,512,101,118,7321,7326,118,101,59,32768,728,98,97,114,33024,166,59,32768,166,1024,99,101,105,111,7343,7348,7353,7364,114,59,32896,55349,56503,109,105,59,32768,8271,109,512,59,101,7359,7361,32768,8765,59,32768,8909,108,768,59,98,104,7372,7374,7377,32768,92,59,32768,10693,115,117,98,59,32768,10184,573,7387,7399,108,512,59,101,7392,7394,32768,8226,116,59,32768,8226,112,768,59,69,101,7406,7408,7411,32768,8782,59,32768,10926,512,59,113,7416,7418,32768,8783,59,32768,8783,6450,7448,0,7523,7571,7576,7613,0,7618,7647,0,0,7764,0,0,7779,0,0,7899,7914,7949,7955,0,8158,0,8176,768,99,112,114,7454,7460,7509,117,116,101,59,32768,263,1536,59,97,98,99,100,115,7473,7475,7480,7487,7500,7505,32768,8745,110,100,59,32768,10820,114,99,117,112,59,32768,10825,512,97,117,7492,7496,112,59,32768,10827,112,59,32768,10823,111,116,59,32768,10816,59,32896,8745,65024,512,101,111,7514,7518,116,59,32768,8257,110,59,32768,711,1024,97,101,105,117,7531,7544,7552,7557,833,7536,0,7540,115,59,32768,10829,111,110,59,32768,269,100,105,108,33024,231,59,32768,231,114,99,59,32768,265,112,115,512,59,115,7564,7566,32768,10828,109,59,32768,10832,111,116,59,32768,267,768,100,109,110,7582,7589,7596,105,108,33024,184,59,32768,184,112,116,121,118,59,32768,10674,116,33280,162,59,101,7603,7605,32768,162,114,100,111,116,59,32768,183,114,59,32896,55349,56608,768,99,101,105,7624,7628,7643,121,59,32768,1095,99,107,512,59,109,7635,7637,32768,10003,97,114,107,59,32768,10003,59,32768,967,114,1792,59,69,99,101,102,109,115,7662,7664,7667,7742,7745,7752,7757,32768,9675,59,32768,10691,768,59,101,108,7674,7676,7680,32768,710,113,59,32768,8791,101,1074,7687,0,0,7709,114,114,111,119,512,108,114,7695,7701,101,102,116,59,32768,8634,105,103,104,116,59,32768,8635,1280,82,83,97,99,100,7719,7722,7725,7730,7736,59,32768,174,59,32768,9416,115,116,59,32768,8859,105,114,99,59,32768,8858,97,115,104,59,32768,8861,59,32768,8791,110,105,110,116,59,32768,10768,105,100,59,32768,10991,99,105,114,59,32768,10690,117,98,115,512,59,117,7771,7773,32768,9827,105,116,59,32768,9827,1341,7785,7804,7850,0,7871,111,110,512,59,101,7791,7793,32768,58,512,59,113,7798,7800,32768,8788,59,32768,8788,1086,7809,0,0,7820,97,512,59,116,7814,7816,32768,44,59,32768,64,768,59,102,108,7826,7828,7832,32768,8705,110,59,32768,8728,101,512,109,120,7838,7844,101,110,116,59,32768,8705,101,115,59,32768,8450,824,7854,0,7866,512,59,100,7858,7860,32768,8773,111,116,59,32768,10861,110,116,59,32768,8750,768,102,114,121,7877,7881,7886,59,32896,55349,56660,111,100,59,32768,8720,33280,169,59,115,7892,7894,32768,169,114,59,32768,8471,512,97,111,7903,7908,114,114,59,32768,8629,115,115,59,32768,10007,512,99,117,7918,7923,114,59,32896,55349,56504,512,98,112,7928,7938,512,59,101,7933,7935,32768,10959,59,32768,10961,512,59,101,7943,7945,32768,10960,59,32768,10962,100,111,116,59,32768,8943,1792,100,101,108,112,114,118,119,7969,7983,7996,8009,8057,8147,8152,97,114,114,512,108,114,7977,7980,59,32768,10552,59,32768,10549,1089,7989,0,0,7993,114,59,32768,8926,99,59,32768,8927,97,114,114,512,59,112,8004,8006,32768,8630,59,32768,10557,1536,59,98,99,100,111,115,8022,8024,8031,8044,8049,8053,32768,8746,114,99,97,112,59,32768,10824,512,97,117,8036,8040,112,59,32768,10822,112,59,32768,10826,111,116,59,32768,8845,114,59,32768,10821,59,32896,8746,65024,1024,97,108,114,118,8066,8078,8116,8123,114,114,512,59,109,8073,8075,32768,8631,59,32768,10556,121,768,101,118,119,8086,8104,8109,113,1089,8093,0,0,8099,114,101,99,59,32768,8926,117,99,99,59,32768,8927,101,101,59,32768,8910,101,100,103,101,59,32768,8911,101,110,33024,164,59,32768,164,101,97,114,114,111,119,512,108,114,8134,8140,101,102,116,59,32768,8630,105,103,104,116,59,32768,8631,101,101,59,32768,8910,101,100,59,32768,8911,512,99,105,8162,8170,111,110,105,110,116,59,32768,8754,110,116,59,32768,8753,108,99,116,121,59,32768,9005,4864,65,72,97,98,99,100,101,102,104,105,106,108,111,114,115,116,117,119,122,8221,8226,8231,8267,8282,8296,8327,8351,8366,8379,8466,8471,8487,8621,8647,8676,8697,8712,8720,114,114,59,32768,8659,97,114,59,32768,10597,1024,103,108,114,115,8240,8246,8252,8256,103,101,114,59,32768,8224,101,116,104,59,32768,8504,114,59,32768,8595,104,512,59,118,8262,8264,32768,8208,59,32768,8867,572,8271,8278,97,114,111,119,59,32768,10511,97,99,59,32768,733,512,97,121,8287,8293,114,111,110,59,32768,271,59,32768,1076,768,59,97,111,8303,8305,8320,32768,8518,512,103,114,8310,8316,103,101,114,59,32768,8225,114,59,32768,8650,116,115,101,113,59,32768,10871,768,103,108,109,8334,8339,8344,33024,176,59,32768,176,116,97,59,32768,948,112,116,121,118,59,32768,10673,512,105,114,8356,8362,115,104,116,59,32768,10623,59,32896,55349,56609,97,114,512,108,114,8373,8376,59,32768,8643,59,32768,8642,1280,97,101,103,115,118,8390,8418,8421,8428,8433,109,768,59,111,115,8398,8400,8415,32768,8900,110,100,512,59,115,8407,8409,32768,8900,117,105,116,59,32768,9830,59,32768,9830,59,32768,168,97,109,109,97,59,32768,989,105,110,59,32768,8946,768,59,105,111,8440,8442,8461,32768,247,100,101,33280,247,59,111,8450,8452,32768,247,110,116,105,109,101,115,59,32768,8903,110,120,59,32768,8903,99,121,59,32768,1106,99,1088,8478,0,0,8483,114,110,59,32768,8990,111,112,59,32768,8973,1280,108,112,116,117,119,8498,8504,8509,8556,8570,108,97,114,59,32768,36,102,59,32896,55349,56661,1280,59,101,109,112,115,8520,8522,8535,8542,8548,32768,729,113,512,59,100,8528,8530,32768,8784,111,116,59,32768,8785,105,110,117,115,59,32768,8760,108,117,115,59,32768,8724,113,117,97,114,101,59,32768,8865,98,108,101,98,97,114,119,101,100,103,101,59,32768,8966,110,768,97,100,104,8578,8585,8597,114,114,111,119,59,32768,8595,111,119,110,97,114,114,111,119,115,59,32768,8650,97,114,112,111,111,110,512,108,114,8608,8614,101,102,116,59,32768,8643,105,103,104,116,59,32768,8642,563,8625,8633,107,97,114,111,119,59,32768,10512,1088,8638,0,0,8643,114,110,59,32768,8991,111,112,59,32768,8972,768,99,111,116,8654,8666,8670,512,114,121,8659,8663,59,32896,55349,56505,59,32768,1109,108,59,32768,10742,114,111,107,59,32768,273,512,100,114,8681,8686,111,116,59,32768,8945,105,512,59,102,8692,8694,32768,9663,59,32768,9662,512,97,104,8702,8707,114,114,59,32768,8693,97,114,59,32768,10607,97,110,103,108,101,59,32768,10662,512,99,105,8725,8729,121,59,32768,1119,103,114,97,114,114,59,32768,10239,4608,68,97,99,100,101,102,103,108,109,110,111,112,113,114,115,116,117,120,8774,8788,8807,8844,8849,8852,8866,8895,8929,8977,8989,9004,9046,9136,9151,9171,9184,9199,512,68,111,8779,8784,111,116,59,32768,10871,116,59,32768,8785,512,99,115,8793,8801,117,116,101,33024,233,59,32768,233,116,101,114,59,32768,10862,1024,97,105,111,121,8816,8822,8835,8841,114,111,110,59,32768,283,114,512,59,99,8828,8830,32768,8790,33024,234,59,32768,234,108,111,110,59,32768,8789,59,32768,1101,111,116,59,32768,279,59,32768,8519,512,68,114,8857,8862,111,116,59,32768,8786,59,32896,55349,56610,768,59,114,115,8873,8875,8883,32768,10906,97,118,101,33024,232,59,32768,232,512,59,100,8888,8890,32768,10902,111,116,59,32768,10904,1024,59,105,108,115,8904,8906,8914,8917,32768,10905,110,116,101,114,115,59,32768,9191,59,32768,8467,512,59,100,8922,8924,32768,10901,111,116,59,32768,10903,768,97,112,115,8936,8941,8960,99,114,59,32768,275,116,121,768,59,115,118,8950,8952,8957,32768,8709,101,116,59,32768,8709,59,32768,8709,112,512,49,59,8966,8975,516,8970,8973,59,32768,8196,59,32768,8197,32768,8195,512,103,115,8982,8985,59,32768,331,112,59,32768,8194,512,103,112,8994,8999,111,110,59,32768,281,102,59,32896,55349,56662,768,97,108,115,9011,9023,9028,114,512,59,115,9017,9019,32768,8917,108,59,32768,10723,117,115,59,32768,10865,105,768,59,108,118,9036,9038,9043,32768,949,111,110,59,32768,949,59,32768,1013,1024,99,115,117,118,9055,9071,9099,9128,512,105,111,9060,9065,114,99,59,32768,8790,108,111,110,59,32768,8789,1082,9077,0,0,9081,109,59,32768,8770,97,110,116,512,103,108,9088,9093,116,114,59,32768,10902,101,115,115,59,32768,10901,768,97,101,105,9106,9111,9116,108,115,59,32768,61,115,116,59,32768,8799,118,512,59,68,9122,9124,32768,8801,68,59,32768,10872,112,97,114,115,108,59,32768,10725,512,68,97,9141,9146,111,116,59,32768,8787,114,114,59,32768,10609,768,99,100,105,9158,9162,9167,114,59,32768,8495,111,116,59,32768,8784,109,59,32768,8770,512,97,104,9176,9179,59,32768,951,33024,240,59,32768,240,512,109,114,9189,9195,108,33024,235,59,32768,235,111,59,32768,8364,768,99,105,112,9206,9210,9215,108,59,32768,33,115,116,59,32768,8707,512,101,111,9220,9230,99,116,97,116,105,111,110,59,32768,8496,110,101,110,116,105,97,108,101,59,32768,8519,4914,9262,0,9276,0,9280,9287,0,0,9318,9324,0,9331,0,9352,9357,9386,0,9395,9497,108,108,105,110,103,100,111,116,115,101,113,59,32768,8786,121,59,32768,1092,109,97,108,101,59,32768,9792,768,105,108,114,9293,9299,9313,108,105,103,59,32768,64259,1082,9305,0,0,9309,103,59,32768,64256,105,103,59,32768,64260,59,32896,55349,56611,108,105,103,59,32768,64257,108,105,103,59,32896,102,106,768,97,108,116,9337,9341,9346,116,59,32768,9837,105,103,59,32768,64258,110,115,59,32768,9649,111,102,59,32768,402,833,9361,0,9366,102,59,32896,55349,56663,512,97,107,9370,9375,108,108,59,32768,8704,512,59,118,9380,9382,32768,8916,59,32768,10969,97,114,116,105,110,116,59,32768,10765,512,97,111,9399,9491,512,99,115,9404,9487,1794,9413,9443,9453,9470,9474,0,9484,1795,9421,9426,9429,9434,9437,0,9440,33024,189,59,32768,189,59,32768,8531,33024,188,59,32768,188,59,32768,8533,59,32768,8537,59,32768,8539,772,9447,0,9450,59,32768,8532,59,32768,8534,1285,9459,9464,0,0,9467,33024,190,59,32768,190,59,32768,8535,59,32768,8540,53,59,32768,8536,775,9478,0,9481,59,32768,8538,59,32768,8541,56,59,32768,8542,108,59,32768,8260,119,110,59,32768,8994,99,114,59,32896,55349,56507,4352,69,97,98,99,100,101,102,103,105,106,108,110,111,114,115,116,118,9537,9547,9575,9582,9595,9600,9679,9684,9694,9700,9705,9725,9773,9779,9785,9810,9917,512,59,108,9542,9544,32768,8807,59,32768,10892,768,99,109,112,9554,9560,9572,117,116,101,59,32768,501,109,97,512,59,100,9567,9569,32768,947,59,32768,989,59,32768,10886,114,101,118,101,59,32768,287,512,105,121,9587,9592,114,99,59,32768,285,59,32768,1075,111,116,59,32768,289,1024,59,108,113,115,9609,9611,9614,9633,32768,8805,59,32768,8923,768,59,113,115,9621,9623,9626,32768,8805,59,32768,8807,108,97,110,116,59,32768,10878,1024,59,99,100,108,9642,9644,9648,9667,32768,10878,99,59,32768,10921,111,116,512,59,111,9655,9657,32768,10880,512,59,108,9662,9664,32768,10882,59,32768,10884,512,59,101,9672,9675,32896,8923,65024,115,59,32768,10900,114,59,32896,55349,56612,512,59,103,9689,9691,32768,8811,59,32768,8921,109,101,108,59,32768,8503,99,121,59,32768,1107,1024,59,69,97,106,9714,9716,9719,9722,32768,8823,59,32768,10898,59,32768,10917,59,32768,10916,1024,69,97,101,115,9734,9737,9751,9768,59,32768,8809,112,512,59,112,9743,9745,32768,10890,114,111,120,59,32768,10890,512,59,113,9756,9758,32768,10888,512,59,113,9763,9765,32768,10888,59,32768,8809,105,109,59,32768,8935,112,102,59,32896,55349,56664,97,118,101,59,32768,96,512,99,105,9790,9794,114,59,32768,8458,109,768,59,101,108,9802,9804,9807,32768,8819,59,32768,10894,59,32768,10896,34304,62,59,99,100,108,113,114,9824,9826,9838,9843,9849,9856,32768,62,512,99,105,9831,9834,59,32768,10919,114,59,32768,10874,111,116,59,32768,8919,80,97,114,59,32768,10645,117,101,115,116,59,32768,10876,1280,97,100,101,108,115,9867,9882,9887,9906,9912,833,9872,0,9879,112,114,111,120,59,32768,10886,114,59,32768,10616,111,116,59,32768,8919,113,512,108,113,9893,9899,101,115,115,59,32768,8923,108,101,115,115,59,32768,10892,101,115,115,59,32768,8823,105,109,59,32768,8819,512,101,110,9922,9932,114,116,110,101,113,113,59,32896,8809,65024,69,59,32896,8809,65024,2560,65,97,98,99,101,102,107,111,115,121,9958,9963,10015,10020,10026,10060,10065,10085,10147,10171,114,114,59,32768,8660,1024,105,108,109,114,9972,9978,9982,9988,114,115,112,59,32768,8202,102,59,32768,189,105,108,116,59,32768,8459,512,100,114,9993,9998,99,121,59,32768,1098,768,59,99,119,10005,10007,10012,32768,8596,105,114,59,32768,10568,59,32768,8621,97,114,59,32768,8463,105,114,99,59,32768,293,768,97,108,114,10033,10048,10054,114,116,115,512,59,117,10041,10043,32768,9829,105,116,59,32768,9829,108,105,112,59,32768,8230,99,111,110,59,32768,8889,114,59,32896,55349,56613,115,512,101,119,10071,10078,97,114,111,119,59,32768,10533,97,114,111,119,59,32768,10534,1280,97,109,111,112,114,10096,10101,10107,10136,10141,114,114,59,32768,8703,116,104,116,59,32768,8763,107,512,108,114,10113,10124,101,102,116,97,114,114,111,119,59,32768,8617,105,103,104,116,97,114,114,111,119,59,32768,8618,102,59,32896,55349,56665,98,97,114,59,32768,8213,768,99,108,116,10154,10159,10165,114,59,32896,55349,56509,97,115,104,59,32768,8463,114,111,107,59,32768,295,512,98,112,10176,10182,117,108,108,59,32768,8259,104,101,110,59,32768,8208,5426,10211,0,10220,0,10239,10255,10267,0,10276,10312,0,0,10318,10371,10458,10485,10491,0,10500,10545,10558,99,117,116,101,33024,237,59,32768,237,768,59,105,121,10226,10228,10235,32768,8291,114,99,33024,238,59,32768,238,59,32768,1080,512,99,120,10243,10247,121,59,32768,1077,99,108,33024,161,59,32768,161,512,102,114,10259,10262,59,32768,8660,59,32896,55349,56614,114,97,118,101,33024,236,59,32768,236,1024,59,105,110,111,10284,10286,10300,10306,32768,8520,512,105,110,10291,10296,110,116,59,32768,10764,116,59,32768,8749,102,105,110,59,32768,10716,116,97,59,32768,8489,108,105,103,59,32768,307,768,97,111,112,10324,10361,10365,768,99,103,116,10331,10335,10357,114,59,32768,299,768,101,108,112,10342,10345,10351,59,32768,8465,105,110,101,59,32768,8464,97,114,116,59,32768,8465,104,59,32768,305,102,59,32768,8887,101,100,59,32768,437,1280,59,99,102,111,116,10381,10383,10389,10403,10409,32768,8712,97,114,101,59,32768,8453,105,110,512,59,116,10396,10398,32768,8734,105,101,59,32768,10717,100,111,116,59,32768,305,1280,59,99,101,108,112,10420,10422,10427,10444,10451,32768,8747,97,108,59,32768,8890,512,103,114,10432,10438,101,114,115,59,32768,8484,99,97,108,59,32768,8890,97,114,104,107,59,32768,10775,114,111,100,59,32768,10812,1024,99,103,112,116,10466,10470,10475,10480,121,59,32768,1105,111,110,59,32768,303,102,59,32896,55349,56666,97,59,32768,953,114,111,100,59,32768,10812,117,101,115,116,33024,191,59,32768,191,512,99,105,10504,10509,114,59,32896,55349,56510,110,1280,59,69,100,115,118,10521,10523,10526,10531,10541,32768,8712,59,32768,8953,111,116,59,32768,8949,512,59,118,10536,10538,32768,8948,59,32768,8947,59,32768,8712,512,59,105,10549,10551,32768,8290,108,100,101,59,32768,297,828,10562,0,10567,99,121,59,32768,1110,108,33024,239,59,32768,239,1536,99,102,109,111,115,117,10585,10598,10603,10609,10615,10630,512,105,121,10590,10595,114,99,59,32768,309,59,32768,1081,114,59,32896,55349,56615,97,116,104,59,32768,567,112,102,59,32896,55349,56667,820,10620,0,10625,114,59,32896,55349,56511,114,99,121,59,32768,1112,107,99,121,59,32768,1108,2048,97,99,102,103,104,106,111,115,10653,10666,10680,10685,10692,10697,10702,10708,112,112,97,512,59,118,10661,10663,32768,954,59,32768,1008,512,101,121,10671,10677,100,105,108,59,32768,311,59,32768,1082,114,59,32896,55349,56616,114,101,101,110,59,32768,312,99,121,59,32768,1093,99,121,59,32768,1116,112,102,59,32896,55349,56668,99,114,59,32896,55349,56512,5888,65,66,69,72,97,98,99,100,101,102,103,104,106,108,109,110,111,112,114,115,116,117,118,10761,10783,10789,10799,10804,10957,11011,11047,11094,11349,11372,11382,11409,11414,11451,11478,11526,11698,11711,11755,11823,11910,11929,768,97,114,116,10768,10773,10777,114,114,59,32768,8666,114,59,32768,8656,97,105,108,59,32768,10523,97,114,114,59,32768,10510,512,59,103,10794,10796,32768,8806,59,32768,10891,97,114,59,32768,10594,4660,10824,0,10830,0,10838,0,0,0,0,0,10844,10850,0,10867,10870,10877,0,10933,117,116,101,59,32768,314,109,112,116,121,118,59,32768,10676,114,97,110,59,32768,8466,98,100,97,59,32768,955,103,768,59,100,108,10857,10859,10862,32768,10216,59,32768,10641,101,59,32768,10216,59,32768,10885,117,111,33024,171,59,32768,171,114,2048,59,98,102,104,108,112,115,116,10894,10896,10907,10911,10915,10919,10923,10928,32768,8592,512,59,102,10901,10903,32768,8676,115,59,32768,10527,115,59,32768,10525,107,59,32768,8617,112,59,32768,8619,108,59,32768,10553,105,109,59,32768,10611,108,59,32768,8610,768,59,97,101,10939,10941,10946,32768,10923,105,108,59,32768,10521,512,59,115,10951,10953,32768,10925,59,32896,10925,65024,768,97,98,114,10964,10969,10974,114,114,59,32768,10508,114,107,59,32768,10098,512,97,107,10979,10991,99,512,101,107,10985,10988,59,32768,123,59,32768,91,512,101,115,10996,10999,59,32768,10635,108,512,100,117,11005,11008,59,32768,10639,59,32768,10637,1024,97,101,117,121,11020,11026,11040,11044,114,111,110,59,32768,318,512,100,105,11031,11036,105,108,59,32768,316,108,59,32768,8968,98,59,32768,123,59,32768,1083,1024,99,113,114,115,11056,11060,11072,11090,97,59,32768,10550,117,111,512,59,114,11067,11069,32768,8220,59,32768,8222,512,100,117,11077,11083,104,97,114,59,32768,10599,115,104,97,114,59,32768,10571,104,59,32768,8626,1280,59,102,103,113,115,11105,11107,11228,11231,11250,32768,8804,116,1280,97,104,108,114,116,11119,11136,11157,11169,11216,114,114,111,119,512,59,116,11128,11130,32768,8592,97,105,108,59,32768,8610,97,114,112,111,111,110,512,100,117,11147,11153,111,119,110,59,32768,8637,112,59,32768,8636,101,102,116,97,114,114,111,119,115,59,32768,8647,105,103,104,116,768,97,104,115,11180,11194,11204,114,114,111,119,512,59,115,11189,11191,32768,8596,59,32768,8646,97,114,112,111,111,110,115,59,32768,8651,113,117,105,103,97,114,114,111,119,59,32768,8621,104,114,101,101,116,105,109,101,115,59,32768,8907,59,32768,8922,768,59,113,115,11238,11240,11243,32768,8804,59,32768,8806,108,97,110,116,59,32768,10877,1280,59,99,100,103,115,11261,11263,11267,11286,11298,32768,10877,99,59,32768,10920,111,116,512,59,111,11274,11276,32768,10879,512,59,114,11281,11283,32768,10881,59,32768,10883,512,59,101,11291,11294,32896,8922,65024,115,59,32768,10899,1280,97,100,101,103,115,11309,11317,11322,11339,11344,112,112,114,111,120,59,32768,10885,111,116,59,32768,8918,113,512,103,113,11328,11333,116,114,59,32768,8922,103,116,114,59,32768,10891,116,114,59,32768,8822,105,109,59,32768,8818,768,105,108,114,11356,11362,11368,115,104,116,59,32768,10620,111,111,114,59,32768,8970,59,32896,55349,56617,512,59,69,11377,11379,32768,8822,59,32768,10897,562,11386,11405,114,512,100,117,11391,11394,59,32768,8637,512,59,108,11399,11401,32768,8636,59,32768,10602,108,107,59,32768,9604,99,121,59,32768,1113,1280,59,97,99,104,116,11425,11427,11432,11440,11446,32768,8810,114,114,59,32768,8647,111,114,110,101,114,59,32768,8990,97,114,100,59,32768,10603,114,105,59,32768,9722,512,105,111,11456,11462,100,111,116,59,32768,320,117,115,116,512,59,97,11470,11472,32768,9136,99,104,101,59,32768,9136,1024,69,97,101,115,11487,11490,11504,11521,59,32768,8808,112,512,59,112,11496,11498,32768,10889,114,111,120,59,32768,10889,512,59,113,11509,11511,32768,10887,512,59,113,11516,11518,32768,10887,59,32768,8808,105,109,59,32768,8934,2048,97,98,110,111,112,116,119,122,11543,11556,11561,11616,11640,11660,11667,11680,512,110,114,11548,11552,103,59,32768,10220,114,59,32768,8701,114,107,59,32768,10214,103,768,108,109,114,11569,11596,11604,101,102,116,512,97,114,11577,11584,114,114,111,119,59,32768,10229,105,103,104,116,97,114,114,111,119,59,32768,10231,97,112,115,116,111,59,32768,10236,105,103,104,116,97,114,114,111,119,59,32768,10230,112,97,114,114,111,119,512,108,114,11627,11633,101,102,116,59,32768,8619,105,103,104,116,59,32768,8620,768,97,102,108,11647,11651,11655,114,59,32768,10629,59,32896,55349,56669,117,115,59,32768,10797,105,109,101,115,59,32768,10804,562,11671,11676,115,116,59,32768,8727,97,114,59,32768,95,768,59,101,102,11687,11689,11695,32768,9674,110,103,101,59,32768,9674,59,32768,10731,97,114,512,59,108,11705,11707,32768,40,116,59,32768,10643,1280,97,99,104,109,116,11722,11727,11735,11747,11750,114,114,59,32768,8646,111,114,110,101,114,59,32768,8991,97,114,512,59,100,11742,11744,32768,8651,59,32768,10605,59,32768,8206,114,105,59,32768,8895,1536,97,99,104,105,113,116,11768,11774,11779,11782,11798,11817,113,117,111,59,32768,8249,114,59,32896,55349,56513,59,32768,8624,109,768,59,101,103,11790,11792,11795,32768,8818,59,32768,10893,59,32768,10895,512,98,117,11803,11806,59,32768,91,111,512,59,114,11812,11814,32768,8216,59,32768,8218,114,111,107,59,32768,322,34816,60,59,99,100,104,105,108,113,114,11841,11843,11855,11860,11866,11872,11878,11885,32768,60,512,99,105,11848,11851,59,32768,10918,114,59,32768,10873,111,116,59,32768,8918,114,101,101,59,32768,8907,109,101,115,59,32768,8905,97,114,114,59,32768,10614,117,101,115,116,59,32768,10875,512,80,105,11890,11895,97,114,59,32768,10646,768,59,101,102,11902,11904,11907,32768,9667,59,32768,8884,59,32768,9666,114,512,100,117,11916,11923,115,104,97,114,59,32768,10570,104,97,114,59,32768,10598,512,101,110,11934,11944,114,116,110,101,113,113,59,32896,8808,65024,69,59,32896,8808,65024,3584,68,97,99,100,101,102,104,105,108,110,111,112,115,117,11978,11984,12061,12075,12081,12095,12100,12104,12170,12181,12188,12204,12207,12223,68,111,116,59,32768,8762,1024,99,108,112,114,11993,11999,12019,12055,114,33024,175,59,32768,175,512,101,116,12004,12007,59,32768,9794,512,59,101,12012,12014,32768,10016,115,101,59,32768,10016,512,59,115,12024,12026,32768,8614,116,111,1024,59,100,108,117,12037,12039,12045,12051,32768,8614,111,119,110,59,32768,8615,101,102,116,59,32768,8612,112,59,32768,8613,107,101,114,59,32768,9646,512,111,121,12066,12072,109,109,97,59,32768,10793,59,32768,1084,97,115,104,59,32768,8212,97,115,117,114,101,100,97,110,103,108,101,59,32768,8737,114,59,32896,55349,56618,111,59,32768,8487,768,99,100,110,12111,12118,12146,114,111,33024,181,59,32768,181,1024,59,97,99,100,12127,12129,12134,12139,32768,8739,115,116,59,32768,42,105,114,59,32768,10992,111,116,33024,183,59,32768,183,117,115,768,59,98,100,12155,12157,12160,32768,8722,59,32768,8863,512,59,117,12165,12167,32768,8760,59,32768,10794,564,12174,12178,112,59,32768,10971,114,59,32768,8230,112,108,117,115,59,32768,8723,512,100,112,12193,12199,101,108,115,59,32768,8871,102,59,32896,55349,56670,59,32768,8723,512,99,116,12212,12217,114,59,32896,55349,56514,112,111,115,59,32768,8766,768,59,108,109,12230,12232,12240,32768,956,116,105,109,97,112,59,32768,8888,97,112,59,32768,8888,6144,71,76,82,86,97,98,99,100,101,102,103,104,105,106,108,109,111,112,114,115,116,117,118,119,12294,12315,12364,12376,12393,12472,12496,12547,12553,12636,12641,12703,12725,12747,12752,12876,12881,12957,13033,13089,13294,13359,13384,13499,512,103,116,12299,12303,59,32896,8921,824,512,59,118,12308,12311,32896,8811,8402,59,32896,8811,824,768,101,108,116,12322,12348,12352,102,116,512,97,114,12329,12336,114,114,111,119,59,32768,8653,105,103,104,116,97,114,114,111,119,59,32768,8654,59,32896,8920,824,512,59,118,12357,12360,32896,8810,8402,59,32896,8810,824,105,103,104,116,97,114,114,111,119,59,32768,8655,512,68,100,12381,12387,97,115,104,59,32768,8879,97,115,104,59,32768,8878,1280,98,99,110,112,116,12404,12409,12415,12420,12452,108,97,59,32768,8711,117,116,101,59,32768,324,103,59,32896,8736,8402,1280,59,69,105,111,112,12431,12433,12437,12442,12446,32768,8777,59,32896,10864,824,100,59,32896,8779,824,115,59,32768,329,114,111,120,59,32768,8777,117,114,512,59,97,12459,12461,32768,9838,108,512,59,115,12467,12469,32768,9838,59,32768,8469,836,12477,0,12483,112,33024,160,59,32768,160,109,112,512,59,101,12489,12492,32896,8782,824,59,32896,8783,824,1280,97,101,111,117,121,12507,12519,12525,12540,12544,833,12512,0,12515,59,32768,10819,111,110,59,32768,328,100,105,108,59,32768,326,110,103,512,59,100,12532,12534,32768,8775,111,116,59,32896,10861,824,112,59,32768,10818,59,32768,1085,97,115,104,59,32768,8211,1792,59,65,97,100,113,115,120,12568,12570,12575,12596,12602,12608,12623,32768,8800,114,114,59,32768,8663,114,512,104,114,12581,12585,107,59,32768,10532,512,59,111,12590,12592,32768,8599,119,59,32768,8599,111,116,59,32896,8784,824,117,105,118,59,32768,8802,512,101,105,12613,12618,97,114,59,32768,10536,109,59,32896,8770,824,105,115,116,512,59,115,12631,12633,32768,8708,59,32768,8708,114,59,32896,55349,56619,1024,69,101,115,116,12650,12654,12688,12693,59,32896,8807,824,768,59,113,115,12661,12663,12684,32768,8817,768,59,113,115,12670,12672,12676,32768,8817,59,32896,8807,824,108,97,110,116,59,32896,10878,824,59,32896,10878,824,105,109,59,32768,8821,512,59,114,12698,12700,32768,8815,59,32768,8815,768,65,97,112,12710,12715,12720,114,114,59,32768,8654,114,114,59,32768,8622,97,114,59,32768,10994,768,59,115,118,12732,12734,12744,32768,8715,512,59,100,12739,12741,32768,8956,59,32768,8954,59,32768,8715,99,121,59,32768,1114,1792,65,69,97,100,101,115,116,12767,12772,12776,12781,12785,12853,12858,114,114,59,32768,8653,59,32896,8806,824,114,114,59,32768,8602,114,59,32768,8229,1024,59,102,113,115,12794,12796,12821,12842,32768,8816,116,512,97,114,12802,12809,114,114,111,119,59,32768,8602,105,103,104,116,97,114,114,111,119,59,32768,8622,768,59,113,115,12828,12830,12834,32768,8816,59,32896,8806,824,108,97,110,116,59,32896,10877,824,512,59,115,12847,12850,32896,10877,824,59,32768,8814,105,109,59,32768,8820,512,59,114,12863,12865,32768,8814,105,512,59,101,12871,12873,32768,8938,59,32768,8940,105,100,59,32768,8740,512,112,116,12886,12891,102,59,32896,55349,56671,33536,172,59,105,110,12899,12901,12936,32768,172,110,1024,59,69,100,118,12911,12913,12917,12923,32768,8713,59,32896,8953,824,111,116,59,32896,8949,824,818,12928,12931,12934,59,32768,8713,59,32768,8951,59,32768,8950,105,512,59,118,12942,12944,32768,8716,818,12949,12952,12955,59,32768,8716,59,32768,8958,59,32768,8957,768,97,111,114,12964,12992,12999,114,1024,59,97,115,116,12974,12976,12983,12988,32768,8742,108,108,101,108,59,32768,8742,108,59,32896,11005,8421,59,32896,8706,824,108,105,110,116,59,32768,10772,768,59,99,101,13006,13008,13013,32768,8832,117,101,59,32768,8928,512,59,99,13018,13021,32896,10927,824,512,59,101,13026,13028,32768,8832,113,59,32896,10927,824,1024,65,97,105,116,13042,13047,13066,13077,114,114,59,32768,8655,114,114,768,59,99,119,13056,13058,13062,32768,8603,59,32896,10547,824,59,32896,8605,824,103,104,116,97,114,114,111,119,59,32768,8603,114,105,512,59,101,13084,13086,32768,8939,59,32768,8941,1792,99,104,105,109,112,113,117,13104,13128,13151,13169,13174,13179,13194,1024,59,99,101,114,13113,13115,13120,13124,32768,8833,117,101,59,32768,8929,59,32896,10928,824,59,32896,55349,56515,111,114,116,1086,13137,0,0,13142,105,100,59,32768,8740,97,114,97,108,108,101,108,59,32768,8742,109,512,59,101,13157,13159,32768,8769,512,59,113,13164,13166,32768,8772,59,32768,8772,105,100,59,32768,8740,97,114,59,32768,8742,115,117,512,98,112,13186,13190,101,59,32768,8930,101,59,32768,8931,768,98,99,112,13201,13241,13254,1024,59,69,101,115,13210,13212,13216,13219,32768,8836,59,32896,10949,824,59,32768,8840,101,116,512,59,101,13226,13229,32896,8834,8402,113,512,59,113,13235,13237,32768,8840,59,32896,10949,824,99,512,59,101,13247,13249,32768,8833,113,59,32896,10928,824,1024,59,69,101,115,13263,13265,13269,13272,32768,8837,59,32896,10950,824,59,32768,8841,101,116,512,59,101,13279,13282,32896,8835,8402,113,512,59,113,13288,13290,32768,8841,59,32896,10950,824,1024,103,105,108,114,13303,13307,13315,13319,108,59,32768,8825,108,100,101,33024,241,59,32768,241,103,59,32768,8824,105,97,110,103,108,101,512,108,114,13330,13344,101,102,116,512,59,101,13338,13340,32768,8938,113,59,32768,8940,105,103,104,116,512,59,101,13353,13355,32768,8939,113,59,32768,8941,512,59,109,13364,13366,32768,957,768,59,101,115,13373,13375,13380,32768,35,114,111,59,32768,8470,112,59,32768,8199,2304,68,72,97,100,103,105,108,114,115,13403,13409,13415,13420,13426,13439,13446,13476,13493,97,115,104,59,32768,8877,97,114,114,59,32768,10500,112,59,32896,8781,8402,97,115,104,59,32768,8876,512,101,116,13431,13435,59,32896,8805,8402,59,32896,62,8402,110,102,105,110,59,32768,10718,768,65,101,116,13453,13458,13462,114,114,59,32768,10498,59,32896,8804,8402,512,59,114,13467,13470,32896,60,8402,105,101,59,32896,8884,8402,512,65,116,13481,13486,114,114,59,32768,10499,114,105,101,59,32896,8885,8402,105,109,59,32896,8764,8402,768,65,97,110,13506,13511,13532,114,114,59,32768,8662,114,512,104,114,13517,13521,107,59,32768,10531,512,59,111,13526,13528,32768,8598,119,59,32768,8598,101,97,114,59,32768,10535,9252,13576,0,0,0,0,0,0,0,0,0,0,0,0,0,13579,0,13596,13617,13653,13659,13673,13695,13708,0,0,13713,13750,0,13788,13794,0,13815,13890,13913,13937,13944,59,32768,9416,512,99,115,13583,13591,117,116,101,33024,243,59,32768,243,116,59,32768,8859,512,105,121,13600,13613,114,512,59,99,13606,13608,32768,8858,33024,244,59,32768,244,59,32768,1086,1280,97,98,105,111,115,13627,13632,13638,13642,13646,115,104,59,32768,8861,108,97,99,59,32768,337,118,59,32768,10808,116,59,32768,8857,111,108,100,59,32768,10684,108,105,103,59,32768,339,512,99,114,13663,13668,105,114,59,32768,10687,59,32896,55349,56620,1600,13680,0,0,13684,0,13692,110,59,32768,731,97,118,101,33024,242,59,32768,242,59,32768,10689,512,98,109,13699,13704,97,114,59,32768,10677,59,32768,937,110,116,59,32768,8750,1024,97,99,105,116,13721,13726,13741,13746,114,114,59,32768,8634,512,105,114,13731,13735,114,59,32768,10686,111,115,115,59,32768,10683,110,101,59,32768,8254,59,32768,10688,768,97,101,105,13756,13761,13766,99,114,59,32768,333,103,97,59,32768,969,768,99,100,110,13773,13779,13782,114,111,110,59,32768,959,59,32768,10678,117,115,59,32768,8854,112,102,59,32896,55349,56672,768,97,101,108,13800,13804,13809,114,59,32768,10679,114,112,59,32768,10681,117,115,59,32768,8853,1792,59,97,100,105,111,115,118,13829,13831,13836,13869,13875,13879,13886,32768,8744,114,114,59,32768,8635,1024,59,101,102,109,13845,13847,13859,13864,32768,10845,114,512,59,111,13853,13855,32768,8500,102,59,32768,8500,33024,170,59,32768,170,33024,186,59,32768,186,103,111,102,59,32768,8886,114,59,32768,10838,108,111,112,101,59,32768,10839,59,32768,10843,768,99,108,111,13896,13900,13908,114,59,32768,8500,97,115,104,33024,248,59,32768,248,108,59,32768,8856,105,573,13917,13924,100,101,33024,245,59,32768,245,101,115,512,59,97,13930,13932,32768,8855,115,59,32768,10806,109,108,33024,246,59,32768,246,98,97,114,59,32768,9021,5426,13972,0,14013,0,14017,14053,0,14058,14086,0,0,14107,14199,0,14202,0,0,14229,14425,0,14438,114,1024,59,97,115,116,13981,13983,13997,14009,32768,8741,33280,182,59,108,13989,13991,32768,182,108,101,108,59,32768,8741,1082,14003,0,0,14007,109,59,32768,10995,59,32768,11005,59,32768,8706,121,59,32768,1087,114,1280,99,105,109,112,116,14028,14033,14038,14043,14046,110,116,59,32768,37,111,100,59,32768,46,105,108,59,32768,8240,59,32768,8869,101,110,107,59,32768,8241,114,59,32896,55349,56621,768,105,109,111,14064,14074,14080,512,59,118,14069,14071,32768,966,59,32768,981,109,97,116,59,32768,8499,110,101,59,32768,9742,768,59,116,118,14092,14094,14103,32768,960,99,104,102,111,114,107,59,32768,8916,59,32768,982,512,97,117,14111,14132,110,512,99,107,14117,14128,107,512,59,104,14123,14125,32768,8463,59,32768,8462,118,59,32768,8463,115,2304,59,97,98,99,100,101,109,115,116,14152,14154,14160,14163,14168,14179,14182,14188,14193,32768,43,99,105,114,59,32768,10787,59,32768,8862,105,114,59,32768,10786,512,111,117,14173,14176,59,32768,8724,59,32768,10789,59,32768,10866,110,33024,177,59,32768,177,105,109,59,32768,10790,119,111,59,32768,10791,59,32768,177,768,105,112,117,14208,14216,14221,110,116,105,110,116,59,32768,10773,102,59,32896,55349,56673,110,100,33024,163,59,32768,163,2560,59,69,97,99,101,105,110,111,115,117,14249,14251,14254,14258,14263,14336,14348,14367,14413,14418,32768,8826,59,32768,10931,112,59,32768,10935,117,101,59,32768,8828,512,59,99,14268,14270,32768,10927,1536,59,97,99,101,110,115,14283,14285,14293,14302,14306,14331,32768,8826,112,112,114,111,120,59,32768,10935,117,114,108,121,101,113,59,32768,8828,113,59,32768,10927,768,97,101,115,14313,14321,14326,112,112,114,111,120,59,32768,10937,113,113,59,32768,10933,105,109,59,32768,8936,105,109,59,32768,8830,109,101,512,59,115,14343,14345,32768,8242,59,32768,8473,768,69,97,115,14355,14358,14362,59,32768,10933,112,59,32768,10937,105,109,59,32768,8936,768,100,102,112,14374,14377,14402,59,32768,8719,768,97,108,115,14384,14390,14396,108,97,114,59,32768,9006,105,110,101,59,32768,8978,117,114,102,59,32768,8979,512,59,116,14407,14409,32768,8733,111,59,32768,8733,105,109,59,32768,8830,114,101,108,59,32768,8880,512,99,105,14429,14434,114,59,32896,55349,56517,59,32768,968,110,99,115,112,59,32768,8200,1536,102,105,111,112,115,117,14457,14462,14467,14473,14480,14486,114,59,32896,55349,56622,110,116,59,32768,10764,112,102,59,32896,55349,56674,114,105,109,101,59,32768,8279,99,114,59,32896,55349,56518,768,97,101,111,14493,14513,14526,116,512,101,105,14499,14508,114,110,105,111,110,115,59,32768,8461,110,116,59,32768,10774,115,116,512,59,101,14520,14522,32768,63,113,59,32768,8799,116,33024,34,59,32768,34,5376,65,66,72,97,98,99,100,101,102,104,105,108,109,110,111,112,114,115,116,117,120,14575,14597,14603,14608,14775,14829,14865,14901,14943,14966,15e3,15139,15159,15176,15182,15236,15261,15267,15309,15352,15360,768,97,114,116,14582,14587,14591,114,114,59,32768,8667,114,59,32768,8658,97,105,108,59,32768,10524,97,114,114,59,32768,10511,97,114,59,32768,10596,1792,99,100,101,110,113,114,116,14623,14637,14642,14650,14672,14679,14751,512,101,117,14628,14632,59,32896,8765,817,116,101,59,32768,341,105,99,59,32768,8730,109,112,116,121,118,59,32768,10675,103,1024,59,100,101,108,14660,14662,14665,14668,32768,10217,59,32768,10642,59,32768,10661,101,59,32768,10217,117,111,33024,187,59,32768,187,114,2816,59,97,98,99,102,104,108,112,115,116,119,14703,14705,14709,14720,14723,14727,14731,14735,14739,14744,14748,32768,8594,112,59,32768,10613,512,59,102,14714,14716,32768,8677,115,59,32768,10528,59,32768,10547,115,59,32768,10526,107,59,32768,8618,112,59,32768,8620,108,59,32768,10565,105,109,59,32768,10612,108,59,32768,8611,59,32768,8605,512,97,105,14756,14761,105,108,59,32768,10522,111,512,59,110,14767,14769,32768,8758,97,108,115,59,32768,8474,768,97,98,114,14782,14787,14792,114,114,59,32768,10509,114,107,59,32768,10099,512,97,107,14797,14809,99,512,101,107,14803,14806,59,32768,125,59,32768,93,512,101,115,14814,14817,59,32768,10636,108,512,100,117,14823,14826,59,32768,10638,59,32768,10640,1024,97,101,117,121,14838,14844,14858,14862,114,111,110,59,32768,345,512,100,105,14849,14854,105,108,59,32768,343,108,59,32768,8969,98,59,32768,125,59,32768,1088,1024,99,108,113,115,14874,14878,14885,14897,97,59,32768,10551,100,104,97,114,59,32768,10601,117,111,512,59,114,14892,14894,32768,8221,59,32768,8221,104,59,32768,8627,768,97,99,103,14908,14934,14938,108,1024,59,105,112,115,14918,14920,14925,14931,32768,8476,110,101,59,32768,8475,97,114,116,59,32768,8476,59,32768,8477,116,59,32768,9645,33024,174,59,32768,174,768,105,108,114,14950,14956,14962,115,104,116,59,32768,10621,111,111,114,59,32768,8971,59,32896,55349,56623,512,97,111,14971,14990,114,512,100,117,14977,14980,59,32768,8641,512,59,108,14985,14987,32768,8640,59,32768,10604,512,59,118,14995,14997,32768,961,59,32768,1009,768,103,110,115,15007,15123,15127,104,116,1536,97,104,108,114,115,116,15022,15039,15060,15086,15099,15111,114,114,111,119,512,59,116,15031,15033,32768,8594,97,105,108,59,32768,8611,97,114,112,111,111,110,512,100,117,15050,15056,111,119,110,59,32768,8641,112,59,32768,8640,101,102,116,512,97,104,15068,15076,114,114,111,119,115,59,32768,8644,97,114,112,111,111,110,115,59,32768,8652,105,103,104,116,97,114,114,111,119,115,59,32768,8649,113,117,105,103,97,114,114,111,119,59,32768,8605,104,114,101,101,116,105,109,101,115,59,32768,8908,103,59,32768,730,105,110,103,100,111,116,115,101,113,59,32768,8787,768,97,104,109,15146,15151,15156,114,114,59,32768,8644,97,114,59,32768,8652,59,32768,8207,111,117,115,116,512,59,97,15168,15170,32768,9137,99,104,101,59,32768,9137,109,105,100,59,32768,10990,1024,97,98,112,116,15191,15204,15209,15229,512,110,114,15196,15200,103,59,32768,10221,114,59,32768,8702,114,107,59,32768,10215,768,97,102,108,15216,15220,15224,114,59,32768,10630,59,32896,55349,56675,117,115,59,32768,10798,105,109,101,115,59,32768,10805,512,97,112,15241,15253,114,512,59,103,15247,15249,32768,41,116,59,32768,10644,111,108,105,110,116,59,32768,10770,97,114,114,59,32768,8649,1024,97,99,104,113,15276,15282,15287,15290,113,117,111,59,32768,8250,114,59,32896,55349,56519,59,32768,8625,512,98,117,15295,15298,59,32768,93,111,512,59,114,15304,15306,32768,8217,59,32768,8217,768,104,105,114,15316,15322,15328,114,101,101,59,32768,8908,109,101,115,59,32768,8906,105,1024,59,101,102,108,15338,15340,15343,15346,32768,9657,59,32768,8885,59,32768,9656,116,114,105,59,32768,10702,108,117,104,97,114,59,32768,10600,59,32768,8478,6706,15391,15398,15404,15499,15516,15592,0,15606,15660,0,0,15752,15758,0,15827,15863,15886,16e3,16006,16038,16086,0,16467,0,0,16506,99,117,116,101,59,32768,347,113,117,111,59,32768,8218,2560,59,69,97,99,101,105,110,112,115,121,15424,15426,15429,15441,15446,15458,15463,15482,15490,15495,32768,8827,59,32768,10932,833,15434,0,15437,59,32768,10936,111,110,59,32768,353,117,101,59,32768,8829,512,59,100,15451,15453,32768,10928,105,108,59,32768,351,114,99,59,32768,349,768,69,97,115,15470,15473,15477,59,32768,10934,112,59,32768,10938,105,109,59,32768,8937,111,108,105,110,116,59,32768,10771,105,109,59,32768,8831,59,32768,1089,111,116,768,59,98,101,15507,15509,15512,32768,8901,59,32768,8865,59,32768,10854,1792,65,97,99,109,115,116,120,15530,15535,15556,15562,15566,15572,15587,114,114,59,32768,8664,114,512,104,114,15541,15545,107,59,32768,10533,512,59,111,15550,15552,32768,8600,119,59,32768,8600,116,33024,167,59,32768,167,105,59,32768,59,119,97,114,59,32768,10537,109,512,105,110,15578,15584,110,117,115,59,32768,8726,59,32768,8726,116,59,32768,10038,114,512,59,111,15597,15600,32896,55349,56624,119,110,59,32768,8994,1024,97,99,111,121,15614,15619,15632,15654,114,112,59,32768,9839,512,104,121,15624,15629,99,121,59,32768,1097,59,32768,1096,114,116,1086,15640,0,0,15645,105,100,59,32768,8739,97,114,97,108,108,101,108,59,32768,8741,33024,173,59,32768,173,512,103,109,15664,15681,109,97,768,59,102,118,15673,15675,15678,32768,963,59,32768,962,59,32768,962,2048,59,100,101,103,108,110,112,114,15698,15700,15705,15715,15725,15735,15739,15745,32768,8764,111,116,59,32768,10858,512,59,113,15710,15712,32768,8771,59,32768,8771,512,59,69,15720,15722,32768,10910,59,32768,10912,512,59,69,15730,15732,32768,10909,59,32768,10911,101,59,32768,8774,108,117,115,59,32768,10788,97,114,114,59,32768,10610,97,114,114,59,32768,8592,1024,97,101,105,116,15766,15788,15796,15808,512,108,115,15771,15783,108,115,101,116,109,105,110,117,115,59,32768,8726,104,112,59,32768,10803,112,97,114,115,108,59,32768,10724,512,100,108,15801,15804,59,32768,8739,101,59,32768,8995,512,59,101,15813,15815,32768,10922,512,59,115,15820,15822,32768,10924,59,32896,10924,65024,768,102,108,112,15833,15839,15857,116,99,121,59,32768,1100,512,59,98,15844,15846,32768,47,512,59,97,15851,15853,32768,10692,114,59,32768,9023,102,59,32896,55349,56676,97,512,100,114,15868,15882,101,115,512,59,117,15875,15877,32768,9824,105,116,59,32768,9824,59,32768,8741,768,99,115,117,15892,15921,15977,512,97,117,15897,15909,112,512,59,115,15903,15905,32768,8851,59,32896,8851,65024,112,512,59,115,15915,15917,32768,8852,59,32896,8852,65024,117,512,98,112,15927,15952,768,59,101,115,15934,15936,15939,32768,8847,59,32768,8849,101,116,512,59,101,15946,15948,32768,8847,113,59,32768,8849,768,59,101,115,15959,15961,15964,32768,8848,59,32768,8850,101,116,512,59,101,15971,15973,32768,8848,113,59,32768,8850,768,59,97,102,15984,15986,15996,32768,9633,114,566,15991,15994,59,32768,9633,59,32768,9642,59,32768,9642,97,114,114,59,32768,8594,1024,99,101,109,116,16014,16019,16025,16031,114,59,32896,55349,56520,116,109,110,59,32768,8726,105,108,101,59,32768,8995,97,114,102,59,32768,8902,512,97,114,16042,16053,114,512,59,102,16048,16050,32768,9734,59,32768,9733,512,97,110,16058,16081,105,103,104,116,512,101,112,16067,16076,112,115,105,108,111,110,59,32768,1013,104,105,59,32768,981,115,59,32768,175,1280,98,99,109,110,112,16096,16221,16288,16291,16295,2304,59,69,100,101,109,110,112,114,115,16115,16117,16120,16125,16137,16143,16154,16160,16166,32768,8834,59,32768,10949,111,116,59,32768,10941,512,59,100,16130,16132,32768,8838,111,116,59,32768,10947,117,108,116,59,32768,10945,512,69,101,16148,16151,59,32768,10955,59,32768,8842,108,117,115,59,32768,10943,97,114,114,59,32768,10617,768,101,105,117,16173,16206,16210,116,768,59,101,110,16181,16183,16194,32768,8834,113,512,59,113,16189,16191,32768,8838,59,32768,10949,101,113,512,59,113,16201,16203,32768,8842,59,32768,10955,109,59,32768,10951,512,98,112,16215,16218,59,32768,10965,59,32768,10963,99,1536,59,97,99,101,110,115,16235,16237,16245,16254,16258,16283,32768,8827,112,112,114,111,120,59,32768,10936,117,114,108,121,101,113,59,32768,8829,113,59,32768,10928,768,97,101,115,16265,16273,16278,112,112,114,111,120,59,32768,10938,113,113,59,32768,10934,105,109,59,32768,8937,105,109,59,32768,8831,59,32768,8721,103,59,32768,9834,3328,49,50,51,59,69,100,101,104,108,109,110,112,115,16322,16327,16332,16337,16339,16342,16356,16368,16382,16388,16394,16405,16411,33024,185,59,32768,185,33024,178,59,32768,178,33024,179,59,32768,179,32768,8835,59,32768,10950,512,111,115,16347,16351,116,59,32768,10942,117,98,59,32768,10968,512,59,100,16361,16363,32768,8839,111,116,59,32768,10948,115,512,111,117,16374,16378,108,59,32768,10185,98,59,32768,10967,97,114,114,59,32768,10619,117,108,116,59,32768,10946,512,69,101,16399,16402,59,32768,10956,59,32768,8843,108,117,115,59,32768,10944,768,101,105,117,16418,16451,16455,116,768,59,101,110,16426,16428,16439,32768,8835,113,512,59,113,16434,16436,32768,8839,59,32768,10950,101,113,512,59,113,16446,16448,32768,8843,59,32768,10956,109,59,32768,10952,512,98,112,16460,16463,59,32768,10964,59,32768,10966,768,65,97,110,16473,16478,16499,114,114,59,32768,8665,114,512,104,114,16484,16488,107,59,32768,10534,512,59,111,16493,16495,32768,8601,119,59,32768,8601,119,97,114,59,32768,10538,108,105,103,33024,223,59,32768,223,5938,16538,16552,16557,16579,16584,16591,0,16596,16692,0,0,0,0,0,16731,16780,0,16787,16908,0,0,0,16938,1091,16543,0,0,16549,103,101,116,59,32768,8982,59,32768,964,114,107,59,32768,9140,768,97,101,121,16563,16569,16575,114,111,110,59,32768,357,100,105,108,59,32768,355,59,32768,1090,111,116,59,32768,8411,108,114,101,99,59,32768,8981,114,59,32896,55349,56625,1024,101,105,107,111,16604,16641,16670,16684,835,16609,0,16624,101,512,52,102,16614,16617,59,32768,8756,111,114,101,59,32768,8756,97,768,59,115,118,16631,16633,16638,32768,952,121,109,59,32768,977,59,32768,977,512,99,110,16646,16665,107,512,97,115,16652,16660,112,112,114,111,120,59,32768,8776,105,109,59,32768,8764,115,112,59,32768,8201,512,97,115,16675,16679,112,59,32768,8776,105,109,59,32768,8764,114,110,33024,254,59,32768,254,829,16696,16701,16727,100,101,59,32768,732,101,115,33536,215,59,98,100,16710,16712,16723,32768,215,512,59,97,16717,16719,32768,8864,114,59,32768,10801,59,32768,10800,116,59,32768,8749,768,101,112,115,16737,16741,16775,97,59,32768,10536,1024,59,98,99,102,16750,16752,16757,16762,32768,8868,111,116,59,32768,9014,105,114,59,32768,10993,512,59,111,16767,16770,32896,55349,56677,114,107,59,32768,10970,97,59,32768,10537,114,105,109,101,59,32768,8244,768,97,105,112,16793,16798,16899,100,101,59,32768,8482,1792,97,100,101,109,112,115,116,16813,16868,16873,16876,16883,16889,16893,110,103,108,101,1280,59,100,108,113,114,16828,16830,16836,16850,16853,32768,9653,111,119,110,59,32768,9663,101,102,116,512,59,101,16844,16846,32768,9667,113,59,32768,8884,59,32768,8796,105,103,104,116,512,59,101,16862,16864,32768,9657,113,59,32768,8885,111,116,59,32768,9708,59,32768,8796,105,110,117,115,59,32768,10810,108,117,115,59,32768,10809,98,59,32768,10701,105,109,101,59,32768,10811,101,122,105,117,109,59,32768,9186,768,99,104,116,16914,16926,16931,512,114,121,16919,16923,59,32896,55349,56521,59,32768,1094,99,121,59,32768,1115,114,111,107,59,32768,359,512,105,111,16942,16947,120,116,59,32768,8812,104,101,97,100,512,108,114,16956,16967,101,102,116,97,114,114,111,119,59,32768,8606,105,103,104,116,97,114,114,111,119,59,32768,8608,4608,65,72,97,98,99,100,102,103,104,108,109,111,112,114,115,116,117,119,17016,17021,17026,17043,17057,17072,17095,17110,17119,17139,17172,17187,17202,17290,17330,17336,17365,17381,114,114,59,32768,8657,97,114,59,32768,10595,512,99,114,17031,17039,117,116,101,33024,250,59,32768,250,114,59,32768,8593,114,820,17049,0,17053,121,59,32768,1118,118,101,59,32768,365,512,105,121,17062,17069,114,99,33024,251,59,32768,251,59,32768,1091,768,97,98,104,17079,17084,17090,114,114,59,32768,8645,108,97,99,59,32768,369,97,114,59,32768,10606,512,105,114,17100,17106,115,104,116,59,32768,10622,59,32896,55349,56626,114,97,118,101,33024,249,59,32768,249,562,17123,17135,114,512,108,114,17128,17131,59,32768,8639,59,32768,8638,108,107,59,32768,9600,512,99,116,17144,17167,1088,17150,0,0,17163,114,110,512,59,101,17156,17158,32768,8988,114,59,32768,8988,111,112,59,32768,8975,114,105,59,32768,9720,512,97,108,17177,17182,99,114,59,32768,363,33024,168,59,32768,168,512,103,112,17192,17197,111,110,59,32768,371,102,59,32896,55349,56678,1536,97,100,104,108,115,117,17215,17222,17233,17257,17262,17280,114,114,111,119,59,32768,8593,111,119,110,97,114,114,111,119,59,32768,8597,97,114,112,111,111,110,512,108,114,17244,17250,101,102,116,59,32768,8639,105,103,104,116,59,32768,8638,117,115,59,32768,8846,105,768,59,104,108,17270,17272,17275,32768,965,59,32768,978,111,110,59,32768,965,112,97,114,114,111,119,115,59,32768,8648,768,99,105,116,17297,17320,17325,1088,17303,0,0,17316,114,110,512,59,101,17309,17311,32768,8989,114,59,32768,8989,111,112,59,32768,8974,110,103,59,32768,367,114,105,59,32768,9721,99,114,59,32896,55349,56522,768,100,105,114,17343,17348,17354,111,116,59,32768,8944,108,100,101,59,32768,361,105,512,59,102,17360,17362,32768,9653,59,32768,9652,512,97,109,17370,17375,114,114,59,32768,8648,108,33024,252,59,32768,252,97,110,103,108,101,59,32768,10663,3840,65,66,68,97,99,100,101,102,108,110,111,112,114,115,122,17420,17425,17437,17443,17613,17617,17623,17667,17672,17678,17693,17699,17705,17711,17754,114,114,59,32768,8661,97,114,512,59,118,17432,17434,32768,10984,59,32768,10985,97,115,104,59,32768,8872,512,110,114,17448,17454,103,114,116,59,32768,10652,1792,101,107,110,112,114,115,116,17469,17478,17485,17494,17515,17526,17578,112,115,105,108,111,110,59,32768,1013,97,112,112,97,59,32768,1008,111,116,104,105,110,103,59,32768,8709,768,104,105,114,17501,17505,17508,105,59,32768,981,59,32768,982,111,112,116,111,59,32768,8733,512,59,104,17520,17522,32768,8597,111,59,32768,1009,512,105,117,17531,17537,103,109,97,59,32768,962,512,98,112,17542,17560,115,101,116,110,101,113,512,59,113,17553,17556,32896,8842,65024,59,32896,10955,65024,115,101,116,110,101,113,512,59,113,17571,17574,32896,8843,65024,59,32896,10956,65024,512,104,114,17583,17589,101,116,97,59,32768,977,105,97,110,103,108,101,512,108,114,17600,17606,101,102,116,59,32768,8882,105,103,104,116,59,32768,8883,121,59,32768,1074,97,115,104,59,32768,8866,768,101,108,114,17630,17648,17654,768,59,98,101,17637,17639,17644,32768,8744,97,114,59,32768,8891,113,59,32768,8794,108,105,112,59,32768,8942,512,98,116,17659,17664,97,114,59,32768,124,59,32768,124,114,59,32896,55349,56627,116,114,105,59,32768,8882,115,117,512,98,112,17685,17689,59,32896,8834,8402,59,32896,8835,8402,112,102,59,32896,55349,56679,114,111,112,59,32768,8733,116,114,105,59,32768,8883,512,99,117,17716,17721,114,59,32896,55349,56523,512,98,112,17726,17740,110,512,69,101,17732,17736,59,32896,10955,65024,59,32896,8842,65024,110,512,69,101,17746,17750,59,32896,10956,65024,59,32896,8843,65024,105,103,122,97,103,59,32768,10650,1792,99,101,102,111,112,114,115,17777,17783,17815,17820,17826,17829,17842,105,114,99,59,32768,373,512,100,105,17788,17809,512,98,103,17793,17798,97,114,59,32768,10847,101,512,59,113,17804,17806,32768,8743,59,32768,8793,101,114,112,59,32768,8472,114,59,32896,55349,56628,112,102,59,32896,55349,56680,59,32768,8472,512,59,101,17834,17836,32768,8768,97,116,104,59,32768,8768,99,114,59,32896,55349,56524,5428,17871,17891,0,17897,0,17902,17917,0,0,17920,17935,17940,17945,0,0,17977,17992,0,18008,18024,18029,768,97,105,117,17877,17881,17886,112,59,32768,8898,114,99,59,32768,9711,112,59,32768,8899,116,114,105,59,32768,9661,114,59,32896,55349,56629,512,65,97,17906,17911,114,114,59,32768,10234,114,114,59,32768,10231,59,32768,958,512,65,97,17924,17929,114,114,59,32768,10232,114,114,59,32768,10229,97,112,59,32768,10236,105,115,59,32768,8955,768,100,112,116,17951,17956,17970,111,116,59,32768,10752,512,102,108,17961,17965,59,32896,55349,56681,117,115,59,32768,10753,105,109,101,59,32768,10754,512,65,97,17981,17986,114,114,59,32768,10233,114,114,59,32768,10230,512,99,113,17996,18001,114,59,32896,55349,56525,99,117,112,59,32768,10758,512,112,116,18012,18018,108,117,115,59,32768,10756,114,105,59,32768,9651,101,101,59,32768,8897,101,100,103,101,59,32768,8896,2048,97,99,101,102,105,111,115,117,18052,18068,18081,18087,18092,18097,18103,18109,99,512,117,121,18058,18065,116,101,33024,253,59,32768,253,59,32768,1103,512,105,121,18073,18078,114,99,59,32768,375,59,32768,1099,110,33024,165,59,32768,165,114,59,32896,55349,56630,99,121,59,32768,1111,112,102,59,32896,55349,56682,99,114,59,32896,55349,56526,512,99,109,18114,18118,121,59,32768,1102,108,33024,255,59,32768,255,2560,97,99,100,101,102,104,105,111,115,119,18145,18152,18166,18171,18186,18191,18196,18204,18210,18216,99,117,116,101,59,32768,378,512,97,121,18157,18163,114,111,110,59,32768,382,59,32768,1079,111,116,59,32768,380,512,101,116,18176,18182,116,114,102,59,32768,8488,97,59,32768,950,114,59,32896,55349,56631,99,121,59,32768,1078,103,114,97,114,114,59,32768,8669,112,102,59,32896,55349,56683,99,114,59,32896,55349,56527,512,106,110,18221,18224,59,32768,8205,106,59,32768,8204])},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array([1024,97,103,108,113,9,23,27,31,1086,15,0,0,19,112,59,32768,38,111,115,59,32768,39,116,59,32768,62,116,59,32768,60,117,111,116,59,32768,34])},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),i=String.fromCodePoint||function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+=String.fromCharCode(e)};t.default=function(e){var t;return e>=55296&&e<=57343||e>1114111?"�":i(null!==(t=n.get(e))&&void 0!==t?t:e)}},function(e){e.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')},function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getTrie=t.encodeHTMLTrieRe=t.getCodePoint=void 0;var i=n(r(241));function o(e){return 55296==(64512&e)}t.getCodePoint=null!=String.prototype.codePointAt?function(e,t){return e.codePointAt(t)}:function(e,t){return o(e.charCodeAt(t))?1024*(e.charCodeAt(t)-55296)+e.charCodeAt(t+1)-56320+65536:e.charCodeAt(t)};var s=a(i.default);function a(e){for(var t,r,n,i,o=new Map,s=0,a=Object.keys(e);s4294967295||l(t)!==t)throw new a("`length` must be a positive 32-bit integer");var r=arguments.length>2&&!!arguments[2],n=!0,c=!0;if("length"in e&&s){var u=s(e,"length");u&&!u.configurable&&(n=!1),u&&!u.writable&&(c=!1)}return(n||c||!r)&&(o?i(e,"length",t,!0,!0):i(e,"length",t)),e}},function(e,t,r){"use strict";var n=Array.prototype.slice,i=r(248),o=Object.keys,s=o?function(e){return o(e)}:r(369),a=Object.keys;s.shim=function(){Object.keys?function(){var e=Object.keys(arguments);return e&&e.length===arguments.length}(1,2)||(Object.keys=function(e){return i(e)?a(n.call(e)):a(e)}):Object.keys=s;return Object.keys||s},e.exports=s},function(e,t,r){"use strict";var n;if(!Object.keys){var i=Object.prototype.hasOwnProperty,o=Object.prototype.toString,s=r(248),a=Object.prototype.propertyIsEnumerable,l=!a.call({toString:null},"toString"),c=a.call((function(){}),"prototype"),u=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],p=function(e){var t=e.constructor;return t&&t.prototype===e},f={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},h=function(){if("undefined"==typeof window)return!1;for(var e in window)try{if(!f["$"+e]&&i.call(window,e)&&null!==window[e]&&"object"==typeof window[e])try{p(window[e])}catch(e){return!0}}catch(e){return!0}return!1}();n=function(e){var t=null!==e&&"object"==typeof e,r="[object Function]"===o.call(e),n=s(e),a=t&&"[object String]"===o.call(e),f=[];if(!t&&!r&&!n)throw new TypeError("Object.keys called on a non-object");var d=c&&r;if(a&&e.length>0&&!i.call(e,0))for(var m=0;m0)for(var g=0;g1?arguments[1]:"[object Date]"===n.call(e)?String:Number)===String||t===Number){var r,s,a=t===String?["toString","valueOf"]:["valueOf","toString"];for(s=0;s1?s(e,arguments[1]):s(e)}},function(e,t,r){"use strict";var n,i,o,s,a=r(197),l=r(253)();if(l){n=a("Object.prototype.hasOwnProperty"),i=a("RegExp.prototype.exec"),o={};var c=function(){throw o};s={toString:c,valueOf:c},"symbol"==typeof Symbol.toPrimitive&&(s[Symbol.toPrimitive]=c)}var u=a("Object.prototype.toString"),p=Object.getOwnPropertyDescriptor;e.exports=l?function(e){if(!e||"object"!=typeof e)return!1;var t=p(e,"lastIndex");if(!(t&&n(t,"value")))return!1;try{i(e,s)}catch(e){return e===o}}:function(e){return!(!e||"object"!=typeof e&&"function"!=typeof e)&&"[object RegExp]"===u(e)}},function(e,t,r){"use strict";var n=r(254);e.exports=function(e){return("number"==typeof e||"bigint"==typeof e)&&!n(e)&&e!==1/0&&e!==-1/0}},function(e,t,r){"use strict";e.exports=function(e){return e>=0?1:-1}},function(e,t,r){"use strict";var n=r(168),i=r(169),o=n("%Number%"),s=n("%RegExp%"),a=n("%parseInt%"),l=r(197),c=r(252),u=r(383),p=l("String.prototype.slice"),f=c(/^0b[01]+$/i),h=c(/^0o[0-7]+$/i),d=c(/^[-+]0x[0-9a-f]+$/i),m=c(new s("["+["…","​","￾"].join("")+"]","g")),g=r(384),y=r(387);e.exports=function e(t){var r=u(t)?t:y(t,o);if("symbol"==typeof r)throw new i("Cannot convert a Symbol value to a number");if("string"==typeof r){if(f(r))return e(a(p(r,2),2));if(h(r))return e(a(p(r,2),8));if(m(r)||d(r))return NaN;var n=g(r);if(n!==r)return e(n)}return o(r)}},function(e,t,r){"use strict";e.exports=function(e){return null===e||"function"!=typeof e&&"object"!=typeof e}},function(e,t,r){"use strict";var n=r(215),i=r(202),o=r(218),s=r(255),a=r(256),l=r(386),c=n(a()),u=function(e){return o(e),c(e)};i(u,{getPolyfill:a,implementation:s,shim:l}),e.exports=u},function(e,t,r){"use strict";var n=r(168)("%String%"),i=r(169);e.exports=function(e){if("symbol"==typeof e)throw new i("Cannot convert a Symbol value to a string");return n(e)}},function(e,t,r){"use strict";var n=r(202),i=r(256);e.exports=function(){var e=i();return n(String.prototype,{trim:e},{trim:function(){return String.prototype.trim!==e}}),e}},function(e,t,r){"use strict";var n=r(388);e.exports=function(e){return arguments.length>1?n(e,arguments[1]):n(e)}},function(e,t,r){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator,i=r(250),o=r(251),s=r(389),a=r(390),l=function(e,t){if(null==e)throw new TypeError("Cannot call method on "+e);if("string"!=typeof t||"number"!==t&&"string"!==t)throw new TypeError('hint must be "string" or "number"');var r,n,s,a="string"===t?["toString","valueOf"]:["valueOf","toString"];for(s=0;s1&&(arguments[1]===String?r="string":arguments[1]===Number&&(r="number")),n&&(Symbol.toPrimitive?t=c(e,Symbol.toPrimitive):a(e)&&(t=Symbol.prototype.valueOf)),void 0!==t){var o=t.call(e,r);if(i(o))return o;throw new TypeError("unable to convert exotic object to primitive")}return"default"===r&&(s(e)||a(e))&&(r="string"),l(e,"default"===r?"number":r)}},function(e,t,r){"use strict";var n=Date.prototype.getDay,i=Object.prototype.toString,o=r(253)();e.exports=function(e){return"object"==typeof e&&null!==e&&(o?function(e){try{return n.call(e),!0}catch(e){return!1}}(e):"[object Date]"===i.call(e))}},function(e,t,r){"use strict";var n=Object.prototype.toString;if(r(243)()){var i=Symbol.prototype.toString,o=/^Symbol\(.*\)$/;e.exports=function(e){if("symbol"==typeof e)return!0;if("[object Symbol]"!==n.call(e))return!1;try{return function(e){return"symbol"==typeof e.valueOf()&&o.test(i.call(e))}(e)}catch(e){return!1}}}else e.exports=function(e){return!1}},function(e,t,r){"use strict"; -/*! https://mths.be/repeat v1.0.0 by @mathias */var n=r(202),i=r(257);e.exports=function(){var e=i();return String.prototype.repeat!==e&&n(String.prototype,{repeat:e}),e}},function(e,t,r){"use strict";r(258)},function(e,t,r){"use strict";r(259)},function(e,t,r){"use strict";r(260)},function(e,t,r){"use strict";r(261)},function(e,t,r){"use strict";r(262)},function(e,t,r){"use strict";r(263)},function(e,t,r){"use strict";r(264)},function(e,t,r){"use strict"; +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],Array(156).concat([function(e,t,r){"use strict";var n=r(266);const{toString:i}=Object.prototype,{getPrototypeOf:o}=Object,s=(a=Object.create(null),e=>{const t=i.call(e);return a[t]||(a[t]=t.slice(8,-1).toLowerCase())});var a;const l=e=>(e=e.toLowerCase(),t=>s(t)===e),c=e=>t=>typeof t===e,{isArray:u}=Array,p=c("undefined");const f=l("ArrayBuffer");const h=c("string"),d=c("function"),m=c("number"),g=e=>null!==e&&"object"==typeof e,y=e=>{if("object"!==s(e))return!1;const t=o(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},b=l("Date"),v=l("File"),w=l("Blob"),_=l("FileList"),x=l("URLSearchParams"),[A,S,E,C]=["ReadableStream","Request","Response","Headers"].map(l);function O(e,t,{allOwnKeys:r=!1}={}){if(null==e)return;let n,i;if("object"!=typeof e&&(e=[e]),u(e))for(n=0,i=e.length;n0;)if(n=r[i],t===n.toLowerCase())return n;return null}const k="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,L=e=>!p(e)&&e!==k;const P=(j="undefined"!=typeof Uint8Array&&o(Uint8Array),e=>j&&e instanceof j);var j;const R=l("HTMLFormElement"),D=(({hasOwnProperty:e})=>(t,r)=>e.call(t,r))(Object.prototype),N=l("RegExp"),B=(e,t)=>{const r=Object.getOwnPropertyDescriptors(e),n={};O(r,(r,i)=>{let o;!1!==(o=t(r,i,e))&&(n[i]=o||r)}),Object.defineProperties(e,n)},U="abcdefghijklmnopqrstuvwxyz",q={DIGIT:"0123456789",ALPHA:U,ALPHA_DIGIT:U+U.toUpperCase()+"0123456789"};const M=l("AsyncFunction");t.a={isArray:u,isArrayBuffer:f,isBuffer:function(e){return null!==e&&!p(e)&&null!==e.constructor&&!p(e.constructor)&&d(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||d(e.append)&&("formdata"===(t=s(e))||"object"===t&&d(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&f(e.buffer),t},isString:h,isNumber:m,isBoolean:e=>!0===e||!1===e,isObject:g,isPlainObject:y,isReadableStream:A,isRequest:S,isResponse:E,isHeaders:C,isUndefined:p,isDate:b,isFile:v,isBlob:w,isRegExp:N,isFunction:d,isStream:e=>g(e)&&d(e.pipe),isURLSearchParams:x,isTypedArray:P,isFileList:_,forEach:O,merge:function e(){const{caseless:t}=L(this)&&this||{},r={},n=(n,i)=>{const o=t&&T(r,i)||i;y(r[o])&&y(n)?r[o]=e(r[o],n):y(n)?r[o]=e({},n):u(n)?r[o]=n.slice():r[o]=n};for(let e=0,t=arguments.length;e(O(t,(t,i)=>{r&&d(t)?e[i]=Object(n.a)(t,r):e[i]=t},{allOwnKeys:i}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,r,n)=>{e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},toFlatObject:(e,t,r,n)=>{let i,s,a;const l={};if(t=t||{},null==e)return t;do{for(i=Object.getOwnPropertyNames(e),s=i.length;s-- >0;)a=i[s],n&&!n(a,e,t)||l[a]||(t[a]=e[a],l[a]=!0);e=!1!==r&&o(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:s,kindOfTest:l,endsWith:(e,t,r)=>{e=String(e),(void 0===r||r>e.length)&&(r=e.length),r-=t.length;const n=e.indexOf(t,r);return-1!==n&&n===r},toArray:e=>{if(!e)return null;if(u(e))return e;let t=e.length;if(!m(t))return null;const r=new Array(t);for(;t-- >0;)r[t]=e[t];return r},forEachEntry:(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let n;for(;(n=r.next())&&!n.done;){const r=n.value;t.call(e,r[0],r[1])}},matchAll:(e,t)=>{let r;const n=[];for(;null!==(r=e.exec(t));)n.push(r);return n},isHTMLForm:R,hasOwnProperty:D,hasOwnProp:D,reduceDescriptors:B,freezeMethods:e=>{B(e,(t,r)=>{if(d(e)&&-1!==["arguments","caller","callee"].indexOf(r))return!1;const n=e[r];d(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")}))})},toObjectSet:(e,t)=>{const r={},n=e=>{e.forEach(e=>{r[e]=!0})};return u(e)?n(e):n(String(e).split(t)),r},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:T,global:k,isContextDefined:L,ALPHABET:q,generateString:(e=16,t=q.ALPHA_DIGIT)=>{let r="";const{length:n}=t;for(;e--;)r+=t[Math.random()*n|0];return r},isSpecCompliantForm:function(e){return!!(e&&d(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),r=(e,n)=>{if(g(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[n]=e;const i=u(e)?[]:{};return O(e,(e,t)=>{const o=r(e,n+1);!p(o)&&(i[t]=o)}),t[n]=void 0,i}}return e};return r(e,0)},isAsyncFn:M,isThenable:e=>e&&(g(e)||d(e))&&d(e.then)&&d(e.catch)}},function(e,t,r){"use strict";var n=r(194),i=r(295),o={name:"Errored"},s=r(4),a=Object(s.a)(o,(function(){return(0,this._self._c)("p",{staticClass:"vue-component component-error-notice"},[this._v("\n\tSorry, could not load user interface from server. Please try again.\n")])}),[],!1,null,null,null).exports;const l=/[\s\.,;:"'!&\(\{\[\)\}\]]+/g,c=(e,t)=>null===t?"":"string"==typeof t?t.replace(/\s+/g," "):t;class u extends n.Utils{static kebabToCamelCase(e){return e.replace(/-(\w)/g,(e,t)=>t?t.toUpperCase():"")}static enableHtmlProps(e){u.isObject(e.$root)&&e.$root.$options.shadowRoot&&("complete"===document.readyState?u.readHtmlProps(e):document.addEventListener("readystatechange",()=>u.enableHtmlProps(e),{once:!0}))}static readHtmlProps(e){if(!u.isObject(e)||!u.isObject(e.$slots)||!Array.isArray(e.$slots.default))return;let t=e.$slots.default.filter(e=>"string"==typeof e.tag&&"SCRIPT"===e.tag.toUpperCase()&&"string"==typeof e.data.attrs.type&&e.data.attrs.type.includes("application/json"));for(let r of t){let t=null;try{"string"==typeof r.data.attrs.prop&&r.data.attrs.prop.length>0&&(t=u.kebabToCamelCase(r.data.attrs.prop));let n=JSON.parse(r.data.domProps.innerHTML);if(t)u.setProp(e,t,n);else if(u.isObject(n))for(let t in n)u.setProp(e,t,n[t]);else console.error("Props passed via script tag must be contained in an object.")}catch(e){t?console.error(`Prop '${t}' passed via script tag is invalid: ${e.message}`):console.error("Props passed via script tag are invalid: "+e.message)}}}static loadFontAwesome(e){let t=u.isObject(e.$root)&&e.$root.$options.shadowRoot,r=Array.from((t||document).styleSheets);for(let e of r)if("string"==typeof e.href&&e.href.includes("fontawesome"))return;if(!t){let e=document.createElement("link");e.as="font",e.type="font/woff2",e.crossOrigin=!0,e.href="https://use.fontawesome.com/releases/v5.13.0/webfonts/fa-solid-900.woff2",document.head.appendChild(e)}let n=document.createElement("link");n.rel="stylesheet",n.type="text/css",n.media="all",n.href="https://use.fontawesome.com/releases/v5.13.0/css/all.css",(t||document.head).appendChild(n)}static setProp(e,t,r){let n=u.isObject(e.$props)?e.$props:e.$options.propsData;e.$set(n,u.kebabToCamelCase(t),r)}static loadAsyncComponent(e){return{component:e,loading:i.a,error:a,delay:0,timeout:1e4}}static dataType(e,t=!1,r=2,i=0){let o=new n.ProcessSchema(e);var s=new Set;for(let e in o.schemas){let n=o.schemas[e],a=n.nativeDataType(),l=n.dataType();if(n.isEditable()){if(t&&o.schemas.filter(e=>e.nativeDataType()===a).length>r){s.add(a);continue}}else a=l;let c=a===l?l:`${l}:${a}`;if("array"===a&&u.isObject(n.schema.items)){let e=u.dataType(n.schema.items,t,r,i+1);"any"!==e&&(c+=`<${e}>`)}s.add(c)}return s.has("any")?"any":Array.from(s).join(t||i>0?"|":", ")}static htmlentities_decode(e){return"string"!=typeof e&&(e=String(e)),e.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'")}static htmlentities(e){return"string"!=typeof e&&(e=String(e)),e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}static countObjectKeys(e){var t={};for(var r in e){var n=e[r];if("object"!=typeof n||null===n||Array.isArray(n))return null;for(var i in n)void 0===t[i]?t[i]=1:t[i]++}return t}static isTableLike(e,t=!1){if("object"!=typeof e||null===e)return[];var r=u.countObjectKeys(e);if(null!==r){if(!0===t)return Object.keys(r);var n=0,i=0;for(var o in r)n++,i+=r[o];var s=i/n,a=Array.isArray(a)?e.length:Object.keys(e).length;if(s>a/2)return Object.keys(r)}return[]}static isUrl(e,t=!0){if(!u.hasText(e))return!1;try{let r=new URL(e);return!(t&&!r.protocol.match(/^https?:$/i))}catch(e){return!1}}static prettifyAbbreviation(e){return"string"==typeof e&&null===e.match(/[A-Z]+/)?e.toUpperCase():e}static ensurePoint(e,t=null){return"function"!=typeof t&&(t=()=>[0,0]),Array.isArray(e)?("number"!=typeof e[0]&&(e[0]=t()[0]||0),"number"!=typeof e[1]&&(e[1]=t()[1]||0),e):t()}static formatRef(e){if(this.isRef(e)){if(e.from_node)return"#"+e.from_node;if(e.from_parameter)return"$"+e.from_parameter}return e}static isRef(e){return u.isObject(e)&&(e.from_parameter||e.from_node)}static isRefEqual(e,t){return!(!u.isRef(e)||!u.isRef(t))&&(!(!e.from_parameter||e.from_parameter!==t.from_parameter)||!(!e.from_node||e.from_node!==t.from_node))}static detectGeoJson(e){if(!u.isObject(e))return!1;if("string"!=typeof e.type)return!1;switch(e.type){case"Point":case"MultiPoint":case"LineString":case"MultiLineString":case"Polygon":case"MultiPolygon":return!!Array.isArray(e.coordinates);case"GeometryCollection":return!!Array.isArray(e.geometries);case"Feature":return!(null!==e.geometry&&!u.isObject(e.geometry))&&!(null!==e.properties&&!u.isObject(e.properties));case"FeatureCollection":return!!Array.isArray(e.features);default:return!1}}static toProcessParameters(e){if(u.isObject(e)){let t=[];for(let r in e){let n=e[r],i=u.omitFromObject(n,["description","required","default","federation:backends"]);t.push({name:r,description:n.description,optional:!n.required,default:n.default,"federation:backends":n["federation:backends"],schema:i})}return t.sort((e,t)=>u.compareStringCaseInsensitive(e.name,t.name))}return[]}static formatCurrency(e,t,r=""){if("number"!=typeof e)return r;try{return e.toLocaleString(void 0,{style:"currency",currency:t})}catch(r){let n=e.toLocaleString(void 0,{maximumFractionDigits:2});return"string"==typeof t&&(n+=" ",n+=t),n.trim()}}static formatBudget(e,t,r="Unlimited"){return null===e?r:u.formatCurrency(e,t)}static formatTimestamp(e,t="n/a"){if("string"==typeof e)try{return new Date(e).toLocaleString(void 0,{timeZone:"UTC",timeZoneName:"short"})}catch(e){}return t}static formatFileSize(e,t="n/a"){if("number"!=typeof e)return t;let r=0==e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,r)).toLocaleString(void 0,{maximumFractionDigits:1})} ${["B","kB","MB","GB","TB","PB"][r]}`}static formatProcessSignature(e,t=!0){let r=[];if(Array.isArray(e.parameters))for(let n in e.parameters){let i,o=e.parameters[n],s=u.dataType(o.schema,!0,1),a=o.optional?"?":"",l="";o.optional&&void 0!==o.default&&(l=JSON.stringify(o.default)),t?(i=`${a}${u.htmlentities(s)} ${u.htmlentities(o.name)}`,l&&(l.length>30&&(l=``),i+=` = ${l}`)):i=a+s+" "+o.name+l,r.push(i)}let n="("+r.join(", ")+") : ",i=u.isObject(e.returns)&&e.returns.schema&&"object"==typeof e.returns.schema?e.returns.schema:{},o=u.dataType(i,!0,2);return t?`${u.htmlentities(e.process.id)}${n}${u.htmlentities(o)}`:e.process.id+n+o}static search(e,t,r=!0){if("string"!=typeof e||0===e.length)return!1;if(u.isObject(t)?t=Object.values(t):"string"==typeof t&&(t=[t]),!Array.isArray(t))return!1;return e=e.toLowerCase().split(l),t=t.map(e=>"string"==typeof e?e:JSON.stringify(e,c,0)).join(" ").replace(l," ").toLowerCase(),e[r?"every":"some"](e=>t.includes(e))}}t.a=u},,,,,,,,function(e,t,r){var n=r(347);class i{static isObject(e){return"object"==typeof e&&e===Object(e)&&!Array.isArray(e)}static hasText(e){return"string"==typeof e&&e.length>0}static equals(e,t){return n(e,t)}static pickFromObject(e,t){e=Object(e),"string"==typeof t&&(t=[t]);const r={};return t.forEach(t=>r[t]=e[t]),r}static omitFromObject(e,t){e=Object(e),"string"==typeof t&&(t=[t]);var r=Object.assign({},e);for(let e of t)delete r[e];return r}static mapObject(e,t){const r=Object.keys(e),n=new Array(r.length);return r.forEach((r,i)=>{n[i]=t(e[r],r,e)}),n}static mapObjectValues(e,t){e=Object(e);const r={};return Object.keys(e).forEach(n=>{r[n]=t(e[n],n,e)}),r}static unique(e,t=!1){return t?e.filter((e,t,r)=>r.findIndex(t=>i.equals(e,t))===t):[...new Set(e)]}static size(e){return"object"==typeof e&&null!==e?Array.isArray(e)?e.length:Object.keys(e).length:0}static isNumeric(e){return!isNaN(parseFloat(e))&&isFinite(e)}static deepClone(e){return JSON.parse(JSON.stringify(e))}static normalizeUrl(e,t=null){let r=e.replace(/\/$/,"");return"string"==typeof t&&("/"!==t.substr(0,1)&&(t="/"+t),r+=t.replace(/\/$/,"")),r}static replacePlaceholders(e,t={}){if("string"==typeof e&&i.isObject(t))for(var r in t){let n=t[r];e=e.replace("{"+r+"}",Array.isArray(n)?n.join("; "):n)}return e}static compareStringCaseInsensitive(e,t){return"string"!=typeof e&&(e=String(e)),"string"!=typeof t&&(t=String(t)),e.localeCompare(t,void 0,{numeric:!0,sensitivity:"base"})}static prettifyString(e,t="; "){return Array.isArray(e)||(e=[String(e)]),(e=e.map(e=>{if(e.length>=3){const t=(e,t,r)=>t+" "+r.toUpperCase();return(e=e.includes("_")?e.replace(/([a-zA-Z\d])_([a-zA-Z\d])/g,t):e.includes("-")?e.replace(/([a-zA-Z\d])-([a-zA-Z\d])/g,t):e.replace(/([a-z])([A-Z])/g,t)).charAt(0).toUpperCase()+e.substr(1)}return e})).join(t)}static friendlyLinks(e,t=!0,r=["self"]){let n=[];if(!Array.isArray(e))return n;for(let t of e)t=Object.assign({},t),"string"==typeof t.rel&&r.includes(t.rel.toLowerCase())||("string"==typeof t.title&&0!==t.title.length||("string"==typeof t.rel&&t.rel.length>1?t.title=i.prettifyString(t.rel):t.title=t.href.replace(/^https?:\/\/(www.)?/i,"").replace(/\/$/i,"")),n.push(t));return t&&n.sort((e,t)=>i.compareStringCaseInsensitive(e.title,t.title)),n}}e.exports=i},function(e,t,r){"use strict";var n=r(156);function i(e,t,r,n,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),i&&(this.response=i)}n.a.inherits(i,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:n.a.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const o=i.prototype,s={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{s[e]={value:e}}),Object.defineProperties(i,s),Object.defineProperty(o,"isAxiosError",{value:!0}),i.from=(e,t,r,s,a,l)=>{const c=Object.create(o);return n.a.toFlatObject(e,c,(function(e){return e!==Error.prototype}),e=>"isAxiosError"!==e),i.call(c,e.message,t,r,s,a),c.cause=e,c.name=e.name,l&&Object.assign(c,l),c},t.a=i},,function(e,t,r){"use strict";var n=r(362),i=r(363),o=r(364),s=r(365),a=r(243),l=r(169),c=r(366),u=Function,p=function(e){try{return u('"use strict"; return ('+e+").constructor;")()}catch(e){}},f=Object.getOwnPropertyDescriptor;if(f)try{f({},"")}catch(e){f=null}var h=function(){throw new l},d=f?function(){try{return h}catch(e){try{return f(arguments,"callee").get}catch(e){return h}}}():h,m=r(244)(),g=r(367)(),y=Object.getPrototypeOf||(g?function(e){return e.__proto__}:null),b={},v="undefined"!=typeof Uint8Array&&y?y(Uint8Array):void 0,w={__proto__:null,"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":m&&y?y([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":b,"%AsyncGenerator%":b,"%AsyncGeneratorFunction%":b,"%AsyncIteratorPrototype%":b,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?void 0:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?void 0:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":n,"%eval%":eval,"%EvalError%":i,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":u,"%GeneratorFunction%":b,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":m&&y?y(y([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&m&&y?y((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":o,"%ReferenceError%":s,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&m&&y?y((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":m&&y?y(""[Symbol.iterator]()):void 0,"%Symbol%":m?Symbol:void 0,"%SyntaxError%":a,"%ThrowTypeError%":d,"%TypedArray%":v,"%TypeError%":l,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":c,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet};if(y)try{null.error}catch(e){var _=y(y(e));w["%Error.prototype%"]=_}var x={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},A=r(216),S=r(368),E=A.call(Function.call,Array.prototype.concat),C=A.call(Function.apply,Array.prototype.splice),O=A.call(Function.call,String.prototype.replace),T=A.call(Function.call,String.prototype.slice),k=A.call(Function.call,RegExp.prototype.exec),L=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,P=/\\(\\)?/g,j=function(e){var t=T(e,0,1),r=T(e,-1);if("%"===t&&"%"!==r)throw new a("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==t)throw new a("invalid intrinsic syntax, expected opening `%`");var n=[];return O(e,L,(function(e,t,r,i){n[n.length]=r?O(i,P,"$1"):t||e})),n},R=function(e,t){var r,n=e;if(S(x,n)&&(n="%"+(r=x[n])[0]+"%"),S(w,n)){var i=w[n];if(i===b&&(i=function e(t){var r;if("%AsyncFunction%"===t)r=p("async function () {}");else if("%GeneratorFunction%"===t)r=p("function* () {}");else if("%AsyncGeneratorFunction%"===t)r=p("async function* () {}");else if("%AsyncGenerator%"===t){var n=e("%AsyncGeneratorFunction%");n&&(r=n.prototype)}else if("%AsyncIteratorPrototype%"===t){var i=e("%AsyncGenerator%");i&&y&&(r=y(i.prototype))}return w[t]=r,r}(n)),void 0===i&&!t)throw new l("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:r,name:n,value:i}}throw new a("intrinsic "+e+" does not exist!")};e.exports=function(e,t){if("string"!=typeof e||0===e.length)throw new l("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof t)throw new l('"allowMissing" argument must be a boolean');if(null===k(/^%?[^%]*%?$/,e))throw new a("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=j(e),n=r.length>0?r[0]:"",i=R("%"+n+"%",t),o=i.name,s=i.value,c=!1,u=i.alias;u&&(n=u[0],C(r,E([0,1],u)));for(var p=1,h=!0;p=r.length){var y=f(s,d);s=(h=!!y)&&"get"in y&&!("originalValue"in y.get)?y.get:s[d]}else h=S(s,d),s=s[d];h&&!c&&(w[o]=s)}}return s}},function(e,t,r){"use strict";e.exports=TypeError},,,,,,,,function(e,t,r){"use strict";t.a={components:{FederationNotice:()=>Promise.all([r.e(0),r.e(35)]).then(r.bind(null,471)),FederationMissingNotice:()=>Promise.all([r.e(0),r.e(32)]).then(r.bind(null,472))},props:{federation:{type:Object,default:()=>({})}}}},,,,,,,,,,,,,,,,,function(e,t,r){const n=r(346),i=r(349),o=r(350),s=r(235),a=r(351),l=r(236),c=r(196),u=r(237),p=r(195),f=r(165);e.exports={MigrateCapabilities:n,MigrateCollections:i,MigrateProcesses:o,ProcessDataType:s,ProcessParameter:a,ProcessSchema:l,ProcessUtils:c,ProcessRegistry:u,Versions:p,Utils:f}},function(e,t,r){const n=r(348);class i{static compare(e,t,r=null){return null!==r?n.compare(e,t,r):n(e,t)}static validate(e){return n.validate(e)}static findCompatible(e,t=!0,r=null,n=null){if(!Array.isArray(e)||0===e.length)return[];let o=e.filter(e=>{if("string"==typeof e.url&&i.validate(e.api_version)){let t=i.validate(r),o=i.validate(n);return t&&o?i.compare(e.api_version,r,">=")&&i.compare(e.api_version,n,"<="):t?i.compare(e.api_version,r,">="):!o||i.compare(e.api_version,n,"<=")}return!1});return 0===o.length?[]:o.sort((e,r)=>{let n=!0===e.production,o=!0===r.production;return t&&n!==o?n?-1:1:-1*i.compare(e.api_version,r.api_version)})}static findLatest(e,t=!0,r=null,n=null){let o=i.findCompatible(e,t,r,n);return o.length>0?o[0]:null}}e.exports=i},function(e,t,r){const n=r(165);class i{static normalizeJsonSchema(e,t=!1){e=n.isObject(e)?[e]:Array.isArray(e)?e:[];let r=[];for(let t of e)if(Array.isArray(t.allOf))r.push(Object.assign({},...t.allOf));else if(Array.isArray(t.oneOf)||Array.isArray(t.anyOf)){let e=n.omitFromObject(t,["oneOf","anyOf"]),i=t.oneOf||t.anyOf;for(let t of i)r.push(Object.assign({},e,t))}else r.push(t);if(!t)return r;e=[];for(let t of r)Array.isArray(t.type)?e=e.concat(t.type.map(e=>Object.assign({},t,{type:e}))):e.push(t);return e}static getCallbackParameters(e,t=[]){if(!n.isObject(e)||!e.schema)return[];let r,o=i.normalizeJsonSchema(e.schema);for(;r=t.shift();)o=o.map(e=>i.normalizeJsonSchema(i.getElementJsonSchema(e,r))),o=o.concat(...o);let s=[];for(let e of o){let t=null;if(Array.isArray(e.parameters)?t=e.parameters:n.isObject(e.additionalProperties)&&Array.isArray(e.additionalProperties.parameters)&&(t=e.additionalProperties.parameters),Array.isArray(t)){if(s.length>0&&!n.equals(s,t))throw new Error("Multiple schemas with different callback parameters found.");s=t}}return s}static getCallbackParametersForProcess(e,t,r=[]){if(!n.isObject(e)||!Array.isArray(e.parameters))return[];let o=e.parameters.find(e=>e.name===t);return i.getCallbackParameters(o,r)}static getNativeTypesForJsonSchema(e,t=!1){if(n.isObject(e)&&Array.isArray(e.type)){let r=n.unique(e.type).filter(e=>i.JSON_SCHEMA_TYPES.includes(e));return r.length>0&&r.length-1?i(r):r}},,,,,function(e,t,r){"use strict";var n=r(370),i="function"==typeof Symbol&&"symbol"==typeof Symbol("foo"),o=Object.prototype.toString,s=Array.prototype.concat,a=r(246),l=r(248)(),c=function(e,t,r,n){if(t in e)if(!0===n){if(e[t]===r)return}else if("function"!=typeof(i=n)||"[object Function]"!==o.call(i)||!n())return;var i;l?a(e,t,r,!0):a(e,t,r)},u=function(e,t){var r=arguments.length>2?arguments[2]:{},o=n(t);i&&(o=s.call(o,Object.getOwnPropertySymbols(t)));for(var a=0;an.isObject(e)&&"string"==typeof e.href).map(e=>("string"!=typeof e.rel&&(e.rel=r),e)):[]}static migrateDiscoveryParameters(e,t){if(i.compare(t,"1.0.0-rc.2","<="))for(var r in e){if(!n.isObject(e[r])){delete e[r];continue}let t=e[r].type;"string"==typeof t&&(e[r].type=[t,"null"]);let i=e[r].example;void 0!==i&&(e[r].examples=[i],delete e[r].example)}return e}}},function(e,t,r){"use strict";var n=r(216),i=r(168),o=r(369),s=r(169),a=i("%Function.prototype.apply%"),l=i("%Function.prototype.call%"),c=i("%Reflect.apply%",!0)||n.call(l,a),u=r(217),p=i("%Math.max%");e.exports=function(e){if("function"!=typeof e)throw new s("a function is required");var t=c(n,l,arguments);return o(t,1+p(0,e.length-(arguments.length-1)),!0)};var f=function(){return c(n,a,arguments)};u?u(e.exports,"apply",{value:f}):e.exports.apply=f},function(e,t,r){"use strict";var n=r(361);e.exports=Function.prototype.bind||n},function(e,t,r){"use strict";var n=r(168)("%Object.defineProperty%",!0)||!1;if(n)try{n({},"a",{value:1})}catch(e){n=!1}e.exports=n},function(e,t,r){"use strict";var n=r(169);e.exports=function(e){if(null==e)throw new n(arguments.length>0&&arguments[1]||"Cannot call method on "+e);return e}},,,,,,,,,,,,,,,,,function(e,t,r){const n=r(165);class i{constructor(e,t=null,r){this.schema=e,void 0===this.schema.default&&(this.schema.default=r),this.parent=t}toJSON(){return Object.assign({},this.schema,{default:this.default()})}isAny(){return"any"===this.dataType()}isNull(){return"null"===this.schema.type}nullable(){return this.isNull()||this.isAny()}isEditable(){return!i.NON_EDITABLE.includes(this.dataType())}dataType(e=!1){let t=this.schema.type||"any";return e?t:this.schema.subtype||t}nativeDataType(){return this.dataType(!0)}isEnum(){return Array.isArray(this.schema.enum)&&this.schema.enum.length>0}getEnumChoices(){return this.isEnum()?this.schema.enum:[]}getCallbackParameters(){return Array.isArray(this.schema.parameters)?this.schema.parameters:n.isObject(this.schema.additionalProperties)&&Array.isArray(this.schema.additionalProperties.parameters)?this.schema.additionalProperties.parameters:[]}group(){return n.hasText(this.schema.group)?this.schema.group:i.DEFAULT_GROUP}title(){return n.hasText(this.schema.title)?this.schema.title:n.prettifyString(this.dataType())}description(){return n.hasText(this.schema.description)?this.schema.description:""}default(){return"function"==typeof this.schema.default?this.schema.default():this.schema.default}}i.DEFAULT_GROUP="Other",i.NON_EDITABLE=["raster-cube","vector-cube","labeled-array"],e.exports=i},function(e,t,r){const n=r(196),i=r(235),o=r(165);e.exports=class{constructor(e=null,t){if(o.isObject(e)||Array.isArray(e))if(this.unspecified=!1,this.schemas=n.normalizeJsonSchema(e,!0).map(e=>new i(e,this,t)),void 0===t){let e=this.schemas.map(e=>e.default()).filter(e=>void 0!==e);this.default=e[0]}else this.default=t;else this.unspecified=!0,this.schemas=[];this.refs=[]}toJSON(){return this.schemas.map(e=>e.toJSON())}isEditable(){return this.unspecified||this.schemas.filter(e=>e.isEditable()&&!e.isNull()).length>0}is(e){var t=this.dataTypes();return 1===t.length&&t[0]===e}nativeDataType(){return this.dataType(!0)}dataType(e=!1){var t=this.dataTypes(!0,e),r=t.indexOf("null");return 1===t.length?t[0]:2===t.length&&-1!==r?t[0===r?1:0]:"mixed"}dataTypes(e=!1,t=!1){var r=this.schemas.map(e=>e.dataType(t)).filter((e,t,r)=>r.indexOf(e)===t);return 0===r.length||r.includes("any")?["any"]:e?r:r.filter(e=>"null"!==e)}nullable(){return this.unspecified||this.schemas.filter(e=>e.nullable()).length>0}}},function(e,t,r){const n=r(165);class i{constructor(e=[],t=!1){if(this.listeners=[],this.processes={},this.addNamespace=t,e instanceof i)for(let t in e.processes)this.addAll(e.processes[t]);else this.addAll(e)}onChange(e,t,r){for(let n of this.listeners)n(e,t,r)}addAll(e,t="backend"){for(var r in e)this.add(e[r],t,!1);this.onChange("addAll",e,t)}add(e,t="backend",r=!0){if(!n.isObject(e))throw new Error("Invalid process; not an object.");if("string"!=typeof e.id)throw new Error("Invalid process; no id specified.");if("string"!=typeof t)throw new Error("Invalid namespace; not a string.");this.processes[t]||(this.processes[t]={}),e=Object.assign(this.addNamespace?{namespace:t}:{},e),this.processes[t][e.id]=e,r&&this.onChange("add",e,t)}count(){return n.size(this.all())}all(){let e=[];for(let t in this.processes)e=e.concat(Object.values(this.processes[t]));return e}hasNamespace(e){return"string"==typeof e&&Boolean(this.processes[e])}namespaces(){return Object.keys(this.processes).sort()}namespace(e){if("string"!=typeof e)return[];let t=this.processes[e];return t?Object.values(t):[]}has(e,t=null){return Boolean(this.get(e,t))}get(e,t=null){return"string"!=typeof e?null:null===t?this.get(e,"user")||this.get(e,"backend"):this.processes[t]&&this.processes[t][e]||null}remove(e=null,t="user"){if("string"!=typeof t)return!1;if(this.processes[t]){if("string"!=typeof e)return delete this.processes[t],this.onChange("remove",null,t),!0;if(this.processes[t][e]){let r=this.processes[t][e];return delete this.processes[t][e],0===n.size(this.processes[t])&&delete this.processes[t],this.onChange("remove",r,t),!0}}return!1}}e.exports=i},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXMLStrict=t.decodeHTML5Strict=t.decodeHTML4Strict=t.decodeHTML5=t.decodeHTML4=t.decodeHTMLStrict=t.decodeHTML=t.decodeXML=t.encodeHTML5=t.encodeHTML4=t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=t.encode=t.decodeStrict=t.decode=t.EncodingMode=t.DecodingMode=t.EntityLevel=void 0;var n,i,o,s=r(240),a=r(241);!function(e){e[e.XML=0]="XML",e[e.HTML=1]="HTML"}(n=t.EntityLevel||(t.EntityLevel={})),function(e){e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict"}(i=t.DecodingMode||(t.DecodingMode={})),function(e){e[e.UTF8=0]="UTF8",e[e.ASCII=1]="ASCII",e[e.Extensive=2]="Extensive"}(o=t.EncodingMode||(t.EncodingMode={})),t.decode=function(e,t){void 0===t&&(t=n.XML);var r="number"==typeof t?{level:t}:t;return r.level===n.HTML?r.mode===i.Strict?s.decodeHTMLStrict(e):s.decodeHTML(e):s.decodeXML(e)},t.decodeStrict=function(e,t){void 0===t&&(t=n.XML);var r="number"==typeof t?{level:t}:t;return r.level===n.HTML?r.mode===i.Legacy?s.decodeHTML(e):s.decodeHTMLStrict(e):s.decodeXML(e)},t.encode=function(e,t){void 0===t&&(t=n.XML);var r="number"==typeof t?{level:t}:t;return r.mode===o.UTF8?a.escapeUTF8(e):r.level===n.HTML?r.mode===o.ASCII?a.encodeNonAsciiHTML(e):a.encodeHTML(e):a.encodeXML(e)};var l=r(241);Object.defineProperty(t,"encodeXML",{enumerable:!0,get:function(){return l.encodeXML}}),Object.defineProperty(t,"encodeHTML",{enumerable:!0,get:function(){return l.encodeHTML}}),Object.defineProperty(t,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return l.encodeNonAsciiHTML}}),Object.defineProperty(t,"escape",{enumerable:!0,get:function(){return l.escape}}),Object.defineProperty(t,"escapeUTF8",{enumerable:!0,get:function(){return l.escapeUTF8}}),Object.defineProperty(t,"encodeHTML4",{enumerable:!0,get:function(){return l.encodeHTML}}),Object.defineProperty(t,"encodeHTML5",{enumerable:!0,get:function(){return l.encodeHTML}});var c=r(240);Object.defineProperty(t,"decodeXML",{enumerable:!0,get:function(){return c.decodeXML}}),Object.defineProperty(t,"decodeHTML",{enumerable:!0,get:function(){return c.decodeHTML}}),Object.defineProperty(t,"decodeHTMLStrict",{enumerable:!0,get:function(){return c.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML4",{enumerable:!0,get:function(){return c.decodeHTML}}),Object.defineProperty(t,"decodeHTML5",{enumerable:!0,get:function(){return c.decodeHTML}}),Object.defineProperty(t,"decodeHTML4Strict",{enumerable:!0,get:function(){return c.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML5Strict",{enumerable:!0,get:function(){return c.decodeHTMLStrict}}),Object.defineProperty(t,"decodeXMLStrict",{enumerable:!0,get:function(){return c.decodeXML}})},function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXML=t.decodeHTMLStrict=t.decodeHTML=t.determineBranch=t.JUMP_OFFSET_BASE=t.BinTrieFlags=t.xmlDecodeTree=t.htmlDecodeTree=void 0;var i=n(r(354));t.htmlDecodeTree=i.default;var o=n(r(355));t.xmlDecodeTree=o.default;var s,a=n(r(356));function l(e){return function(t,r){for(var n="",i=0,o=0;(o=t.indexOf("&",o))>=0;)if(n+=t.slice(i,o),i=o,o+=1,35!==t.charCodeAt(o)){for(var l=null,u=1,p=0,f=e[p];o=48&&m<=57||16===d&&(32|m)>=97&&(32|m)<=102;);if(h!==o){var g=t.substring(h,o),y=parseInt(g,d);if(59===t.charCodeAt(o))o+=1;else if(r)continue;n+=a.default(y),i=o}}return n+t.slice(i)}}function c(e,r,n,i){if(r<=128)return i===r?n:-1;var o=(r&s.BRANCH_LENGTH)>>8;if(0===o)return-1;if(1===o)return i===e[n]?n+1:-1;var a=r&s.JUMP_TABLE;if(a){var l=i-t.JUMP_OFFSET_BASE-a;return l<0||l>o?-1:e[n+l]-1}for(var c=n,u=c+o-1;c<=u;){var p=c+u>>>1,f=e[p];if(fi))return e[p+o];u=p-1}}return-1}!function(e){e[e.HAS_VALUE=32768]="HAS_VALUE",e[e.BRANCH_LENGTH=32512]="BRANCH_LENGTH",e[e.MULTI_BYTE=128]="MULTI_BYTE",e[e.JUMP_TABLE=127]="JUMP_TABLE"}(s=t.BinTrieFlags||(t.BinTrieFlags={})),t.JUMP_OFFSET_BASE=47,t.determineBranch=c;var u=l(i.default),p=l(o.default);t.decodeHTML=function(e){return u(e,!1)},t.decodeHTMLStrict=function(e){return u(e,!0)},t.decodeXML=function(e){return p(e,!0)}},function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=void 0;var i=n(r(357)),o=r(358),s=p(n(r(242)).default,!0),a=p(i.default,!0),l=p(i.default,!1),c=new Map(Object.keys(i.default).map((function(e){return[i.default[e].charCodeAt(0),"&"+e+";"]})));function u(e){for(var t,r="",n=0;null!==(t=a.exec(e));){var i=t.index,s=e.charCodeAt(i),l=c.get(s);l?(r+=e.substring(n,i)+l,n=i+1):(r+=e.substring(n,i)+"&#x"+o.getCodePoint(e,i).toString(16)+";",n=a.lastIndex+=Number(55296==(65408&s)))}return r+e.substr(n)}function p(e,t){for(var r=Object.keys(e).map((function(t){return"\\"+e[t].charAt(0)})).filter((function(e){return!t||e.charCodeAt(1)<128})).sort((function(e,t){return e.charCodeAt(1)-t.charCodeAt(1)})).filter((function(e,t,r){return e!==r[t+1]})),n=0;n","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},function(e,t,r){"use strict";e.exports=SyntaxError},function(e,t,r){"use strict";var n="undefined"!=typeof Symbol&&Symbol,i=r(245);e.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&i())))}},function(e,t,r){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),r=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var n=Object.getOwnPropertySymbols(e);if(1!==n.length||n[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var i=Object.getOwnPropertyDescriptor(e,t);if(42!==i.value||!0!==i.enumerable)return!1}return!0}},function(e,t,r){"use strict";var n=r(217),i=r(243),o=r(169),s=r(247);e.exports=function(e,t,r){if(!e||"object"!=typeof e&&"function"!=typeof e)throw new o("`obj` must be an object or a function`");if("string"!=typeof t&&"symbol"!=typeof t)throw new o("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new o("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new o("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new o("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new o("`loose`, if provided, must be a boolean");var a=arguments.length>3?arguments[3]:null,l=arguments.length>4?arguments[4]:null,c=arguments.length>5?arguments[5]:null,u=arguments.length>6&&arguments[6],p=!!s&&s(e,t);if(n)n(e,t,{configurable:null===c&&p?p.configurable:!c,enumerable:null===a&&p?p.enumerable:!a,value:r,writable:null===l&&p?p.writable:!l});else{if(!u&&(a||l||c))throw new i("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");e[t]=r}}},function(e,t,r){"use strict";var n=r(168)("%Object.getOwnPropertyDescriptor%",!0);if(n)try{n([],"length")}catch(e){n=null}e.exports=n},function(e,t,r){"use strict";var n=r(217),i=function(){return!!n};i.hasArrayLengthDefineBug=function(){if(!n)return null;try{return 1!==n([],"length",{value:1}).length}catch(e){return!0}},e.exports=i},function(e,t,r){"use strict";var n=Object.prototype.toString;e.exports=function(e){var t=n.call(e),r="[object Arguments]"===t;return r||(r="[object Array]"!==t&&null!==e&&"object"==typeof e&&"number"==typeof e.length&&e.length>=0&&"[object Function]"===n.call(e.callee)),r}},function(e,t,r){"use strict"; +/*! https://mths.be/repeat v1.0.0 by @mathias */var n=r(372),i=r(373),o=r(374);e.exports=function(e){var t=n(this),r=i(t),s=o(e);if(s<0||s==1/0)throw RangeError("String.prototype.repeat argument must be greater than or equal to 0 and not be Infinity");for(var a="";s;)s%2==1&&(a+=r),s>1&&(r+=r),s>>=1;return a}},function(e,t,r){"use strict";e.exports=function(e){return null===e||"function"!=typeof e&&"object"!=typeof e}},function(e,t,r){"use strict";var n,i,o=Function.prototype.toString,s="object"==typeof Reflect&&null!==Reflect&&Reflect.apply;if("function"==typeof s&&"function"==typeof Object.defineProperty)try{n=Object.defineProperty({},"length",{get:function(){throw i}}),i={},s((function(){throw 42}),null,n)}catch(e){e!==i&&(s=null)}else s=null;var a=/^\s*class\b/,l=function(e){try{var t=o.call(e);return a.test(t)}catch(e){return!1}},c=function(e){try{return!l(e)&&(o.call(e),!0)}catch(e){return!1}},u=Object.prototype.toString,p="function"==typeof Symbol&&!!Symbol.toStringTag,f=!(0 in[,]),h=function(){return!1};if("object"==typeof document){var d=document.all;u.call(d)===u.call(document.all)&&(h=function(e){if((f||!e)&&(void 0===e||"object"==typeof e))try{var t=u.call(e);return("[object HTMLAllCollection]"===t||"[object HTML document.all class]"===t||"[object HTMLCollection]"===t||"[object Object]"===t)&&null==e("")}catch(e){}return!1})}e.exports=s?function(e){if(h(e))return!0;if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;try{s(e,null,n)}catch(e){if(e!==i)return!1}return!l(e)&&c(e)}:function(e){if(h(e))return!0;if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;if(p)return c(e);if(l(e))return!1;var t=u.call(e);return!("[object Function]"!==t&&"[object GeneratorFunction]"!==t&&!/^\[object HTML/.test(t))&&c(e)}},function(e,t,r){"use strict";var n=r(197),i=r(381),o=n("RegExp.prototype.exec"),s=r(169);e.exports=function(e){if(!i(e))throw new s("`regex` must be a RegExp");return function(t){return null!==o(e,t)}}},function(e,t,r){"use strict";var n=r(245);e.exports=function(){return n()&&!!Symbol.toStringTag}},function(e,t,r){"use strict";e.exports=Number.isNaN||function(e){return e!=e}},function(e,t,r){"use strict";var n=r(218),i=r(387),o=r(197)("String.prototype.replace"),s=/^\s$/.test("᠎"),a=s?/^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/:/^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/,l=s?/[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/:/[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;e.exports=function(){var e=i(n(this));return o(o(e,a,""),l,"")}},function(e,t,r){"use strict";var n=r(256);e.exports=function(){return String.prototype.trim&&"​"==="​".trim()&&"᠎"==="᠎".trim()&&"_᠎"==="_᠎".trim()&&"᠎_"==="᠎_".trim()?String.prototype.trim:n}},function(e,t,r){"use strict"; +/*! https://mths.be/repeat v1.0.0 by @mathias */var n=r(250);e.exports=function(){return String.prototype.repeat||n}},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){"use strict";function n(e,t){return function(){return e.apply(t,arguments)}}r.d(t,"a",(function(){return n}))},function(e,t,r){"use strict";t.a=null},function(e,t,r){},,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";var n={name:"Loading"},i=(r(352),r(4)),o=Object(i.a)(n,(function(){this._self._c;return this._m(0)}),[function(){var e=this._self._c;return e("div",{staticClass:"vue-component loading-notice"},[e("span",{staticClass:"loading"},[this._v("Loading")])])}],!1,null,null,null);t.a=o.exports},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){const n=r(165),i=r(195),o=r(214);const s=["raster","vector","table","other"];function a(e,t){n.isObject(e)||(e={});for(let r in e)n.isObject(e[r].parameters)?e[r].parameters=o.migrateDiscoveryParameters(e[r].parameters,t):e[r].parameters={},Array.isArray(e[r].gis_data_types)?e[r].gis_data_types=e[r].gis_data_types.filter(e=>s.includes(e)):e[r].gis_data_types=[],void 0!==e[r].links&&(e[r].links=o.migrateLinks(e[r].links,t));return e}e.exports=class{static guessApiVersion(e){if(!n.isObject(e))return"0.0.0";if(i.validate(e.api_version))return e.api_version;if(i.validate(e.version))return e.version;if(Array.isArray(e.endpoints)){if(e.endpoints.find(e=>"/file_formats"===e.path||"/conformance"===e.path||"/files"===e.path))return"1.0.0";if(e.endpoints.find(e=>"/output_formats"===e.path||"/files/{user_id}"===e.path))return"0.4.2";if(!(e.backend_version||e.title||e.description||e.links))return"0.3.1"}return"0.0.0"}static convertCapabilitiesToLatestSpec(e,t=null,r=!0,s=!0,a="unknown",l="Unknown",c="0.0.0"){if(null===t&&(t=this.guessApiVersion(e)),"0.0.0"===t)return{};if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";let u=n.deepClone(e);return u.api_version=r?"1.0.0":t,n.isObject(u.billing)?u.billing=this.convertBillingToLatestSpec(u.billing,t):delete u.billing,u.endpoints=this.convertEndpointsToLatestSpec(u.endpoints,t,s),!r&&i.compare(t,"0.4.x","=")?u.stac_version="0.6.2":(r||"string"!=typeof u.stac_version)&&(u.stac_version="0.9.0"),"boolean"!=typeof u.production&&(u.production=!(!i.compare(t,"1.0.0-rc.1","=")&&!i.compare(t,"1.0.0-rc.2","="))),"string"!=typeof u.backend_version&&(u.backend_version=c),"string"!=typeof u.id&&(u.id=a),"string"!=typeof u.title&&(u.title=l),"string"!=typeof u.description&&(u.description=""),u.links=o.migrateLinks(u.links,t),u}static convertBillingToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return"string"!=typeof(e=n.isObject(e)?n.deepClone(e):{}).currency&&(e.currency=null),e}static convertEndpointsToLatestSpec(e,t,r=!1){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if(!Array.isArray(e))return[];if(e=n.deepClone(e),r){let r=i.compare(t,"0.4.x","="),n=i.compare(t,"1.0.0-rc.2","<"),s=function(e){let t="/process_graphs/{process_graph_id}",r=e.findIndex(e=>e.path===t);return r>=0?-1===e[r].methods.indexOf("PUT")&&e[r].methods.push("PUT"):e.push({path:t,methods:["PUT"]}),e};for(var o in e){let t=e[o];if(r)switch(t.path){case"/output_formats":t.path="/file_formats";break;case"/files/{user_id}":t.path="/files";break;case"/files/{user_id}/{path}":t.path="/files/{path}"}if(n)switch(t.path){case"/process_graphs":let r=t.methods.indexOf("POST");r>=0&&(t.methods.splice(r,1),s(e));break;case"/process_graphs/{process_graph_id}":let n=t.methods.indexOf("PATCH");n>=0&&(t.methods.splice(n,1),s(e))}}}return e}static convertOutputFormatsToLatestSpec(e,t){return this.convertFileFormatsToLatestSpec(e,t)}static convertFileFormatsToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return e=n.isObject(e)?n.deepClone(e):{},i.compare(t,"0.4.x","=")&&n.isObject(e)&&(e={output:e}),e.input=a(e.input,t),e.output=a(e.output,t),e}static convertServiceTypesToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if(!n.isObject(e))return{};e=n.deepClone(e);for(let r in e)n.isObject(e[r])||(e[r]={}),i.compare(t,"0.4.x","=")&&(delete e[r].attributes,n.isObject(e[r].parameters)&&(e[r].configuration=e[r].parameters),delete e[r].parameters,Array.isArray(e[r].variables)&&(e[r].process_parameters=e[r].variables.map(e=>{let t={name:e.variable_id,description:"string"==typeof e.description?e.description:"",schema:{type:["string"==typeof e.type?e.type:"string","null"]}};return void 0!==e.default&&(t.default=e.default),t})),delete e[r].variables),n.isObject(e[r].configuration)?e[r].configuration=o.migrateDiscoveryParameters(e[r].configuration,t):e[r].configuration={},Array.isArray(e[r].process_parameters)||(e[r].process_parameters=[]),void 0!==e[r].links&&(e[r].links=o.migrateLinks(e[r].links,t));return e}static convertUdfRuntimesToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if(!n.isObject(e))return{};e=n.deepClone(e);for(let r in e){if(i.compare(t,"0.4.x","=")){if(!n.isObject(e[r])){delete e[r];continue}null===e[r].description&&(e[r].description="")}"string"!=typeof e[r].type&&("string"==typeof e[r].docker?e[r].type="docker":e[r].type="language"),void 0!==e[r].links&&(e[r].links=o.migrateLinks(e[r].links,t))}return e}}},function(e,t,r){"use strict";e.exports=function e(t,r){if(t===r)return!0;if(t&&r&&"object"==typeof t&&"object"==typeof r){if(t.constructor!==r.constructor)return!1;var n,i,o;if(Array.isArray(t)){if((n=t.length)!=r.length)return!1;for(i=n;0!=i--;)if(!e(t[i],r[i]))return!1;return!0}if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(i of t.entries())if(!r.has(i[0]))return!1;for(i of t.entries())if(!e(i[1],r.get(i[0])))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(i of t.entries())if(!r.has(i[0]))return!1;return!0}if(ArrayBuffer.isView(t)&&ArrayBuffer.isView(r)){if((n=t.length)!=r.length)return!1;for(i=n;0!=i--;)if(t[i]!==r[i])return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if((n=(o=Object.keys(t)).length)!==Object.keys(r).length)return!1;for(i=n;0!=i--;)if(!Object.prototype.hasOwnProperty.call(r,o[i]))return!1;for(i=n;0!=i--;){var s=o[i];if(!e(t[s],r[s]))return!1}return!0}return t!=t&&r!=r}},function(e,t,r){var n,i,o;i=[],void 0===(o="function"==typeof(n=function(){var e=/^v?(?:\d+)(\.(?:[x*]|\d+)(\.(?:[x*]|\d+)(\.(?:[x*]|\d+))?(?:-[\da-z\-]+(?:\.[\da-z\-]+)*)?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i;function t(e){var t,r,n=e.replace(/^v/,"").replace(/\+.*$/,""),i=(r="-",-1===(t=n).indexOf(r)?t.length:t.indexOf(r)),o=n.substring(0,i).split(".");return o.push(n.substring(i+1)),o}function r(e){return isNaN(Number(e))?e:Number(e)}function n(t){if("string"!=typeof t)throw new TypeError("Invalid argument expected string");if(!e.test(t))throw new Error("Invalid argument not valid semver ('"+t+"' received)")}function i(e,i){[e,i].forEach(n);for(var o=t(e),s=t(i),a=0;ac)return 1;if(c>l)return-1}var u=o[o.length-1],p=s[s.length-1];if(u&&p){var f=u.split(".").map(r),h=p.split(".").map(r);for(a=0;ah[a])return 1;if(h[a]>f[a])return-1}}else if(u||p)return u?-1:1;return 0}var o=[">",">=","=","<","<="],s={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]};return i.validate=function(t){return"string"==typeof t&&e.test(t)},i.compare=function(e,t,r){!function(e){if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===o.indexOf(e))throw new TypeError("Invalid operator, expected one of "+o.join("|"))}(r);var n=i(e,t);return s[r].indexOf(n)>-1},i})?n.apply(t,i):n)||(e.exports=o)},function(e,t,r){const n=r(165),i=r(195),o=r(214),s={cube:"datacube",eo:"eo",label:"label",pc:"pointcloud",proj:"projection",sar:"sar",sat:"sat",sci:"scientific",view:"view"},a={"item:license":"license","item:providers":"providers","eo:instrument":"instruments","eo:platform":"platform","eo:constellation":"constellation","eo:epsg":"proj:epsg","eo:off_nadir":"view:off_nadir","eo:azimuth":"view:azimuth","eo:sun_azimuth":"view:sun_azimuth","eo:sun_elevation":"view:sun_elevation","dtr:start_datetime":"start_datetime","dtr:end_datetime":"end_datetime","pc:schema":"pc:schemas","sar:type":"sar:product_type","sar:polarization":"sar:polarizations","sar:instrument":"instruments","sar:platform":"platform","sar:constellation":"constellation","sar:off_nadir":"sat:off_nadir_angle","sar:relative_orbit":"sat:relative_orbit","sar:pass_direction":"sat:orbit_state"},l=["cube:dimensions","sci:publications","sci:doi","sci:citation"],c=["spatial","temporal","bands","other"];class u{static convertCollectionsToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return e=n.deepClone(e),Array.isArray(e.collections)?e.collections=e.collections.map(e=>u.convertCollectionToLatestSpec(e,t)).filter(e=>"string"==typeof e.id):e.collections=[],e.links=o.migrateLinks(e.links,t),e}static convertCollectionToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";let r=n.deepClone(e);if("string"!=typeof r.id||0===r.id.length)return{};if(i.validate(r.stac_version)&&!i.compare(r.stac_version,"0.9.0","<")||(r.stac_version="0.9.0"),n.isObject(r.extent)||(r.extent={}),i.compare(t,"0.4.x","=")){if(Array.isArray(r.extent.spatial)&&(r.extent.spatial={bbox:[r.extent.spatial]}),Array.isArray(r.extent.temporal)&&(r.extent.temporal={interval:[r.extent.temporal]}),n.isObject(r.properties)){n.isObject(r.other_properties)||(r.other_properties={});for(let e in r.properties)r.other_properties[e]={values:[r.properties[e]]}}delete r.properties;let e=n.isObject(r.other_properties)?r.other_properties:{};for(let t in e){let i=e[t];n.isObject(i)&&(Array.isArray(i.extent)||Array.isArray(i.values))?Array.isArray(i.extent)?e[t]={min:i.extent[0],max:i.extent[1]}:-1===i.values.findIndex(e=>!Array.isArray(e))?i.values.length<=1?e[t]=i.values[0]:e[t]=i.values.reduce((e,t)=>e.concat(t)):e[t]=i.values:(void 0===r[t]&&(r[t]=i),delete e[t])}delete r.other_properties,n.isObject(r.summaries)||(r.summaries={});for(let t in e){let n=e[t];"sar:pass_direction"===t&&(n=n.map(e=>null===e?"geostationary":e)),("sar:resolution"===t||"sar:pixel_spacing"===t||"sar:looks"===t)&&Array.isArray(n)&&n.length>=2?(r.summaries[t+"_range"]=n.slice(0,1),r.summaries[t+"_azimuth"]=n.slice(1,2),n.length>2&&(r.summaries[t+"_equivalent_number"]=n.slice(2,3))):"string"==typeof a[t]?r.summaries[a[t]]=n:l.includes(t)&&Array.isArray(n)&&1===n.length?r[t]=n[0]:r.summaries[t]=n}}if("string"!=typeof r.description&&(r.description=""),n.isObject(r.extent.spatial)||(r.extent.spatial={}),n.isObject(r.extent.temporal)||(r.extent.temporal={}),"string"!=typeof r.license&&(r.license="proprietary"),n.isObject(r.summaries)||(r.summaries={}),n.isObject(r["cube:dimensions"]))for(var u in r["cube:dimensions"])n.isObject(r["cube:dimensions"][u])&&!c.includes(r["cube:dimensions"][u].type)&&(r["cube:dimensions"][u].type="other");else r["cube:dimensions"]={};r.links=o.migrateLinks(r.links);var p=Array.isArray(r.stac_extensions)?r.stac_extensions:[];for(var f in r){let e=null,t=f.split(":",1);"deprecated"===f||"version"===f?e="version":"string"==typeof s[t]&&(e=s[t]),null===e||p.includes(e)||p.push(e)}return p.sort(),r.stac_extensions=p,r}}e.exports=u},function(e,t,r){const n=r(165),i=r(195),o=r(214);class s{static convertProcessesToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";return e=n.deepClone(e),Array.isArray(e.processes)?e.processes=e.processes.map(e=>s.convertProcessToLatestSpec(e,t)).filter(e=>"string"==typeof e.id):e.processes=[],e.links=o.migrateLinks(e.links,t),e}static convertProcessToLatestSpec(e,t){if(i.compare(t,"0.3.x","<="))throw"Migrating from API version 0.3.0 and older is not supported.";if("string"!=typeof(e=n.deepClone(e)).id||0===e.id.length)return{};if(i.compare(t,"0.4.x","=")){if(!Array.isArray(e.parameter_order)||0===e.parameter_order.length){e.parameter_order=[];for(let t in e.parameters)e.parameter_order.push(t)}let t=[];for(let r of e.parameter_order){let i={name:r};n.isObject(e.parameters[r])&&Object.assign(i,e.parameters[r]),i.required||(i.optional=!0),delete i.required,t.push(i)}delete e.parameter_order,e.parameters=t}if("string"!=typeof e.description&&(e.description=""),Array.isArray(e.parameters))for(var r=e.parameters.length-1;r>=0;r--){let i=e.parameters[r];n.isObject(i)?("string"!=typeof i.description&&(i.description=""),e.parameters[r]=a(i,t)):e.parameters.splice(r,1)}else e.parameters=[];return n.isObject(e.returns)||(e.returns={}),e.returns=a(e.returns,t,!1),Array.isArray(e.examples)&&(e.examples=e.examples.filter(e=>n.isObject(e)&&n.isObject(e.arguments))),void 0!==e.links&&(e.links=o.migrateLinks(e.links,t)),e}}function a(e,t,r=!0){var n={};if(e.schema&&"object"==typeof e.schema&&(n=e.schema),i.compare(t,"0.4.x","=")){for(let t of["anyOf","oneOf"])if(Array.isArray(n[t])){r&&void 0!==n.default&&(e.default=n.default),n=n[t];break}let o=i.compare(t,"0.4.x")<=0&&void 0!==e.media_type,s=Array.isArray(n)?n:[n];for(let t of s)t=l(t),r&&void 0!==t.default&&(e.default=t.default,delete t.default),o&&(t.contentMediaType=e.media_type);o&&delete e.media_type}return i.compare(t,"0.4.x",">")&&void 0!==e.default&&(e.optional=!0),e.schema=n,e}function l(e){if(n.isObject(e)&&void 0!==e.type&&"string"==typeof e.format){switch(e.format){case"url":e.format="uri";break;case"proj-definition":e.deprecated=!0;break;case"callback":if(e.format="process-graph",n.isObject(e.parameters)){let t=[];for(let r in e.parameters){let n=e.parameters[r],i={name:r,description:"string"==typeof n.description?n.description:"",schema:n};t.push(i)}e.parameters=t}}e.subtype=e.format,["date-time","time","date","uri"].includes(e.format)||delete e.format}for(let t in e)e[t]&&"object"==typeof e[t]&&(e[t]=l(e[t]));return e}e.exports=s},function(e,t,r){const n=r(236);e.exports=class extends n{constructor(e){super(e.schema,e.default),Object.assign(this,e)}}},function(e,t,r){"use strict";r(238)},function(e,t,r){"use strict";var n={};function i(e,t,r){var o,s,a,l,c,u="";for("string"!=typeof t&&(r=t,t=i.defaultChars),void 0===r&&(r=!0),c=function(e){var t,r,i=n[e];if(i)return i;for(i=n[e]=[],t=0;t<128;t++)r=String.fromCharCode(t),/^[0-9a-z]$/i.test(r)?i.push(r):i.push("%"+("0"+t.toString(16).toUpperCase()).slice(-2));for(t=0;t=55296&&a<=57343){if(a>=55296&&a<=56319&&o+1=56320&&l<=57343){u+=encodeURIComponent(e[o]+e[o+1]),o++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[o]);return u}i.defaultChars=";/?:@&=+$,-_.!~*'()#",i.componentChars="-_.!~*'()",e.exports=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array([14866,60,237,340,721,1312,1562,1654,1838,1957,2183,2239,2301,2958,3037,3893,4123,4298,4330,4801,5191,5395,5752,5903,5943,5972,6050,0,0,0,0,0,0,6135,6565,7422,8183,8738,9242,9503,9938,10189,10573,10637,10715,11950,12246,13539,13950,14445,14533,15364,16514,16980,17390,17763,17849,18036,18125,4096,69,77,97,98,99,102,103,108,109,110,111,112,114,115,116,117,92,100,106,115,122,137,142,151,157,163,167,182,196,204,220,229,108,105,103,33024,198,59,32768,198,80,33024,38,59,32768,38,99,117,116,101,33024,193,59,32768,193,114,101,118,101,59,32768,258,512,105,121,127,134,114,99,33024,194,59,32768,194,59,32768,1040,114,59,32896,55349,56580,114,97,118,101,33024,192,59,32768,192,112,104,97,59,32768,913,97,99,114,59,32768,256,100,59,32768,10835,512,103,112,172,177,111,110,59,32768,260,102,59,32896,55349,56632,112,108,121,70,117,110,99,116,105,111,110,59,32768,8289,105,110,103,33024,197,59,32768,197,512,99,115,209,214,114,59,32896,55349,56476,105,103,110,59,32768,8788,105,108,100,101,33024,195,59,32768,195,109,108,33024,196,59,32768,196,2048,97,99,101,102,111,114,115,117,253,278,282,310,315,321,327,332,512,99,114,258,267,107,115,108,97,115,104,59,32768,8726,583,271,274,59,32768,10983,101,100,59,32768,8966,121,59,32768,1041,768,99,114,116,289,296,306,97,117,115,101,59,32768,8757,110,111,117,108,108,105,115,59,32768,8492,97,59,32768,914,114,59,32896,55349,56581,112,102,59,32896,55349,56633,101,118,101,59,32768,728,99,114,59,32768,8492,109,112,101,113,59,32768,8782,3584,72,79,97,99,100,101,102,104,105,108,111,114,115,117,368,373,380,426,461,466,487,491,495,533,593,695,701,707,99,121,59,32768,1063,80,89,33024,169,59,32768,169,768,99,112,121,387,393,419,117,116,101,59,32768,262,512,59,105,398,400,32768,8914,116,97,108,68,105,102,102,101,114,101,110,116,105,97,108,68,59,32768,8517,108,101,121,115,59,32768,8493,1024,97,101,105,111,435,441,449,454,114,111,110,59,32768,268,100,105,108,33024,199,59,32768,199,114,99,59,32768,264,110,105,110,116,59,32768,8752,111,116,59,32768,266,512,100,110,471,478,105,108,108,97,59,32768,184,116,101,114,68,111,116,59,32768,183,114,59,32768,8493,105,59,32768,935,114,99,108,101,1024,68,77,80,84,508,513,520,526,111,116,59,32768,8857,105,110,117,115,59,32768,8854,108,117,115,59,32768,8853,105,109,101,115,59,32768,8855,111,512,99,115,539,562,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,32768,8754,101,67,117,114,108,121,512,68,81,573,586,111,117,98,108,101,81,117,111,116,101,59,32768,8221,117,111,116,101,59,32768,8217,1024,108,110,112,117,602,614,648,664,111,110,512,59,101,609,611,32768,8759,59,32768,10868,768,103,105,116,621,629,634,114,117,101,110,116,59,32768,8801,110,116,59,32768,8751,111,117,114,73,110,116,101,103,114,97,108,59,32768,8750,512,102,114,653,656,59,32768,8450,111,100,117,99,116,59,32768,8720,110,116,101,114,67,108,111,99,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,32768,8755,111,115,115,59,32768,10799,99,114,59,32896,55349,56478,112,512,59,67,713,715,32768,8915,97,112,59,32768,8781,2816,68,74,83,90,97,99,101,102,105,111,115,743,758,763,768,773,795,809,821,826,910,1295,512,59,111,748,750,32768,8517,116,114,97,104,100,59,32768,10513,99,121,59,32768,1026,99,121,59,32768,1029,99,121,59,32768,1039,768,103,114,115,780,786,790,103,101,114,59,32768,8225,114,59,32768,8609,104,118,59,32768,10980,512,97,121,800,806,114,111,110,59,32768,270,59,32768,1044,108,512,59,116,815,817,32768,8711,97,59,32768,916,114,59,32896,55349,56583,512,97,102,831,897,512,99,109,836,891,114,105,116,105,99,97,108,1024,65,68,71,84,852,859,877,884,99,117,116,101,59,32768,180,111,581,864,867,59,32768,729,98,108,101,65,99,117,116,101,59,32768,733,114,97,118,101,59,32768,96,105,108,100,101,59,32768,732,111,110,100,59,32768,8900,102,101,114,101,110,116,105,97,108,68,59,32768,8518,2113,920,0,0,0,925,946,0,1139,102,59,32896,55349,56635,768,59,68,69,931,933,938,32768,168,111,116,59,32768,8412,113,117,97,108,59,32768,8784,98,108,101,1536,67,68,76,82,85,86,961,978,996,1080,1101,1125,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,32768,8751,111,1093,985,0,0,988,59,32768,168,110,65,114,114,111,119,59,32768,8659,512,101,111,1001,1034,102,116,768,65,82,84,1010,1017,1029,114,114,111,119,59,32768,8656,105,103,104,116,65,114,114,111,119,59,32768,8660,101,101,59,32768,10980,110,103,512,76,82,1041,1068,101,102,116,512,65,82,1049,1056,114,114,111,119,59,32768,10232,105,103,104,116,65,114,114,111,119,59,32768,10234,105,103,104,116,65,114,114,111,119,59,32768,10233,105,103,104,116,512,65,84,1089,1096,114,114,111,119,59,32768,8658,101,101,59,32768,8872,112,1042,1108,0,0,1115,114,114,111,119,59,32768,8657,111,119,110,65,114,114,111,119,59,32768,8661,101,114,116,105,99,97,108,66,97,114,59,32768,8741,110,1536,65,66,76,82,84,97,1152,1179,1186,1236,1272,1288,114,114,111,119,768,59,66,85,1163,1165,1170,32768,8595,97,114,59,32768,10515,112,65,114,114,111,119,59,32768,8693,114,101,118,101,59,32768,785,101,102,116,1315,1196,0,1209,0,1220,105,103,104,116,86,101,99,116,111,114,59,32768,10576,101,101,86,101,99,116,111,114,59,32768,10590,101,99,116,111,114,512,59,66,1229,1231,32768,8637,97,114,59,32768,10582,105,103,104,116,805,1245,0,1256,101,101,86,101,99,116,111,114,59,32768,10591,101,99,116,111,114,512,59,66,1265,1267,32768,8641,97,114,59,32768,10583,101,101,512,59,65,1279,1281,32768,8868,114,114,111,119,59,32768,8615,114,114,111,119,59,32768,8659,512,99,116,1300,1305,114,59,32896,55349,56479,114,111,107,59,32768,272,4096,78,84,97,99,100,102,103,108,109,111,112,113,115,116,117,120,1344,1348,1354,1363,1386,1391,1396,1405,1413,1460,1475,1483,1514,1527,1531,1538,71,59,32768,330,72,33024,208,59,32768,208,99,117,116,101,33024,201,59,32768,201,768,97,105,121,1370,1376,1383,114,111,110,59,32768,282,114,99,33024,202,59,32768,202,59,32768,1069,111,116,59,32768,278,114,59,32896,55349,56584,114,97,118,101,33024,200,59,32768,200,101,109,101,110,116,59,32768,8712,512,97,112,1418,1423,99,114,59,32768,274,116,121,1060,1431,0,0,1444,109,97,108,108,83,113,117,97,114,101,59,32768,9723,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,32768,9643,512,103,112,1465,1470,111,110,59,32768,280,102,59,32896,55349,56636,115,105,108,111,110,59,32768,917,117,512,97,105,1489,1504,108,512,59,84,1495,1497,32768,10869,105,108,100,101,59,32768,8770,108,105,98,114,105,117,109,59,32768,8652,512,99,105,1519,1523,114,59,32768,8496,109,59,32768,10867,97,59,32768,919,109,108,33024,203,59,32768,203,512,105,112,1543,1549,115,116,115,59,32768,8707,111,110,101,110,116,105,97,108,69,59,32768,8519,1280,99,102,105,111,115,1572,1576,1581,1620,1648,121,59,32768,1060,114,59,32896,55349,56585,108,108,101,100,1060,1591,0,0,1604,109,97,108,108,83,113,117,97,114,101,59,32768,9724,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,32768,9642,1601,1628,0,1633,0,0,1639,102,59,32896,55349,56637,65,108,108,59,32768,8704,114,105,101,114,116,114,102,59,32768,8497,99,114,59,32768,8497,3072,74,84,97,98,99,100,102,103,111,114,115,116,1678,1683,1688,1701,1708,1729,1734,1739,1742,1748,1828,1834,99,121,59,32768,1027,33024,62,59,32768,62,109,109,97,512,59,100,1696,1698,32768,915,59,32768,988,114,101,118,101,59,32768,286,768,101,105,121,1715,1721,1726,100,105,108,59,32768,290,114,99,59,32768,284,59,32768,1043,111,116,59,32768,288,114,59,32896,55349,56586,59,32768,8921,112,102,59,32896,55349,56638,101,97,116,101,114,1536,69,70,71,76,83,84,1766,1783,1794,1803,1809,1821,113,117,97,108,512,59,76,1775,1777,32768,8805,101,115,115,59,32768,8923,117,108,108,69,113,117,97,108,59,32768,8807,114,101,97,116,101,114,59,32768,10914,101,115,115,59,32768,8823,108,97,110,116,69,113,117,97,108,59,32768,10878,105,108,100,101,59,32768,8819,99,114,59,32896,55349,56482,59,32768,8811,2048,65,97,99,102,105,111,115,117,1854,1861,1874,1880,1884,1897,1919,1934,82,68,99,121,59,32768,1066,512,99,116,1866,1871,101,107,59,32768,711,59,32768,94,105,114,99,59,32768,292,114,59,32768,8460,108,98,101,114,116,83,112,97,99,101,59,32768,8459,833,1902,0,1906,102,59,32768,8461,105,122,111,110,116,97,108,76,105,110,101,59,32768,9472,512,99,116,1924,1928,114,59,32768,8459,114,111,107,59,32768,294,109,112,533,1940,1950,111,119,110,72,117,109,112,59,32768,8782,113,117,97,108,59,32768,8783,3584,69,74,79,97,99,100,102,103,109,110,111,115,116,117,1985,1990,1996,2001,2010,2025,2030,2034,2043,2077,2134,2155,2160,2167,99,121,59,32768,1045,108,105,103,59,32768,306,99,121,59,32768,1025,99,117,116,101,33024,205,59,32768,205,512,105,121,2015,2022,114,99,33024,206,59,32768,206,59,32768,1048,111,116,59,32768,304,114,59,32768,8465,114,97,118,101,33024,204,59,32768,204,768,59,97,112,2050,2052,2070,32768,8465,512,99,103,2057,2061,114,59,32768,298,105,110,97,114,121,73,59,32768,8520,108,105,101,115,59,32768,8658,837,2082,0,2110,512,59,101,2086,2088,32768,8748,512,103,114,2093,2099,114,97,108,59,32768,8747,115,101,99,116,105,111,110,59,32768,8898,105,115,105,98,108,101,512,67,84,2120,2127,111,109,109,97,59,32768,8291,105,109,101,115,59,32768,8290,768,103,112,116,2141,2146,2151,111,110,59,32768,302,102,59,32896,55349,56640,97,59,32768,921,99,114,59,32768,8464,105,108,100,101,59,32768,296,828,2172,0,2177,99,121,59,32768,1030,108,33024,207,59,32768,207,1280,99,102,111,115,117,2193,2206,2211,2217,2232,512,105,121,2198,2203,114,99,59,32768,308,59,32768,1049,114,59,32896,55349,56589,112,102,59,32896,55349,56641,820,2222,0,2227,114,59,32896,55349,56485,114,99,121,59,32768,1032,107,99,121,59,32768,1028,1792,72,74,97,99,102,111,115,2253,2258,2263,2269,2283,2288,2294,99,121,59,32768,1061,99,121,59,32768,1036,112,112,97,59,32768,922,512,101,121,2274,2280,100,105,108,59,32768,310,59,32768,1050,114,59,32896,55349,56590,112,102,59,32896,55349,56642,99,114,59,32896,55349,56486,2816,74,84,97,99,101,102,108,109,111,115,116,2323,2328,2333,2374,2396,2775,2780,2797,2804,2934,2954,99,121,59,32768,1033,33024,60,59,32768,60,1280,99,109,110,112,114,2344,2350,2356,2360,2370,117,116,101,59,32768,313,98,100,97,59,32768,923,103,59,32768,10218,108,97,99,101,116,114,102,59,32768,8466,114,59,32768,8606,768,97,101,121,2381,2387,2393,114,111,110,59,32768,317,100,105,108,59,32768,315,59,32768,1051,512,102,115,2401,2702,116,2560,65,67,68,70,82,84,85,86,97,114,2423,2470,2479,2530,2537,2561,2618,2666,2683,2690,512,110,114,2428,2441,103,108,101,66,114,97,99,107,101,116,59,32768,10216,114,111,119,768,59,66,82,2451,2453,2458,32768,8592,97,114,59,32768,8676,105,103,104,116,65,114,114,111,119,59,32768,8646,101,105,108,105,110,103,59,32768,8968,111,838,2485,0,2498,98,108,101,66,114,97,99,107,101,116,59,32768,10214,110,805,2503,0,2514,101,101,86,101,99,116,111,114,59,32768,10593,101,99,116,111,114,512,59,66,2523,2525,32768,8643,97,114,59,32768,10585,108,111,111,114,59,32768,8970,105,103,104,116,512,65,86,2546,2553,114,114,111,119,59,32768,8596,101,99,116,111,114,59,32768,10574,512,101,114,2566,2591,101,768,59,65,86,2574,2576,2583,32768,8867,114,114,111,119,59,32768,8612,101,99,116,111,114,59,32768,10586,105,97,110,103,108,101,768,59,66,69,2604,2606,2611,32768,8882,97,114,59,32768,10703,113,117,97,108,59,32768,8884,112,768,68,84,86,2626,2638,2649,111,119,110,86,101,99,116,111,114,59,32768,10577,101,101,86,101,99,116,111,114,59,32768,10592,101,99,116,111,114,512,59,66,2659,2661,32768,8639,97,114,59,32768,10584,101,99,116,111,114,512,59,66,2676,2678,32768,8636,97,114,59,32768,10578,114,114,111,119,59,32768,8656,105,103,104,116,97,114,114,111,119,59,32768,8660,115,1536,69,70,71,76,83,84,2716,2730,2741,2750,2756,2768,113,117,97,108,71,114,101,97,116,101,114,59,32768,8922,117,108,108,69,113,117,97,108,59,32768,8806,114,101,97,116,101,114,59,32768,8822,101,115,115,59,32768,10913,108,97,110,116,69,113,117,97,108,59,32768,10877,105,108,100,101,59,32768,8818,114,59,32896,55349,56591,512,59,101,2785,2787,32768,8920,102,116,97,114,114,111,119,59,32768,8666,105,100,111,116,59,32768,319,768,110,112,119,2811,2899,2904,103,1024,76,82,108,114,2821,2848,2860,2887,101,102,116,512,65,82,2829,2836,114,114,111,119,59,32768,10229,105,103,104,116,65,114,114,111,119,59,32768,10231,105,103,104,116,65,114,114,111,119,59,32768,10230,101,102,116,512,97,114,2868,2875,114,114,111,119,59,32768,10232,105,103,104,116,97,114,114,111,119,59,32768,10234,105,103,104,116,97,114,114,111,119,59,32768,10233,102,59,32896,55349,56643,101,114,512,76,82,2911,2922,101,102,116,65,114,114,111,119,59,32768,8601,105,103,104,116,65,114,114,111,119,59,32768,8600,768,99,104,116,2941,2945,2948,114,59,32768,8466,59,32768,8624,114,111,107,59,32768,321,59,32768,8810,2048,97,99,101,102,105,111,115,117,2974,2978,2982,3007,3012,3022,3028,3033,112,59,32768,10501,121,59,32768,1052,512,100,108,2987,2998,105,117,109,83,112,97,99,101,59,32768,8287,108,105,110,116,114,102,59,32768,8499,114,59,32896,55349,56592,110,117,115,80,108,117,115,59,32768,8723,112,102,59,32896,55349,56644,99,114,59,32768,8499,59,32768,924,2304,74,97,99,101,102,111,115,116,117,3055,3060,3067,3089,3201,3206,3874,3880,3889,99,121,59,32768,1034,99,117,116,101,59,32768,323,768,97,101,121,3074,3080,3086,114,111,110,59,32768,327,100,105,108,59,32768,325,59,32768,1053,768,103,115,119,3096,3160,3194,97,116,105,118,101,768,77,84,86,3108,3121,3145,101,100,105,117,109,83,112,97,99,101,59,32768,8203,104,105,512,99,110,3128,3137,107,83,112,97,99,101,59,32768,8203,83,112,97,99,101,59,32768,8203,101,114,121,84,104,105,110,83,112,97,99,101,59,32768,8203,116,101,100,512,71,76,3168,3184,114,101,97,116,101,114,71,114,101,97,116,101,114,59,32768,8811,101,115,115,76,101,115,115,59,32768,8810,76,105,110,101,59,32768,10,114,59,32896,55349,56593,1024,66,110,112,116,3215,3222,3238,3242,114,101,97,107,59,32768,8288,66,114,101,97,107,105,110,103,83,112,97,99,101,59,32768,160,102,59,32768,8469,3328,59,67,68,69,71,72,76,78,80,82,83,84,86,3269,3271,3293,3312,3352,3430,3455,3551,3589,3625,3678,3821,3861,32768,10988,512,111,117,3276,3286,110,103,114,117,101,110,116,59,32768,8802,112,67,97,112,59,32768,8813,111,117,98,108,101,86,101,114,116,105,99,97,108,66,97,114,59,32768,8742,768,108,113,120,3319,3327,3345,101,109,101,110,116,59,32768,8713,117,97,108,512,59,84,3335,3337,32768,8800,105,108,100,101,59,32896,8770,824,105,115,116,115,59,32768,8708,114,101,97,116,101,114,1792,59,69,70,71,76,83,84,3373,3375,3382,3394,3404,3410,3423,32768,8815,113,117,97,108,59,32768,8817,117,108,108,69,113,117,97,108,59,32896,8807,824,114,101,97,116,101,114,59,32896,8811,824,101,115,115,59,32768,8825,108,97,110,116,69,113,117,97,108,59,32896,10878,824,105,108,100,101,59,32768,8821,117,109,112,533,3437,3448,111,119,110,72,117,109,112,59,32896,8782,824,113,117,97,108,59,32896,8783,824,101,512,102,115,3461,3492,116,84,114,105,97,110,103,108,101,768,59,66,69,3477,3479,3485,32768,8938,97,114,59,32896,10703,824,113,117,97,108,59,32768,8940,115,1536,59,69,71,76,83,84,3506,3508,3515,3524,3531,3544,32768,8814,113,117,97,108,59,32768,8816,114,101,97,116,101,114,59,32768,8824,101,115,115,59,32896,8810,824,108,97,110,116,69,113,117,97,108,59,32896,10877,824,105,108,100,101,59,32768,8820,101,115,116,101,100,512,71,76,3561,3578,114,101,97,116,101,114,71,114,101,97,116,101,114,59,32896,10914,824,101,115,115,76,101,115,115,59,32896,10913,824,114,101,99,101,100,101,115,768,59,69,83,3603,3605,3613,32768,8832,113,117,97,108,59,32896,10927,824,108,97,110,116,69,113,117,97,108,59,32768,8928,512,101,105,3630,3645,118,101,114,115,101,69,108,101,109,101,110,116,59,32768,8716,103,104,116,84,114,105,97,110,103,108,101,768,59,66,69,3663,3665,3671,32768,8939,97,114,59,32896,10704,824,113,117,97,108,59,32768,8941,512,113,117,3683,3732,117,97,114,101,83,117,512,98,112,3694,3712,115,101,116,512,59,69,3702,3705,32896,8847,824,113,117,97,108,59,32768,8930,101,114,115,101,116,512,59,69,3722,3725,32896,8848,824,113,117,97,108,59,32768,8931,768,98,99,112,3739,3757,3801,115,101,116,512,59,69,3747,3750,32896,8834,8402,113,117,97,108,59,32768,8840,99,101,101,100,115,1024,59,69,83,84,3771,3773,3781,3793,32768,8833,113,117,97,108,59,32896,10928,824,108,97,110,116,69,113,117,97,108,59,32768,8929,105,108,100,101,59,32896,8831,824,101,114,115,101,116,512,59,69,3811,3814,32896,8835,8402,113,117,97,108,59,32768,8841,105,108,100,101,1024,59,69,70,84,3834,3836,3843,3854,32768,8769,113,117,97,108,59,32768,8772,117,108,108,69,113,117,97,108,59,32768,8775,105,108,100,101,59,32768,8777,101,114,116,105,99,97,108,66,97,114,59,32768,8740,99,114,59,32896,55349,56489,105,108,100,101,33024,209,59,32768,209,59,32768,925,3584,69,97,99,100,102,103,109,111,112,114,115,116,117,118,3921,3927,3936,3951,3958,3963,3972,3996,4002,4034,4037,4055,4071,4078,108,105,103,59,32768,338,99,117,116,101,33024,211,59,32768,211,512,105,121,3941,3948,114,99,33024,212,59,32768,212,59,32768,1054,98,108,97,99,59,32768,336,114,59,32896,55349,56594,114,97,118,101,33024,210,59,32768,210,768,97,101,105,3979,3984,3989,99,114,59,32768,332,103,97,59,32768,937,99,114,111,110,59,32768,927,112,102,59,32896,55349,56646,101,110,67,117,114,108,121,512,68,81,4014,4027,111,117,98,108,101,81,117,111,116,101,59,32768,8220,117,111,116,101,59,32768,8216,59,32768,10836,512,99,108,4042,4047,114,59,32896,55349,56490,97,115,104,33024,216,59,32768,216,105,573,4060,4067,100,101,33024,213,59,32768,213,101,115,59,32768,10807,109,108,33024,214,59,32768,214,101,114,512,66,80,4085,4109,512,97,114,4090,4094,114,59,32768,8254,97,99,512,101,107,4101,4104,59,32768,9182,101,116,59,32768,9140,97,114,101,110,116,104,101,115,105,115,59,32768,9180,2304,97,99,102,104,105,108,111,114,115,4141,4150,4154,4159,4163,4166,4176,4198,4284,114,116,105,97,108,68,59,32768,8706,121,59,32768,1055,114,59,32896,55349,56595,105,59,32768,934,59,32768,928,117,115,77,105,110,117,115,59,32768,177,512,105,112,4181,4194,110,99,97,114,101,112,108,97,110,101,59,32768,8460,102,59,32768,8473,1024,59,101,105,111,4207,4209,4251,4256,32768,10939,99,101,100,101,115,1024,59,69,83,84,4223,4225,4232,4244,32768,8826,113,117,97,108,59,32768,10927,108,97,110,116,69,113,117,97,108,59,32768,8828,105,108,100,101,59,32768,8830,109,101,59,32768,8243,512,100,112,4261,4267,117,99,116,59,32768,8719,111,114,116,105,111,110,512,59,97,4278,4280,32768,8759,108,59,32768,8733,512,99,105,4289,4294,114,59,32896,55349,56491,59,32768,936,1024,85,102,111,115,4306,4313,4318,4323,79,84,33024,34,59,32768,34,114,59,32896,55349,56596,112,102,59,32768,8474,99,114,59,32896,55349,56492,3072,66,69,97,99,101,102,104,105,111,114,115,117,4354,4360,4366,4395,4417,4473,4477,4481,4743,4764,4776,4788,97,114,114,59,32768,10512,71,33024,174,59,32768,174,768,99,110,114,4373,4379,4383,117,116,101,59,32768,340,103,59,32768,10219,114,512,59,116,4389,4391,32768,8608,108,59,32768,10518,768,97,101,121,4402,4408,4414,114,111,110,59,32768,344,100,105,108,59,32768,342,59,32768,1056,512,59,118,4422,4424,32768,8476,101,114,115,101,512,69,85,4433,4458,512,108,113,4438,4446,101,109,101,110,116,59,32768,8715,117,105,108,105,98,114,105,117,109,59,32768,8651,112,69,113,117,105,108,105,98,114,105,117,109,59,32768,10607,114,59,32768,8476,111,59,32768,929,103,104,116,2048,65,67,68,70,84,85,86,97,4501,4547,4556,4607,4614,4671,4719,4736,512,110,114,4506,4519,103,108,101,66,114,97,99,107,101,116,59,32768,10217,114,111,119,768,59,66,76,4529,4531,4536,32768,8594,97,114,59,32768,8677,101,102,116,65,114,114,111,119,59,32768,8644,101,105,108,105,110,103,59,32768,8969,111,838,4562,0,4575,98,108,101,66,114,97,99,107,101,116,59,32768,10215,110,805,4580,0,4591,101,101,86,101,99,116,111,114,59,32768,10589,101,99,116,111,114,512,59,66,4600,4602,32768,8642,97,114,59,32768,10581,108,111,111,114,59,32768,8971,512,101,114,4619,4644,101,768,59,65,86,4627,4629,4636,32768,8866,114,114,111,119,59,32768,8614,101,99,116,111,114,59,32768,10587,105,97,110,103,108,101,768,59,66,69,4657,4659,4664,32768,8883,97,114,59,32768,10704,113,117,97,108,59,32768,8885,112,768,68,84,86,4679,4691,4702,111,119,110,86,101,99,116,111,114,59,32768,10575,101,101,86,101,99,116,111,114,59,32768,10588,101,99,116,111,114,512,59,66,4712,4714,32768,8638,97,114,59,32768,10580,101,99,116,111,114,512,59,66,4729,4731,32768,8640,97,114,59,32768,10579,114,114,111,119,59,32768,8658,512,112,117,4748,4752,102,59,32768,8477,110,100,73,109,112,108,105,101,115,59,32768,10608,105,103,104,116,97,114,114,111,119,59,32768,8667,512,99,104,4781,4785,114,59,32768,8475,59,32768,8625,108,101,68,101,108,97,121,101,100,59,32768,10740,3328,72,79,97,99,102,104,105,109,111,113,115,116,117,4827,4842,4849,4856,4889,4894,4949,4955,4967,4973,5059,5065,5070,512,67,99,4832,4838,72,99,121,59,32768,1065,121,59,32768,1064,70,84,99,121,59,32768,1068,99,117,116,101,59,32768,346,1280,59,97,101,105,121,4867,4869,4875,4881,4886,32768,10940,114,111,110,59,32768,352,100,105,108,59,32768,350,114,99,59,32768,348,59,32768,1057,114,59,32896,55349,56598,111,114,116,1024,68,76,82,85,4906,4917,4928,4940,111,119,110,65,114,114,111,119,59,32768,8595,101,102,116,65,114,114,111,119,59,32768,8592,105,103,104,116,65,114,114,111,119,59,32768,8594,112,65,114,114,111,119,59,32768,8593,103,109,97,59,32768,931,97,108,108,67,105,114,99,108,101,59,32768,8728,112,102,59,32896,55349,56650,1091,4979,0,0,4983,116,59,32768,8730,97,114,101,1024,59,73,83,85,4994,4996,5010,5052,32768,9633,110,116,101,114,115,101,99,116,105,111,110,59,32768,8851,117,512,98,112,5016,5033,115,101,116,512,59,69,5024,5026,32768,8847,113,117,97,108,59,32768,8849,101,114,115,101,116,512,59,69,5043,5045,32768,8848,113,117,97,108,59,32768,8850,110,105,111,110,59,32768,8852,99,114,59,32896,55349,56494,97,114,59,32768,8902,1024,98,99,109,112,5079,5102,5155,5158,512,59,115,5084,5086,32768,8912,101,116,512,59,69,5093,5095,32768,8912,113,117,97,108,59,32768,8838,512,99,104,5107,5148,101,101,100,115,1024,59,69,83,84,5120,5122,5129,5141,32768,8827,113,117,97,108,59,32768,10928,108,97,110,116,69,113,117,97,108,59,32768,8829,105,108,100,101,59,32768,8831,84,104,97,116,59,32768,8715,59,32768,8721,768,59,101,115,5165,5167,5185,32768,8913,114,115,101,116,512,59,69,5176,5178,32768,8835,113,117,97,108,59,32768,8839,101,116,59,32768,8913,2816,72,82,83,97,99,102,104,105,111,114,115,5213,5221,5227,5241,5252,5274,5279,5323,5362,5368,5378,79,82,78,33024,222,59,32768,222,65,68,69,59,32768,8482,512,72,99,5232,5237,99,121,59,32768,1035,121,59,32768,1062,512,98,117,5246,5249,59,32768,9,59,32768,932,768,97,101,121,5259,5265,5271,114,111,110,59,32768,356,100,105,108,59,32768,354,59,32768,1058,114,59,32896,55349,56599,512,101,105,5284,5300,835,5289,0,5297,101,102,111,114,101,59,32768,8756,97,59,32768,920,512,99,110,5305,5315,107,83,112,97,99,101,59,32896,8287,8202,83,112,97,99,101,59,32768,8201,108,100,101,1024,59,69,70,84,5335,5337,5344,5355,32768,8764,113,117,97,108,59,32768,8771,117,108,108,69,113,117,97,108,59,32768,8773,105,108,100,101,59,32768,8776,112,102,59,32896,55349,56651,105,112,108,101,68,111,116,59,32768,8411,512,99,116,5383,5388,114,59,32896,55349,56495,114,111,107,59,32768,358,5426,5417,5444,5458,5473,0,5480,5485,0,0,0,0,0,5494,5500,5564,5579,0,5726,5732,5738,5745,512,99,114,5421,5429,117,116,101,33024,218,59,32768,218,114,512,59,111,5435,5437,32768,8607,99,105,114,59,32768,10569,114,820,5449,0,5453,121,59,32768,1038,118,101,59,32768,364,512,105,121,5462,5469,114,99,33024,219,59,32768,219,59,32768,1059,98,108,97,99,59,32768,368,114,59,32896,55349,56600,114,97,118,101,33024,217,59,32768,217,97,99,114,59,32768,362,512,100,105,5504,5548,101,114,512,66,80,5511,5535,512,97,114,5516,5520,114,59,32768,95,97,99,512,101,107,5527,5530,59,32768,9183,101,116,59,32768,9141,97,114,101,110,116,104,101,115,105,115,59,32768,9181,111,110,512,59,80,5555,5557,32768,8899,108,117,115,59,32768,8846,512,103,112,5568,5573,111,110,59,32768,370,102,59,32896,55349,56652,2048,65,68,69,84,97,100,112,115,5595,5624,5635,5648,5664,5671,5682,5712,114,114,111,119,768,59,66,68,5606,5608,5613,32768,8593,97,114,59,32768,10514,111,119,110,65,114,114,111,119,59,32768,8645,111,119,110,65,114,114,111,119,59,32768,8597,113,117,105,108,105,98,114,105,117,109,59,32768,10606,101,101,512,59,65,5655,5657,32768,8869,114,114,111,119,59,32768,8613,114,114,111,119,59,32768,8657,111,119,110,97,114,114,111,119,59,32768,8661,101,114,512,76,82,5689,5700,101,102,116,65,114,114,111,119,59,32768,8598,105,103,104,116,65,114,114,111,119,59,32768,8599,105,512,59,108,5718,5720,32768,978,111,110,59,32768,933,105,110,103,59,32768,366,99,114,59,32896,55349,56496,105,108,100,101,59,32768,360,109,108,33024,220,59,32768,220,2304,68,98,99,100,101,102,111,115,118,5770,5776,5781,5785,5798,5878,5883,5889,5895,97,115,104,59,32768,8875,97,114,59,32768,10987,121,59,32768,1042,97,115,104,512,59,108,5793,5795,32768,8873,59,32768,10982,512,101,114,5803,5806,59,32768,8897,768,98,116,121,5813,5818,5866,97,114,59,32768,8214,512,59,105,5823,5825,32768,8214,99,97,108,1024,66,76,83,84,5837,5842,5848,5859,97,114,59,32768,8739,105,110,101,59,32768,124,101,112,97,114,97,116,111,114,59,32768,10072,105,108,100,101,59,32768,8768,84,104,105,110,83,112,97,99,101,59,32768,8202,114,59,32896,55349,56601,112,102,59,32896,55349,56653,99,114,59,32896,55349,56497,100,97,115,104,59,32768,8874,1280,99,101,102,111,115,5913,5919,5925,5930,5936,105,114,99,59,32768,372,100,103,101,59,32768,8896,114,59,32896,55349,56602,112,102,59,32896,55349,56654,99,114,59,32896,55349,56498,1024,102,105,111,115,5951,5956,5959,5965,114,59,32896,55349,56603,59,32768,926,112,102,59,32896,55349,56655,99,114,59,32896,55349,56499,2304,65,73,85,97,99,102,111,115,117,5990,5995,6e3,6005,6014,6027,6032,6038,6044,99,121,59,32768,1071,99,121,59,32768,1031,99,121,59,32768,1070,99,117,116,101,33024,221,59,32768,221,512,105,121,6019,6024,114,99,59,32768,374,59,32768,1067,114,59,32896,55349,56604,112,102,59,32896,55349,56656,99,114,59,32896,55349,56500,109,108,59,32768,376,2048,72,97,99,100,101,102,111,115,6066,6071,6078,6092,6097,6119,6123,6128,99,121,59,32768,1046,99,117,116,101,59,32768,377,512,97,121,6083,6089,114,111,110,59,32768,381,59,32768,1047,111,116,59,32768,379,835,6102,0,6116,111,87,105,100,116,104,83,112,97,99,101,59,32768,8203,97,59,32768,918,114,59,32768,8488,112,102,59,32768,8484,99,114,59,32896,55349,56501,5938,6159,6168,6175,0,6214,6222,6233,0,0,0,0,6242,6267,6290,6429,6444,0,6495,6503,6531,6540,0,6547,99,117,116,101,33024,225,59,32768,225,114,101,118,101,59,32768,259,1536,59,69,100,105,117,121,6187,6189,6193,6196,6203,6210,32768,8766,59,32896,8766,819,59,32768,8767,114,99,33024,226,59,32768,226,116,101,33024,180,59,32768,180,59,32768,1072,108,105,103,33024,230,59,32768,230,512,59,114,6226,6228,32768,8289,59,32896,55349,56606,114,97,118,101,33024,224,59,32768,224,512,101,112,6246,6261,512,102,112,6251,6257,115,121,109,59,32768,8501,104,59,32768,8501,104,97,59,32768,945,512,97,112,6271,6284,512,99,108,6276,6280,114,59,32768,257,103,59,32768,10815,33024,38,59,32768,38,1077,6295,0,0,6326,1280,59,97,100,115,118,6305,6307,6312,6315,6322,32768,8743,110,100,59,32768,10837,59,32768,10844,108,111,112,101,59,32768,10840,59,32768,10842,1792,59,101,108,109,114,115,122,6340,6342,6345,6349,6391,6410,6422,32768,8736,59,32768,10660,101,59,32768,8736,115,100,512,59,97,6356,6358,32768,8737,2098,6368,6371,6374,6377,6380,6383,6386,6389,59,32768,10664,59,32768,10665,59,32768,10666,59,32768,10667,59,32768,10668,59,32768,10669,59,32768,10670,59,32768,10671,116,512,59,118,6397,6399,32768,8735,98,512,59,100,6405,6407,32768,8894,59,32768,10653,512,112,116,6415,6419,104,59,32768,8738,59,32768,197,97,114,114,59,32768,9084,512,103,112,6433,6438,111,110,59,32768,261,102,59,32896,55349,56658,1792,59,69,97,101,105,111,112,6458,6460,6463,6469,6472,6476,6480,32768,8776,59,32768,10864,99,105,114,59,32768,10863,59,32768,8778,100,59,32768,8779,115,59,32768,39,114,111,120,512,59,101,6488,6490,32768,8776,113,59,32768,8778,105,110,103,33024,229,59,32768,229,768,99,116,121,6509,6514,6517,114,59,32896,55349,56502,59,32768,42,109,112,512,59,101,6524,6526,32768,8776,113,59,32768,8781,105,108,100,101,33024,227,59,32768,227,109,108,33024,228,59,32768,228,512,99,105,6551,6559,111,110,105,110,116,59,32768,8755,110,116,59,32768,10769,4096,78,97,98,99,100,101,102,105,107,108,110,111,112,114,115,117,6597,6602,6673,6688,6701,6707,6768,6773,6891,6898,6999,7023,7309,7316,7334,7383,111,116,59,32768,10989,512,99,114,6607,6652,107,1024,99,101,112,115,6617,6623,6632,6639,111,110,103,59,32768,8780,112,115,105,108,111,110,59,32768,1014,114,105,109,101,59,32768,8245,105,109,512,59,101,6646,6648,32768,8765,113,59,32768,8909,583,6656,6661,101,101,59,32768,8893,101,100,512,59,103,6667,6669,32768,8965,101,59,32768,8965,114,107,512,59,116,6680,6682,32768,9141,98,114,107,59,32768,9142,512,111,121,6693,6698,110,103,59,32768,8780,59,32768,1073,113,117,111,59,32768,8222,1280,99,109,112,114,116,6718,6731,6738,6743,6749,97,117,115,512,59,101,6726,6728,32768,8757,59,32768,8757,112,116,121,118,59,32768,10672,115,105,59,32768,1014,110,111,117,59,32768,8492,768,97,104,119,6756,6759,6762,59,32768,946,59,32768,8502,101,101,110,59,32768,8812,114,59,32896,55349,56607,103,1792,99,111,115,116,117,118,119,6789,6809,6834,6850,6872,6879,6884,768,97,105,117,6796,6800,6805,112,59,32768,8898,114,99,59,32768,9711,112,59,32768,8899,768,100,112,116,6816,6821,6827,111,116,59,32768,10752,108,117,115,59,32768,10753,105,109,101,115,59,32768,10754,1090,6840,0,0,6846,99,117,112,59,32768,10758,97,114,59,32768,9733,114,105,97,110,103,108,101,512,100,117,6862,6868,111,119,110,59,32768,9661,112,59,32768,9651,112,108,117,115,59,32768,10756,101,101,59,32768,8897,101,100,103,101,59,32768,8896,97,114,111,119,59,32768,10509,768,97,107,111,6905,6976,6994,512,99,110,6910,6972,107,768,108,115,116,6918,6927,6935,111,122,101,110,103,101,59,32768,10731,113,117,97,114,101,59,32768,9642,114,105,97,110,103,108,101,1024,59,100,108,114,6951,6953,6959,6965,32768,9652,111,119,110,59,32768,9662,101,102,116,59,32768,9666,105,103,104,116,59,32768,9656,107,59,32768,9251,770,6981,0,6991,771,6985,0,6988,59,32768,9618,59,32768,9617,52,59,32768,9619,99,107,59,32768,9608,512,101,111,7004,7019,512,59,113,7009,7012,32896,61,8421,117,105,118,59,32896,8801,8421,116,59,32768,8976,1024,112,116,119,120,7032,7037,7049,7055,102,59,32896,55349,56659,512,59,116,7042,7044,32768,8869,111,109,59,32768,8869,116,105,101,59,32768,8904,3072,68,72,85,86,98,100,104,109,112,116,117,118,7080,7101,7126,7147,7182,7187,7208,7233,7240,7246,7253,7274,1024,76,82,108,114,7089,7092,7095,7098,59,32768,9559,59,32768,9556,59,32768,9558,59,32768,9555,1280,59,68,85,100,117,7112,7114,7117,7120,7123,32768,9552,59,32768,9574,59,32768,9577,59,32768,9572,59,32768,9575,1024,76,82,108,114,7135,7138,7141,7144,59,32768,9565,59,32768,9562,59,32768,9564,59,32768,9561,1792,59,72,76,82,104,108,114,7162,7164,7167,7170,7173,7176,7179,32768,9553,59,32768,9580,59,32768,9571,59,32768,9568,59,32768,9579,59,32768,9570,59,32768,9567,111,120,59,32768,10697,1024,76,82,108,114,7196,7199,7202,7205,59,32768,9557,59,32768,9554,59,32768,9488,59,32768,9484,1280,59,68,85,100,117,7219,7221,7224,7227,7230,32768,9472,59,32768,9573,59,32768,9576,59,32768,9516,59,32768,9524,105,110,117,115,59,32768,8863,108,117,115,59,32768,8862,105,109,101,115,59,32768,8864,1024,76,82,108,114,7262,7265,7268,7271,59,32768,9563,59,32768,9560,59,32768,9496,59,32768,9492,1792,59,72,76,82,104,108,114,7289,7291,7294,7297,7300,7303,7306,32768,9474,59,32768,9578,59,32768,9569,59,32768,9566,59,32768,9532,59,32768,9508,59,32768,9500,114,105,109,101,59,32768,8245,512,101,118,7321,7326,118,101,59,32768,728,98,97,114,33024,166,59,32768,166,1024,99,101,105,111,7343,7348,7353,7364,114,59,32896,55349,56503,109,105,59,32768,8271,109,512,59,101,7359,7361,32768,8765,59,32768,8909,108,768,59,98,104,7372,7374,7377,32768,92,59,32768,10693,115,117,98,59,32768,10184,573,7387,7399,108,512,59,101,7392,7394,32768,8226,116,59,32768,8226,112,768,59,69,101,7406,7408,7411,32768,8782,59,32768,10926,512,59,113,7416,7418,32768,8783,59,32768,8783,6450,7448,0,7523,7571,7576,7613,0,7618,7647,0,0,7764,0,0,7779,0,0,7899,7914,7949,7955,0,8158,0,8176,768,99,112,114,7454,7460,7509,117,116,101,59,32768,263,1536,59,97,98,99,100,115,7473,7475,7480,7487,7500,7505,32768,8745,110,100,59,32768,10820,114,99,117,112,59,32768,10825,512,97,117,7492,7496,112,59,32768,10827,112,59,32768,10823,111,116,59,32768,10816,59,32896,8745,65024,512,101,111,7514,7518,116,59,32768,8257,110,59,32768,711,1024,97,101,105,117,7531,7544,7552,7557,833,7536,0,7540,115,59,32768,10829,111,110,59,32768,269,100,105,108,33024,231,59,32768,231,114,99,59,32768,265,112,115,512,59,115,7564,7566,32768,10828,109,59,32768,10832,111,116,59,32768,267,768,100,109,110,7582,7589,7596,105,108,33024,184,59,32768,184,112,116,121,118,59,32768,10674,116,33280,162,59,101,7603,7605,32768,162,114,100,111,116,59,32768,183,114,59,32896,55349,56608,768,99,101,105,7624,7628,7643,121,59,32768,1095,99,107,512,59,109,7635,7637,32768,10003,97,114,107,59,32768,10003,59,32768,967,114,1792,59,69,99,101,102,109,115,7662,7664,7667,7742,7745,7752,7757,32768,9675,59,32768,10691,768,59,101,108,7674,7676,7680,32768,710,113,59,32768,8791,101,1074,7687,0,0,7709,114,114,111,119,512,108,114,7695,7701,101,102,116,59,32768,8634,105,103,104,116,59,32768,8635,1280,82,83,97,99,100,7719,7722,7725,7730,7736,59,32768,174,59,32768,9416,115,116,59,32768,8859,105,114,99,59,32768,8858,97,115,104,59,32768,8861,59,32768,8791,110,105,110,116,59,32768,10768,105,100,59,32768,10991,99,105,114,59,32768,10690,117,98,115,512,59,117,7771,7773,32768,9827,105,116,59,32768,9827,1341,7785,7804,7850,0,7871,111,110,512,59,101,7791,7793,32768,58,512,59,113,7798,7800,32768,8788,59,32768,8788,1086,7809,0,0,7820,97,512,59,116,7814,7816,32768,44,59,32768,64,768,59,102,108,7826,7828,7832,32768,8705,110,59,32768,8728,101,512,109,120,7838,7844,101,110,116,59,32768,8705,101,115,59,32768,8450,824,7854,0,7866,512,59,100,7858,7860,32768,8773,111,116,59,32768,10861,110,116,59,32768,8750,768,102,114,121,7877,7881,7886,59,32896,55349,56660,111,100,59,32768,8720,33280,169,59,115,7892,7894,32768,169,114,59,32768,8471,512,97,111,7903,7908,114,114,59,32768,8629,115,115,59,32768,10007,512,99,117,7918,7923,114,59,32896,55349,56504,512,98,112,7928,7938,512,59,101,7933,7935,32768,10959,59,32768,10961,512,59,101,7943,7945,32768,10960,59,32768,10962,100,111,116,59,32768,8943,1792,100,101,108,112,114,118,119,7969,7983,7996,8009,8057,8147,8152,97,114,114,512,108,114,7977,7980,59,32768,10552,59,32768,10549,1089,7989,0,0,7993,114,59,32768,8926,99,59,32768,8927,97,114,114,512,59,112,8004,8006,32768,8630,59,32768,10557,1536,59,98,99,100,111,115,8022,8024,8031,8044,8049,8053,32768,8746,114,99,97,112,59,32768,10824,512,97,117,8036,8040,112,59,32768,10822,112,59,32768,10826,111,116,59,32768,8845,114,59,32768,10821,59,32896,8746,65024,1024,97,108,114,118,8066,8078,8116,8123,114,114,512,59,109,8073,8075,32768,8631,59,32768,10556,121,768,101,118,119,8086,8104,8109,113,1089,8093,0,0,8099,114,101,99,59,32768,8926,117,99,99,59,32768,8927,101,101,59,32768,8910,101,100,103,101,59,32768,8911,101,110,33024,164,59,32768,164,101,97,114,114,111,119,512,108,114,8134,8140,101,102,116,59,32768,8630,105,103,104,116,59,32768,8631,101,101,59,32768,8910,101,100,59,32768,8911,512,99,105,8162,8170,111,110,105,110,116,59,32768,8754,110,116,59,32768,8753,108,99,116,121,59,32768,9005,4864,65,72,97,98,99,100,101,102,104,105,106,108,111,114,115,116,117,119,122,8221,8226,8231,8267,8282,8296,8327,8351,8366,8379,8466,8471,8487,8621,8647,8676,8697,8712,8720,114,114,59,32768,8659,97,114,59,32768,10597,1024,103,108,114,115,8240,8246,8252,8256,103,101,114,59,32768,8224,101,116,104,59,32768,8504,114,59,32768,8595,104,512,59,118,8262,8264,32768,8208,59,32768,8867,572,8271,8278,97,114,111,119,59,32768,10511,97,99,59,32768,733,512,97,121,8287,8293,114,111,110,59,32768,271,59,32768,1076,768,59,97,111,8303,8305,8320,32768,8518,512,103,114,8310,8316,103,101,114,59,32768,8225,114,59,32768,8650,116,115,101,113,59,32768,10871,768,103,108,109,8334,8339,8344,33024,176,59,32768,176,116,97,59,32768,948,112,116,121,118,59,32768,10673,512,105,114,8356,8362,115,104,116,59,32768,10623,59,32896,55349,56609,97,114,512,108,114,8373,8376,59,32768,8643,59,32768,8642,1280,97,101,103,115,118,8390,8418,8421,8428,8433,109,768,59,111,115,8398,8400,8415,32768,8900,110,100,512,59,115,8407,8409,32768,8900,117,105,116,59,32768,9830,59,32768,9830,59,32768,168,97,109,109,97,59,32768,989,105,110,59,32768,8946,768,59,105,111,8440,8442,8461,32768,247,100,101,33280,247,59,111,8450,8452,32768,247,110,116,105,109,101,115,59,32768,8903,110,120,59,32768,8903,99,121,59,32768,1106,99,1088,8478,0,0,8483,114,110,59,32768,8990,111,112,59,32768,8973,1280,108,112,116,117,119,8498,8504,8509,8556,8570,108,97,114,59,32768,36,102,59,32896,55349,56661,1280,59,101,109,112,115,8520,8522,8535,8542,8548,32768,729,113,512,59,100,8528,8530,32768,8784,111,116,59,32768,8785,105,110,117,115,59,32768,8760,108,117,115,59,32768,8724,113,117,97,114,101,59,32768,8865,98,108,101,98,97,114,119,101,100,103,101,59,32768,8966,110,768,97,100,104,8578,8585,8597,114,114,111,119,59,32768,8595,111,119,110,97,114,114,111,119,115,59,32768,8650,97,114,112,111,111,110,512,108,114,8608,8614,101,102,116,59,32768,8643,105,103,104,116,59,32768,8642,563,8625,8633,107,97,114,111,119,59,32768,10512,1088,8638,0,0,8643,114,110,59,32768,8991,111,112,59,32768,8972,768,99,111,116,8654,8666,8670,512,114,121,8659,8663,59,32896,55349,56505,59,32768,1109,108,59,32768,10742,114,111,107,59,32768,273,512,100,114,8681,8686,111,116,59,32768,8945,105,512,59,102,8692,8694,32768,9663,59,32768,9662,512,97,104,8702,8707,114,114,59,32768,8693,97,114,59,32768,10607,97,110,103,108,101,59,32768,10662,512,99,105,8725,8729,121,59,32768,1119,103,114,97,114,114,59,32768,10239,4608,68,97,99,100,101,102,103,108,109,110,111,112,113,114,115,116,117,120,8774,8788,8807,8844,8849,8852,8866,8895,8929,8977,8989,9004,9046,9136,9151,9171,9184,9199,512,68,111,8779,8784,111,116,59,32768,10871,116,59,32768,8785,512,99,115,8793,8801,117,116,101,33024,233,59,32768,233,116,101,114,59,32768,10862,1024,97,105,111,121,8816,8822,8835,8841,114,111,110,59,32768,283,114,512,59,99,8828,8830,32768,8790,33024,234,59,32768,234,108,111,110,59,32768,8789,59,32768,1101,111,116,59,32768,279,59,32768,8519,512,68,114,8857,8862,111,116,59,32768,8786,59,32896,55349,56610,768,59,114,115,8873,8875,8883,32768,10906,97,118,101,33024,232,59,32768,232,512,59,100,8888,8890,32768,10902,111,116,59,32768,10904,1024,59,105,108,115,8904,8906,8914,8917,32768,10905,110,116,101,114,115,59,32768,9191,59,32768,8467,512,59,100,8922,8924,32768,10901,111,116,59,32768,10903,768,97,112,115,8936,8941,8960,99,114,59,32768,275,116,121,768,59,115,118,8950,8952,8957,32768,8709,101,116,59,32768,8709,59,32768,8709,112,512,49,59,8966,8975,516,8970,8973,59,32768,8196,59,32768,8197,32768,8195,512,103,115,8982,8985,59,32768,331,112,59,32768,8194,512,103,112,8994,8999,111,110,59,32768,281,102,59,32896,55349,56662,768,97,108,115,9011,9023,9028,114,512,59,115,9017,9019,32768,8917,108,59,32768,10723,117,115,59,32768,10865,105,768,59,108,118,9036,9038,9043,32768,949,111,110,59,32768,949,59,32768,1013,1024,99,115,117,118,9055,9071,9099,9128,512,105,111,9060,9065,114,99,59,32768,8790,108,111,110,59,32768,8789,1082,9077,0,0,9081,109,59,32768,8770,97,110,116,512,103,108,9088,9093,116,114,59,32768,10902,101,115,115,59,32768,10901,768,97,101,105,9106,9111,9116,108,115,59,32768,61,115,116,59,32768,8799,118,512,59,68,9122,9124,32768,8801,68,59,32768,10872,112,97,114,115,108,59,32768,10725,512,68,97,9141,9146,111,116,59,32768,8787,114,114,59,32768,10609,768,99,100,105,9158,9162,9167,114,59,32768,8495,111,116,59,32768,8784,109,59,32768,8770,512,97,104,9176,9179,59,32768,951,33024,240,59,32768,240,512,109,114,9189,9195,108,33024,235,59,32768,235,111,59,32768,8364,768,99,105,112,9206,9210,9215,108,59,32768,33,115,116,59,32768,8707,512,101,111,9220,9230,99,116,97,116,105,111,110,59,32768,8496,110,101,110,116,105,97,108,101,59,32768,8519,4914,9262,0,9276,0,9280,9287,0,0,9318,9324,0,9331,0,9352,9357,9386,0,9395,9497,108,108,105,110,103,100,111,116,115,101,113,59,32768,8786,121,59,32768,1092,109,97,108,101,59,32768,9792,768,105,108,114,9293,9299,9313,108,105,103,59,32768,64259,1082,9305,0,0,9309,103,59,32768,64256,105,103,59,32768,64260,59,32896,55349,56611,108,105,103,59,32768,64257,108,105,103,59,32896,102,106,768,97,108,116,9337,9341,9346,116,59,32768,9837,105,103,59,32768,64258,110,115,59,32768,9649,111,102,59,32768,402,833,9361,0,9366,102,59,32896,55349,56663,512,97,107,9370,9375,108,108,59,32768,8704,512,59,118,9380,9382,32768,8916,59,32768,10969,97,114,116,105,110,116,59,32768,10765,512,97,111,9399,9491,512,99,115,9404,9487,1794,9413,9443,9453,9470,9474,0,9484,1795,9421,9426,9429,9434,9437,0,9440,33024,189,59,32768,189,59,32768,8531,33024,188,59,32768,188,59,32768,8533,59,32768,8537,59,32768,8539,772,9447,0,9450,59,32768,8532,59,32768,8534,1285,9459,9464,0,0,9467,33024,190,59,32768,190,59,32768,8535,59,32768,8540,53,59,32768,8536,775,9478,0,9481,59,32768,8538,59,32768,8541,56,59,32768,8542,108,59,32768,8260,119,110,59,32768,8994,99,114,59,32896,55349,56507,4352,69,97,98,99,100,101,102,103,105,106,108,110,111,114,115,116,118,9537,9547,9575,9582,9595,9600,9679,9684,9694,9700,9705,9725,9773,9779,9785,9810,9917,512,59,108,9542,9544,32768,8807,59,32768,10892,768,99,109,112,9554,9560,9572,117,116,101,59,32768,501,109,97,512,59,100,9567,9569,32768,947,59,32768,989,59,32768,10886,114,101,118,101,59,32768,287,512,105,121,9587,9592,114,99,59,32768,285,59,32768,1075,111,116,59,32768,289,1024,59,108,113,115,9609,9611,9614,9633,32768,8805,59,32768,8923,768,59,113,115,9621,9623,9626,32768,8805,59,32768,8807,108,97,110,116,59,32768,10878,1024,59,99,100,108,9642,9644,9648,9667,32768,10878,99,59,32768,10921,111,116,512,59,111,9655,9657,32768,10880,512,59,108,9662,9664,32768,10882,59,32768,10884,512,59,101,9672,9675,32896,8923,65024,115,59,32768,10900,114,59,32896,55349,56612,512,59,103,9689,9691,32768,8811,59,32768,8921,109,101,108,59,32768,8503,99,121,59,32768,1107,1024,59,69,97,106,9714,9716,9719,9722,32768,8823,59,32768,10898,59,32768,10917,59,32768,10916,1024,69,97,101,115,9734,9737,9751,9768,59,32768,8809,112,512,59,112,9743,9745,32768,10890,114,111,120,59,32768,10890,512,59,113,9756,9758,32768,10888,512,59,113,9763,9765,32768,10888,59,32768,8809,105,109,59,32768,8935,112,102,59,32896,55349,56664,97,118,101,59,32768,96,512,99,105,9790,9794,114,59,32768,8458,109,768,59,101,108,9802,9804,9807,32768,8819,59,32768,10894,59,32768,10896,34304,62,59,99,100,108,113,114,9824,9826,9838,9843,9849,9856,32768,62,512,99,105,9831,9834,59,32768,10919,114,59,32768,10874,111,116,59,32768,8919,80,97,114,59,32768,10645,117,101,115,116,59,32768,10876,1280,97,100,101,108,115,9867,9882,9887,9906,9912,833,9872,0,9879,112,114,111,120,59,32768,10886,114,59,32768,10616,111,116,59,32768,8919,113,512,108,113,9893,9899,101,115,115,59,32768,8923,108,101,115,115,59,32768,10892,101,115,115,59,32768,8823,105,109,59,32768,8819,512,101,110,9922,9932,114,116,110,101,113,113,59,32896,8809,65024,69,59,32896,8809,65024,2560,65,97,98,99,101,102,107,111,115,121,9958,9963,10015,10020,10026,10060,10065,10085,10147,10171,114,114,59,32768,8660,1024,105,108,109,114,9972,9978,9982,9988,114,115,112,59,32768,8202,102,59,32768,189,105,108,116,59,32768,8459,512,100,114,9993,9998,99,121,59,32768,1098,768,59,99,119,10005,10007,10012,32768,8596,105,114,59,32768,10568,59,32768,8621,97,114,59,32768,8463,105,114,99,59,32768,293,768,97,108,114,10033,10048,10054,114,116,115,512,59,117,10041,10043,32768,9829,105,116,59,32768,9829,108,105,112,59,32768,8230,99,111,110,59,32768,8889,114,59,32896,55349,56613,115,512,101,119,10071,10078,97,114,111,119,59,32768,10533,97,114,111,119,59,32768,10534,1280,97,109,111,112,114,10096,10101,10107,10136,10141,114,114,59,32768,8703,116,104,116,59,32768,8763,107,512,108,114,10113,10124,101,102,116,97,114,114,111,119,59,32768,8617,105,103,104,116,97,114,114,111,119,59,32768,8618,102,59,32896,55349,56665,98,97,114,59,32768,8213,768,99,108,116,10154,10159,10165,114,59,32896,55349,56509,97,115,104,59,32768,8463,114,111,107,59,32768,295,512,98,112,10176,10182,117,108,108,59,32768,8259,104,101,110,59,32768,8208,5426,10211,0,10220,0,10239,10255,10267,0,10276,10312,0,0,10318,10371,10458,10485,10491,0,10500,10545,10558,99,117,116,101,33024,237,59,32768,237,768,59,105,121,10226,10228,10235,32768,8291,114,99,33024,238,59,32768,238,59,32768,1080,512,99,120,10243,10247,121,59,32768,1077,99,108,33024,161,59,32768,161,512,102,114,10259,10262,59,32768,8660,59,32896,55349,56614,114,97,118,101,33024,236,59,32768,236,1024,59,105,110,111,10284,10286,10300,10306,32768,8520,512,105,110,10291,10296,110,116,59,32768,10764,116,59,32768,8749,102,105,110,59,32768,10716,116,97,59,32768,8489,108,105,103,59,32768,307,768,97,111,112,10324,10361,10365,768,99,103,116,10331,10335,10357,114,59,32768,299,768,101,108,112,10342,10345,10351,59,32768,8465,105,110,101,59,32768,8464,97,114,116,59,32768,8465,104,59,32768,305,102,59,32768,8887,101,100,59,32768,437,1280,59,99,102,111,116,10381,10383,10389,10403,10409,32768,8712,97,114,101,59,32768,8453,105,110,512,59,116,10396,10398,32768,8734,105,101,59,32768,10717,100,111,116,59,32768,305,1280,59,99,101,108,112,10420,10422,10427,10444,10451,32768,8747,97,108,59,32768,8890,512,103,114,10432,10438,101,114,115,59,32768,8484,99,97,108,59,32768,8890,97,114,104,107,59,32768,10775,114,111,100,59,32768,10812,1024,99,103,112,116,10466,10470,10475,10480,121,59,32768,1105,111,110,59,32768,303,102,59,32896,55349,56666,97,59,32768,953,114,111,100,59,32768,10812,117,101,115,116,33024,191,59,32768,191,512,99,105,10504,10509,114,59,32896,55349,56510,110,1280,59,69,100,115,118,10521,10523,10526,10531,10541,32768,8712,59,32768,8953,111,116,59,32768,8949,512,59,118,10536,10538,32768,8948,59,32768,8947,59,32768,8712,512,59,105,10549,10551,32768,8290,108,100,101,59,32768,297,828,10562,0,10567,99,121,59,32768,1110,108,33024,239,59,32768,239,1536,99,102,109,111,115,117,10585,10598,10603,10609,10615,10630,512,105,121,10590,10595,114,99,59,32768,309,59,32768,1081,114,59,32896,55349,56615,97,116,104,59,32768,567,112,102,59,32896,55349,56667,820,10620,0,10625,114,59,32896,55349,56511,114,99,121,59,32768,1112,107,99,121,59,32768,1108,2048,97,99,102,103,104,106,111,115,10653,10666,10680,10685,10692,10697,10702,10708,112,112,97,512,59,118,10661,10663,32768,954,59,32768,1008,512,101,121,10671,10677,100,105,108,59,32768,311,59,32768,1082,114,59,32896,55349,56616,114,101,101,110,59,32768,312,99,121,59,32768,1093,99,121,59,32768,1116,112,102,59,32896,55349,56668,99,114,59,32896,55349,56512,5888,65,66,69,72,97,98,99,100,101,102,103,104,106,108,109,110,111,112,114,115,116,117,118,10761,10783,10789,10799,10804,10957,11011,11047,11094,11349,11372,11382,11409,11414,11451,11478,11526,11698,11711,11755,11823,11910,11929,768,97,114,116,10768,10773,10777,114,114,59,32768,8666,114,59,32768,8656,97,105,108,59,32768,10523,97,114,114,59,32768,10510,512,59,103,10794,10796,32768,8806,59,32768,10891,97,114,59,32768,10594,4660,10824,0,10830,0,10838,0,0,0,0,0,10844,10850,0,10867,10870,10877,0,10933,117,116,101,59,32768,314,109,112,116,121,118,59,32768,10676,114,97,110,59,32768,8466,98,100,97,59,32768,955,103,768,59,100,108,10857,10859,10862,32768,10216,59,32768,10641,101,59,32768,10216,59,32768,10885,117,111,33024,171,59,32768,171,114,2048,59,98,102,104,108,112,115,116,10894,10896,10907,10911,10915,10919,10923,10928,32768,8592,512,59,102,10901,10903,32768,8676,115,59,32768,10527,115,59,32768,10525,107,59,32768,8617,112,59,32768,8619,108,59,32768,10553,105,109,59,32768,10611,108,59,32768,8610,768,59,97,101,10939,10941,10946,32768,10923,105,108,59,32768,10521,512,59,115,10951,10953,32768,10925,59,32896,10925,65024,768,97,98,114,10964,10969,10974,114,114,59,32768,10508,114,107,59,32768,10098,512,97,107,10979,10991,99,512,101,107,10985,10988,59,32768,123,59,32768,91,512,101,115,10996,10999,59,32768,10635,108,512,100,117,11005,11008,59,32768,10639,59,32768,10637,1024,97,101,117,121,11020,11026,11040,11044,114,111,110,59,32768,318,512,100,105,11031,11036,105,108,59,32768,316,108,59,32768,8968,98,59,32768,123,59,32768,1083,1024,99,113,114,115,11056,11060,11072,11090,97,59,32768,10550,117,111,512,59,114,11067,11069,32768,8220,59,32768,8222,512,100,117,11077,11083,104,97,114,59,32768,10599,115,104,97,114,59,32768,10571,104,59,32768,8626,1280,59,102,103,113,115,11105,11107,11228,11231,11250,32768,8804,116,1280,97,104,108,114,116,11119,11136,11157,11169,11216,114,114,111,119,512,59,116,11128,11130,32768,8592,97,105,108,59,32768,8610,97,114,112,111,111,110,512,100,117,11147,11153,111,119,110,59,32768,8637,112,59,32768,8636,101,102,116,97,114,114,111,119,115,59,32768,8647,105,103,104,116,768,97,104,115,11180,11194,11204,114,114,111,119,512,59,115,11189,11191,32768,8596,59,32768,8646,97,114,112,111,111,110,115,59,32768,8651,113,117,105,103,97,114,114,111,119,59,32768,8621,104,114,101,101,116,105,109,101,115,59,32768,8907,59,32768,8922,768,59,113,115,11238,11240,11243,32768,8804,59,32768,8806,108,97,110,116,59,32768,10877,1280,59,99,100,103,115,11261,11263,11267,11286,11298,32768,10877,99,59,32768,10920,111,116,512,59,111,11274,11276,32768,10879,512,59,114,11281,11283,32768,10881,59,32768,10883,512,59,101,11291,11294,32896,8922,65024,115,59,32768,10899,1280,97,100,101,103,115,11309,11317,11322,11339,11344,112,112,114,111,120,59,32768,10885,111,116,59,32768,8918,113,512,103,113,11328,11333,116,114,59,32768,8922,103,116,114,59,32768,10891,116,114,59,32768,8822,105,109,59,32768,8818,768,105,108,114,11356,11362,11368,115,104,116,59,32768,10620,111,111,114,59,32768,8970,59,32896,55349,56617,512,59,69,11377,11379,32768,8822,59,32768,10897,562,11386,11405,114,512,100,117,11391,11394,59,32768,8637,512,59,108,11399,11401,32768,8636,59,32768,10602,108,107,59,32768,9604,99,121,59,32768,1113,1280,59,97,99,104,116,11425,11427,11432,11440,11446,32768,8810,114,114,59,32768,8647,111,114,110,101,114,59,32768,8990,97,114,100,59,32768,10603,114,105,59,32768,9722,512,105,111,11456,11462,100,111,116,59,32768,320,117,115,116,512,59,97,11470,11472,32768,9136,99,104,101,59,32768,9136,1024,69,97,101,115,11487,11490,11504,11521,59,32768,8808,112,512,59,112,11496,11498,32768,10889,114,111,120,59,32768,10889,512,59,113,11509,11511,32768,10887,512,59,113,11516,11518,32768,10887,59,32768,8808,105,109,59,32768,8934,2048,97,98,110,111,112,116,119,122,11543,11556,11561,11616,11640,11660,11667,11680,512,110,114,11548,11552,103,59,32768,10220,114,59,32768,8701,114,107,59,32768,10214,103,768,108,109,114,11569,11596,11604,101,102,116,512,97,114,11577,11584,114,114,111,119,59,32768,10229,105,103,104,116,97,114,114,111,119,59,32768,10231,97,112,115,116,111,59,32768,10236,105,103,104,116,97,114,114,111,119,59,32768,10230,112,97,114,114,111,119,512,108,114,11627,11633,101,102,116,59,32768,8619,105,103,104,116,59,32768,8620,768,97,102,108,11647,11651,11655,114,59,32768,10629,59,32896,55349,56669,117,115,59,32768,10797,105,109,101,115,59,32768,10804,562,11671,11676,115,116,59,32768,8727,97,114,59,32768,95,768,59,101,102,11687,11689,11695,32768,9674,110,103,101,59,32768,9674,59,32768,10731,97,114,512,59,108,11705,11707,32768,40,116,59,32768,10643,1280,97,99,104,109,116,11722,11727,11735,11747,11750,114,114,59,32768,8646,111,114,110,101,114,59,32768,8991,97,114,512,59,100,11742,11744,32768,8651,59,32768,10605,59,32768,8206,114,105,59,32768,8895,1536,97,99,104,105,113,116,11768,11774,11779,11782,11798,11817,113,117,111,59,32768,8249,114,59,32896,55349,56513,59,32768,8624,109,768,59,101,103,11790,11792,11795,32768,8818,59,32768,10893,59,32768,10895,512,98,117,11803,11806,59,32768,91,111,512,59,114,11812,11814,32768,8216,59,32768,8218,114,111,107,59,32768,322,34816,60,59,99,100,104,105,108,113,114,11841,11843,11855,11860,11866,11872,11878,11885,32768,60,512,99,105,11848,11851,59,32768,10918,114,59,32768,10873,111,116,59,32768,8918,114,101,101,59,32768,8907,109,101,115,59,32768,8905,97,114,114,59,32768,10614,117,101,115,116,59,32768,10875,512,80,105,11890,11895,97,114,59,32768,10646,768,59,101,102,11902,11904,11907,32768,9667,59,32768,8884,59,32768,9666,114,512,100,117,11916,11923,115,104,97,114,59,32768,10570,104,97,114,59,32768,10598,512,101,110,11934,11944,114,116,110,101,113,113,59,32896,8808,65024,69,59,32896,8808,65024,3584,68,97,99,100,101,102,104,105,108,110,111,112,115,117,11978,11984,12061,12075,12081,12095,12100,12104,12170,12181,12188,12204,12207,12223,68,111,116,59,32768,8762,1024,99,108,112,114,11993,11999,12019,12055,114,33024,175,59,32768,175,512,101,116,12004,12007,59,32768,9794,512,59,101,12012,12014,32768,10016,115,101,59,32768,10016,512,59,115,12024,12026,32768,8614,116,111,1024,59,100,108,117,12037,12039,12045,12051,32768,8614,111,119,110,59,32768,8615,101,102,116,59,32768,8612,112,59,32768,8613,107,101,114,59,32768,9646,512,111,121,12066,12072,109,109,97,59,32768,10793,59,32768,1084,97,115,104,59,32768,8212,97,115,117,114,101,100,97,110,103,108,101,59,32768,8737,114,59,32896,55349,56618,111,59,32768,8487,768,99,100,110,12111,12118,12146,114,111,33024,181,59,32768,181,1024,59,97,99,100,12127,12129,12134,12139,32768,8739,115,116,59,32768,42,105,114,59,32768,10992,111,116,33024,183,59,32768,183,117,115,768,59,98,100,12155,12157,12160,32768,8722,59,32768,8863,512,59,117,12165,12167,32768,8760,59,32768,10794,564,12174,12178,112,59,32768,10971,114,59,32768,8230,112,108,117,115,59,32768,8723,512,100,112,12193,12199,101,108,115,59,32768,8871,102,59,32896,55349,56670,59,32768,8723,512,99,116,12212,12217,114,59,32896,55349,56514,112,111,115,59,32768,8766,768,59,108,109,12230,12232,12240,32768,956,116,105,109,97,112,59,32768,8888,97,112,59,32768,8888,6144,71,76,82,86,97,98,99,100,101,102,103,104,105,106,108,109,111,112,114,115,116,117,118,119,12294,12315,12364,12376,12393,12472,12496,12547,12553,12636,12641,12703,12725,12747,12752,12876,12881,12957,13033,13089,13294,13359,13384,13499,512,103,116,12299,12303,59,32896,8921,824,512,59,118,12308,12311,32896,8811,8402,59,32896,8811,824,768,101,108,116,12322,12348,12352,102,116,512,97,114,12329,12336,114,114,111,119,59,32768,8653,105,103,104,116,97,114,114,111,119,59,32768,8654,59,32896,8920,824,512,59,118,12357,12360,32896,8810,8402,59,32896,8810,824,105,103,104,116,97,114,114,111,119,59,32768,8655,512,68,100,12381,12387,97,115,104,59,32768,8879,97,115,104,59,32768,8878,1280,98,99,110,112,116,12404,12409,12415,12420,12452,108,97,59,32768,8711,117,116,101,59,32768,324,103,59,32896,8736,8402,1280,59,69,105,111,112,12431,12433,12437,12442,12446,32768,8777,59,32896,10864,824,100,59,32896,8779,824,115,59,32768,329,114,111,120,59,32768,8777,117,114,512,59,97,12459,12461,32768,9838,108,512,59,115,12467,12469,32768,9838,59,32768,8469,836,12477,0,12483,112,33024,160,59,32768,160,109,112,512,59,101,12489,12492,32896,8782,824,59,32896,8783,824,1280,97,101,111,117,121,12507,12519,12525,12540,12544,833,12512,0,12515,59,32768,10819,111,110,59,32768,328,100,105,108,59,32768,326,110,103,512,59,100,12532,12534,32768,8775,111,116,59,32896,10861,824,112,59,32768,10818,59,32768,1085,97,115,104,59,32768,8211,1792,59,65,97,100,113,115,120,12568,12570,12575,12596,12602,12608,12623,32768,8800,114,114,59,32768,8663,114,512,104,114,12581,12585,107,59,32768,10532,512,59,111,12590,12592,32768,8599,119,59,32768,8599,111,116,59,32896,8784,824,117,105,118,59,32768,8802,512,101,105,12613,12618,97,114,59,32768,10536,109,59,32896,8770,824,105,115,116,512,59,115,12631,12633,32768,8708,59,32768,8708,114,59,32896,55349,56619,1024,69,101,115,116,12650,12654,12688,12693,59,32896,8807,824,768,59,113,115,12661,12663,12684,32768,8817,768,59,113,115,12670,12672,12676,32768,8817,59,32896,8807,824,108,97,110,116,59,32896,10878,824,59,32896,10878,824,105,109,59,32768,8821,512,59,114,12698,12700,32768,8815,59,32768,8815,768,65,97,112,12710,12715,12720,114,114,59,32768,8654,114,114,59,32768,8622,97,114,59,32768,10994,768,59,115,118,12732,12734,12744,32768,8715,512,59,100,12739,12741,32768,8956,59,32768,8954,59,32768,8715,99,121,59,32768,1114,1792,65,69,97,100,101,115,116,12767,12772,12776,12781,12785,12853,12858,114,114,59,32768,8653,59,32896,8806,824,114,114,59,32768,8602,114,59,32768,8229,1024,59,102,113,115,12794,12796,12821,12842,32768,8816,116,512,97,114,12802,12809,114,114,111,119,59,32768,8602,105,103,104,116,97,114,114,111,119,59,32768,8622,768,59,113,115,12828,12830,12834,32768,8816,59,32896,8806,824,108,97,110,116,59,32896,10877,824,512,59,115,12847,12850,32896,10877,824,59,32768,8814,105,109,59,32768,8820,512,59,114,12863,12865,32768,8814,105,512,59,101,12871,12873,32768,8938,59,32768,8940,105,100,59,32768,8740,512,112,116,12886,12891,102,59,32896,55349,56671,33536,172,59,105,110,12899,12901,12936,32768,172,110,1024,59,69,100,118,12911,12913,12917,12923,32768,8713,59,32896,8953,824,111,116,59,32896,8949,824,818,12928,12931,12934,59,32768,8713,59,32768,8951,59,32768,8950,105,512,59,118,12942,12944,32768,8716,818,12949,12952,12955,59,32768,8716,59,32768,8958,59,32768,8957,768,97,111,114,12964,12992,12999,114,1024,59,97,115,116,12974,12976,12983,12988,32768,8742,108,108,101,108,59,32768,8742,108,59,32896,11005,8421,59,32896,8706,824,108,105,110,116,59,32768,10772,768,59,99,101,13006,13008,13013,32768,8832,117,101,59,32768,8928,512,59,99,13018,13021,32896,10927,824,512,59,101,13026,13028,32768,8832,113,59,32896,10927,824,1024,65,97,105,116,13042,13047,13066,13077,114,114,59,32768,8655,114,114,768,59,99,119,13056,13058,13062,32768,8603,59,32896,10547,824,59,32896,8605,824,103,104,116,97,114,114,111,119,59,32768,8603,114,105,512,59,101,13084,13086,32768,8939,59,32768,8941,1792,99,104,105,109,112,113,117,13104,13128,13151,13169,13174,13179,13194,1024,59,99,101,114,13113,13115,13120,13124,32768,8833,117,101,59,32768,8929,59,32896,10928,824,59,32896,55349,56515,111,114,116,1086,13137,0,0,13142,105,100,59,32768,8740,97,114,97,108,108,101,108,59,32768,8742,109,512,59,101,13157,13159,32768,8769,512,59,113,13164,13166,32768,8772,59,32768,8772,105,100,59,32768,8740,97,114,59,32768,8742,115,117,512,98,112,13186,13190,101,59,32768,8930,101,59,32768,8931,768,98,99,112,13201,13241,13254,1024,59,69,101,115,13210,13212,13216,13219,32768,8836,59,32896,10949,824,59,32768,8840,101,116,512,59,101,13226,13229,32896,8834,8402,113,512,59,113,13235,13237,32768,8840,59,32896,10949,824,99,512,59,101,13247,13249,32768,8833,113,59,32896,10928,824,1024,59,69,101,115,13263,13265,13269,13272,32768,8837,59,32896,10950,824,59,32768,8841,101,116,512,59,101,13279,13282,32896,8835,8402,113,512,59,113,13288,13290,32768,8841,59,32896,10950,824,1024,103,105,108,114,13303,13307,13315,13319,108,59,32768,8825,108,100,101,33024,241,59,32768,241,103,59,32768,8824,105,97,110,103,108,101,512,108,114,13330,13344,101,102,116,512,59,101,13338,13340,32768,8938,113,59,32768,8940,105,103,104,116,512,59,101,13353,13355,32768,8939,113,59,32768,8941,512,59,109,13364,13366,32768,957,768,59,101,115,13373,13375,13380,32768,35,114,111,59,32768,8470,112,59,32768,8199,2304,68,72,97,100,103,105,108,114,115,13403,13409,13415,13420,13426,13439,13446,13476,13493,97,115,104,59,32768,8877,97,114,114,59,32768,10500,112,59,32896,8781,8402,97,115,104,59,32768,8876,512,101,116,13431,13435,59,32896,8805,8402,59,32896,62,8402,110,102,105,110,59,32768,10718,768,65,101,116,13453,13458,13462,114,114,59,32768,10498,59,32896,8804,8402,512,59,114,13467,13470,32896,60,8402,105,101,59,32896,8884,8402,512,65,116,13481,13486,114,114,59,32768,10499,114,105,101,59,32896,8885,8402,105,109,59,32896,8764,8402,768,65,97,110,13506,13511,13532,114,114,59,32768,8662,114,512,104,114,13517,13521,107,59,32768,10531,512,59,111,13526,13528,32768,8598,119,59,32768,8598,101,97,114,59,32768,10535,9252,13576,0,0,0,0,0,0,0,0,0,0,0,0,0,13579,0,13596,13617,13653,13659,13673,13695,13708,0,0,13713,13750,0,13788,13794,0,13815,13890,13913,13937,13944,59,32768,9416,512,99,115,13583,13591,117,116,101,33024,243,59,32768,243,116,59,32768,8859,512,105,121,13600,13613,114,512,59,99,13606,13608,32768,8858,33024,244,59,32768,244,59,32768,1086,1280,97,98,105,111,115,13627,13632,13638,13642,13646,115,104,59,32768,8861,108,97,99,59,32768,337,118,59,32768,10808,116,59,32768,8857,111,108,100,59,32768,10684,108,105,103,59,32768,339,512,99,114,13663,13668,105,114,59,32768,10687,59,32896,55349,56620,1600,13680,0,0,13684,0,13692,110,59,32768,731,97,118,101,33024,242,59,32768,242,59,32768,10689,512,98,109,13699,13704,97,114,59,32768,10677,59,32768,937,110,116,59,32768,8750,1024,97,99,105,116,13721,13726,13741,13746,114,114,59,32768,8634,512,105,114,13731,13735,114,59,32768,10686,111,115,115,59,32768,10683,110,101,59,32768,8254,59,32768,10688,768,97,101,105,13756,13761,13766,99,114,59,32768,333,103,97,59,32768,969,768,99,100,110,13773,13779,13782,114,111,110,59,32768,959,59,32768,10678,117,115,59,32768,8854,112,102,59,32896,55349,56672,768,97,101,108,13800,13804,13809,114,59,32768,10679,114,112,59,32768,10681,117,115,59,32768,8853,1792,59,97,100,105,111,115,118,13829,13831,13836,13869,13875,13879,13886,32768,8744,114,114,59,32768,8635,1024,59,101,102,109,13845,13847,13859,13864,32768,10845,114,512,59,111,13853,13855,32768,8500,102,59,32768,8500,33024,170,59,32768,170,33024,186,59,32768,186,103,111,102,59,32768,8886,114,59,32768,10838,108,111,112,101,59,32768,10839,59,32768,10843,768,99,108,111,13896,13900,13908,114,59,32768,8500,97,115,104,33024,248,59,32768,248,108,59,32768,8856,105,573,13917,13924,100,101,33024,245,59,32768,245,101,115,512,59,97,13930,13932,32768,8855,115,59,32768,10806,109,108,33024,246,59,32768,246,98,97,114,59,32768,9021,5426,13972,0,14013,0,14017,14053,0,14058,14086,0,0,14107,14199,0,14202,0,0,14229,14425,0,14438,114,1024,59,97,115,116,13981,13983,13997,14009,32768,8741,33280,182,59,108,13989,13991,32768,182,108,101,108,59,32768,8741,1082,14003,0,0,14007,109,59,32768,10995,59,32768,11005,59,32768,8706,121,59,32768,1087,114,1280,99,105,109,112,116,14028,14033,14038,14043,14046,110,116,59,32768,37,111,100,59,32768,46,105,108,59,32768,8240,59,32768,8869,101,110,107,59,32768,8241,114,59,32896,55349,56621,768,105,109,111,14064,14074,14080,512,59,118,14069,14071,32768,966,59,32768,981,109,97,116,59,32768,8499,110,101,59,32768,9742,768,59,116,118,14092,14094,14103,32768,960,99,104,102,111,114,107,59,32768,8916,59,32768,982,512,97,117,14111,14132,110,512,99,107,14117,14128,107,512,59,104,14123,14125,32768,8463,59,32768,8462,118,59,32768,8463,115,2304,59,97,98,99,100,101,109,115,116,14152,14154,14160,14163,14168,14179,14182,14188,14193,32768,43,99,105,114,59,32768,10787,59,32768,8862,105,114,59,32768,10786,512,111,117,14173,14176,59,32768,8724,59,32768,10789,59,32768,10866,110,33024,177,59,32768,177,105,109,59,32768,10790,119,111,59,32768,10791,59,32768,177,768,105,112,117,14208,14216,14221,110,116,105,110,116,59,32768,10773,102,59,32896,55349,56673,110,100,33024,163,59,32768,163,2560,59,69,97,99,101,105,110,111,115,117,14249,14251,14254,14258,14263,14336,14348,14367,14413,14418,32768,8826,59,32768,10931,112,59,32768,10935,117,101,59,32768,8828,512,59,99,14268,14270,32768,10927,1536,59,97,99,101,110,115,14283,14285,14293,14302,14306,14331,32768,8826,112,112,114,111,120,59,32768,10935,117,114,108,121,101,113,59,32768,8828,113,59,32768,10927,768,97,101,115,14313,14321,14326,112,112,114,111,120,59,32768,10937,113,113,59,32768,10933,105,109,59,32768,8936,105,109,59,32768,8830,109,101,512,59,115,14343,14345,32768,8242,59,32768,8473,768,69,97,115,14355,14358,14362,59,32768,10933,112,59,32768,10937,105,109,59,32768,8936,768,100,102,112,14374,14377,14402,59,32768,8719,768,97,108,115,14384,14390,14396,108,97,114,59,32768,9006,105,110,101,59,32768,8978,117,114,102,59,32768,8979,512,59,116,14407,14409,32768,8733,111,59,32768,8733,105,109,59,32768,8830,114,101,108,59,32768,8880,512,99,105,14429,14434,114,59,32896,55349,56517,59,32768,968,110,99,115,112,59,32768,8200,1536,102,105,111,112,115,117,14457,14462,14467,14473,14480,14486,114,59,32896,55349,56622,110,116,59,32768,10764,112,102,59,32896,55349,56674,114,105,109,101,59,32768,8279,99,114,59,32896,55349,56518,768,97,101,111,14493,14513,14526,116,512,101,105,14499,14508,114,110,105,111,110,115,59,32768,8461,110,116,59,32768,10774,115,116,512,59,101,14520,14522,32768,63,113,59,32768,8799,116,33024,34,59,32768,34,5376,65,66,72,97,98,99,100,101,102,104,105,108,109,110,111,112,114,115,116,117,120,14575,14597,14603,14608,14775,14829,14865,14901,14943,14966,15e3,15139,15159,15176,15182,15236,15261,15267,15309,15352,15360,768,97,114,116,14582,14587,14591,114,114,59,32768,8667,114,59,32768,8658,97,105,108,59,32768,10524,97,114,114,59,32768,10511,97,114,59,32768,10596,1792,99,100,101,110,113,114,116,14623,14637,14642,14650,14672,14679,14751,512,101,117,14628,14632,59,32896,8765,817,116,101,59,32768,341,105,99,59,32768,8730,109,112,116,121,118,59,32768,10675,103,1024,59,100,101,108,14660,14662,14665,14668,32768,10217,59,32768,10642,59,32768,10661,101,59,32768,10217,117,111,33024,187,59,32768,187,114,2816,59,97,98,99,102,104,108,112,115,116,119,14703,14705,14709,14720,14723,14727,14731,14735,14739,14744,14748,32768,8594,112,59,32768,10613,512,59,102,14714,14716,32768,8677,115,59,32768,10528,59,32768,10547,115,59,32768,10526,107,59,32768,8618,112,59,32768,8620,108,59,32768,10565,105,109,59,32768,10612,108,59,32768,8611,59,32768,8605,512,97,105,14756,14761,105,108,59,32768,10522,111,512,59,110,14767,14769,32768,8758,97,108,115,59,32768,8474,768,97,98,114,14782,14787,14792,114,114,59,32768,10509,114,107,59,32768,10099,512,97,107,14797,14809,99,512,101,107,14803,14806,59,32768,125,59,32768,93,512,101,115,14814,14817,59,32768,10636,108,512,100,117,14823,14826,59,32768,10638,59,32768,10640,1024,97,101,117,121,14838,14844,14858,14862,114,111,110,59,32768,345,512,100,105,14849,14854,105,108,59,32768,343,108,59,32768,8969,98,59,32768,125,59,32768,1088,1024,99,108,113,115,14874,14878,14885,14897,97,59,32768,10551,100,104,97,114,59,32768,10601,117,111,512,59,114,14892,14894,32768,8221,59,32768,8221,104,59,32768,8627,768,97,99,103,14908,14934,14938,108,1024,59,105,112,115,14918,14920,14925,14931,32768,8476,110,101,59,32768,8475,97,114,116,59,32768,8476,59,32768,8477,116,59,32768,9645,33024,174,59,32768,174,768,105,108,114,14950,14956,14962,115,104,116,59,32768,10621,111,111,114,59,32768,8971,59,32896,55349,56623,512,97,111,14971,14990,114,512,100,117,14977,14980,59,32768,8641,512,59,108,14985,14987,32768,8640,59,32768,10604,512,59,118,14995,14997,32768,961,59,32768,1009,768,103,110,115,15007,15123,15127,104,116,1536,97,104,108,114,115,116,15022,15039,15060,15086,15099,15111,114,114,111,119,512,59,116,15031,15033,32768,8594,97,105,108,59,32768,8611,97,114,112,111,111,110,512,100,117,15050,15056,111,119,110,59,32768,8641,112,59,32768,8640,101,102,116,512,97,104,15068,15076,114,114,111,119,115,59,32768,8644,97,114,112,111,111,110,115,59,32768,8652,105,103,104,116,97,114,114,111,119,115,59,32768,8649,113,117,105,103,97,114,114,111,119,59,32768,8605,104,114,101,101,116,105,109,101,115,59,32768,8908,103,59,32768,730,105,110,103,100,111,116,115,101,113,59,32768,8787,768,97,104,109,15146,15151,15156,114,114,59,32768,8644,97,114,59,32768,8652,59,32768,8207,111,117,115,116,512,59,97,15168,15170,32768,9137,99,104,101,59,32768,9137,109,105,100,59,32768,10990,1024,97,98,112,116,15191,15204,15209,15229,512,110,114,15196,15200,103,59,32768,10221,114,59,32768,8702,114,107,59,32768,10215,768,97,102,108,15216,15220,15224,114,59,32768,10630,59,32896,55349,56675,117,115,59,32768,10798,105,109,101,115,59,32768,10805,512,97,112,15241,15253,114,512,59,103,15247,15249,32768,41,116,59,32768,10644,111,108,105,110,116,59,32768,10770,97,114,114,59,32768,8649,1024,97,99,104,113,15276,15282,15287,15290,113,117,111,59,32768,8250,114,59,32896,55349,56519,59,32768,8625,512,98,117,15295,15298,59,32768,93,111,512,59,114,15304,15306,32768,8217,59,32768,8217,768,104,105,114,15316,15322,15328,114,101,101,59,32768,8908,109,101,115,59,32768,8906,105,1024,59,101,102,108,15338,15340,15343,15346,32768,9657,59,32768,8885,59,32768,9656,116,114,105,59,32768,10702,108,117,104,97,114,59,32768,10600,59,32768,8478,6706,15391,15398,15404,15499,15516,15592,0,15606,15660,0,0,15752,15758,0,15827,15863,15886,16e3,16006,16038,16086,0,16467,0,0,16506,99,117,116,101,59,32768,347,113,117,111,59,32768,8218,2560,59,69,97,99,101,105,110,112,115,121,15424,15426,15429,15441,15446,15458,15463,15482,15490,15495,32768,8827,59,32768,10932,833,15434,0,15437,59,32768,10936,111,110,59,32768,353,117,101,59,32768,8829,512,59,100,15451,15453,32768,10928,105,108,59,32768,351,114,99,59,32768,349,768,69,97,115,15470,15473,15477,59,32768,10934,112,59,32768,10938,105,109,59,32768,8937,111,108,105,110,116,59,32768,10771,105,109,59,32768,8831,59,32768,1089,111,116,768,59,98,101,15507,15509,15512,32768,8901,59,32768,8865,59,32768,10854,1792,65,97,99,109,115,116,120,15530,15535,15556,15562,15566,15572,15587,114,114,59,32768,8664,114,512,104,114,15541,15545,107,59,32768,10533,512,59,111,15550,15552,32768,8600,119,59,32768,8600,116,33024,167,59,32768,167,105,59,32768,59,119,97,114,59,32768,10537,109,512,105,110,15578,15584,110,117,115,59,32768,8726,59,32768,8726,116,59,32768,10038,114,512,59,111,15597,15600,32896,55349,56624,119,110,59,32768,8994,1024,97,99,111,121,15614,15619,15632,15654,114,112,59,32768,9839,512,104,121,15624,15629,99,121,59,32768,1097,59,32768,1096,114,116,1086,15640,0,0,15645,105,100,59,32768,8739,97,114,97,108,108,101,108,59,32768,8741,33024,173,59,32768,173,512,103,109,15664,15681,109,97,768,59,102,118,15673,15675,15678,32768,963,59,32768,962,59,32768,962,2048,59,100,101,103,108,110,112,114,15698,15700,15705,15715,15725,15735,15739,15745,32768,8764,111,116,59,32768,10858,512,59,113,15710,15712,32768,8771,59,32768,8771,512,59,69,15720,15722,32768,10910,59,32768,10912,512,59,69,15730,15732,32768,10909,59,32768,10911,101,59,32768,8774,108,117,115,59,32768,10788,97,114,114,59,32768,10610,97,114,114,59,32768,8592,1024,97,101,105,116,15766,15788,15796,15808,512,108,115,15771,15783,108,115,101,116,109,105,110,117,115,59,32768,8726,104,112,59,32768,10803,112,97,114,115,108,59,32768,10724,512,100,108,15801,15804,59,32768,8739,101,59,32768,8995,512,59,101,15813,15815,32768,10922,512,59,115,15820,15822,32768,10924,59,32896,10924,65024,768,102,108,112,15833,15839,15857,116,99,121,59,32768,1100,512,59,98,15844,15846,32768,47,512,59,97,15851,15853,32768,10692,114,59,32768,9023,102,59,32896,55349,56676,97,512,100,114,15868,15882,101,115,512,59,117,15875,15877,32768,9824,105,116,59,32768,9824,59,32768,8741,768,99,115,117,15892,15921,15977,512,97,117,15897,15909,112,512,59,115,15903,15905,32768,8851,59,32896,8851,65024,112,512,59,115,15915,15917,32768,8852,59,32896,8852,65024,117,512,98,112,15927,15952,768,59,101,115,15934,15936,15939,32768,8847,59,32768,8849,101,116,512,59,101,15946,15948,32768,8847,113,59,32768,8849,768,59,101,115,15959,15961,15964,32768,8848,59,32768,8850,101,116,512,59,101,15971,15973,32768,8848,113,59,32768,8850,768,59,97,102,15984,15986,15996,32768,9633,114,566,15991,15994,59,32768,9633,59,32768,9642,59,32768,9642,97,114,114,59,32768,8594,1024,99,101,109,116,16014,16019,16025,16031,114,59,32896,55349,56520,116,109,110,59,32768,8726,105,108,101,59,32768,8995,97,114,102,59,32768,8902,512,97,114,16042,16053,114,512,59,102,16048,16050,32768,9734,59,32768,9733,512,97,110,16058,16081,105,103,104,116,512,101,112,16067,16076,112,115,105,108,111,110,59,32768,1013,104,105,59,32768,981,115,59,32768,175,1280,98,99,109,110,112,16096,16221,16288,16291,16295,2304,59,69,100,101,109,110,112,114,115,16115,16117,16120,16125,16137,16143,16154,16160,16166,32768,8834,59,32768,10949,111,116,59,32768,10941,512,59,100,16130,16132,32768,8838,111,116,59,32768,10947,117,108,116,59,32768,10945,512,69,101,16148,16151,59,32768,10955,59,32768,8842,108,117,115,59,32768,10943,97,114,114,59,32768,10617,768,101,105,117,16173,16206,16210,116,768,59,101,110,16181,16183,16194,32768,8834,113,512,59,113,16189,16191,32768,8838,59,32768,10949,101,113,512,59,113,16201,16203,32768,8842,59,32768,10955,109,59,32768,10951,512,98,112,16215,16218,59,32768,10965,59,32768,10963,99,1536,59,97,99,101,110,115,16235,16237,16245,16254,16258,16283,32768,8827,112,112,114,111,120,59,32768,10936,117,114,108,121,101,113,59,32768,8829,113,59,32768,10928,768,97,101,115,16265,16273,16278,112,112,114,111,120,59,32768,10938,113,113,59,32768,10934,105,109,59,32768,8937,105,109,59,32768,8831,59,32768,8721,103,59,32768,9834,3328,49,50,51,59,69,100,101,104,108,109,110,112,115,16322,16327,16332,16337,16339,16342,16356,16368,16382,16388,16394,16405,16411,33024,185,59,32768,185,33024,178,59,32768,178,33024,179,59,32768,179,32768,8835,59,32768,10950,512,111,115,16347,16351,116,59,32768,10942,117,98,59,32768,10968,512,59,100,16361,16363,32768,8839,111,116,59,32768,10948,115,512,111,117,16374,16378,108,59,32768,10185,98,59,32768,10967,97,114,114,59,32768,10619,117,108,116,59,32768,10946,512,69,101,16399,16402,59,32768,10956,59,32768,8843,108,117,115,59,32768,10944,768,101,105,117,16418,16451,16455,116,768,59,101,110,16426,16428,16439,32768,8835,113,512,59,113,16434,16436,32768,8839,59,32768,10950,101,113,512,59,113,16446,16448,32768,8843,59,32768,10956,109,59,32768,10952,512,98,112,16460,16463,59,32768,10964,59,32768,10966,768,65,97,110,16473,16478,16499,114,114,59,32768,8665,114,512,104,114,16484,16488,107,59,32768,10534,512,59,111,16493,16495,32768,8601,119,59,32768,8601,119,97,114,59,32768,10538,108,105,103,33024,223,59,32768,223,5938,16538,16552,16557,16579,16584,16591,0,16596,16692,0,0,0,0,0,16731,16780,0,16787,16908,0,0,0,16938,1091,16543,0,0,16549,103,101,116,59,32768,8982,59,32768,964,114,107,59,32768,9140,768,97,101,121,16563,16569,16575,114,111,110,59,32768,357,100,105,108,59,32768,355,59,32768,1090,111,116,59,32768,8411,108,114,101,99,59,32768,8981,114,59,32896,55349,56625,1024,101,105,107,111,16604,16641,16670,16684,835,16609,0,16624,101,512,52,102,16614,16617,59,32768,8756,111,114,101,59,32768,8756,97,768,59,115,118,16631,16633,16638,32768,952,121,109,59,32768,977,59,32768,977,512,99,110,16646,16665,107,512,97,115,16652,16660,112,112,114,111,120,59,32768,8776,105,109,59,32768,8764,115,112,59,32768,8201,512,97,115,16675,16679,112,59,32768,8776,105,109,59,32768,8764,114,110,33024,254,59,32768,254,829,16696,16701,16727,100,101,59,32768,732,101,115,33536,215,59,98,100,16710,16712,16723,32768,215,512,59,97,16717,16719,32768,8864,114,59,32768,10801,59,32768,10800,116,59,32768,8749,768,101,112,115,16737,16741,16775,97,59,32768,10536,1024,59,98,99,102,16750,16752,16757,16762,32768,8868,111,116,59,32768,9014,105,114,59,32768,10993,512,59,111,16767,16770,32896,55349,56677,114,107,59,32768,10970,97,59,32768,10537,114,105,109,101,59,32768,8244,768,97,105,112,16793,16798,16899,100,101,59,32768,8482,1792,97,100,101,109,112,115,116,16813,16868,16873,16876,16883,16889,16893,110,103,108,101,1280,59,100,108,113,114,16828,16830,16836,16850,16853,32768,9653,111,119,110,59,32768,9663,101,102,116,512,59,101,16844,16846,32768,9667,113,59,32768,8884,59,32768,8796,105,103,104,116,512,59,101,16862,16864,32768,9657,113,59,32768,8885,111,116,59,32768,9708,59,32768,8796,105,110,117,115,59,32768,10810,108,117,115,59,32768,10809,98,59,32768,10701,105,109,101,59,32768,10811,101,122,105,117,109,59,32768,9186,768,99,104,116,16914,16926,16931,512,114,121,16919,16923,59,32896,55349,56521,59,32768,1094,99,121,59,32768,1115,114,111,107,59,32768,359,512,105,111,16942,16947,120,116,59,32768,8812,104,101,97,100,512,108,114,16956,16967,101,102,116,97,114,114,111,119,59,32768,8606,105,103,104,116,97,114,114,111,119,59,32768,8608,4608,65,72,97,98,99,100,102,103,104,108,109,111,112,114,115,116,117,119,17016,17021,17026,17043,17057,17072,17095,17110,17119,17139,17172,17187,17202,17290,17330,17336,17365,17381,114,114,59,32768,8657,97,114,59,32768,10595,512,99,114,17031,17039,117,116,101,33024,250,59,32768,250,114,59,32768,8593,114,820,17049,0,17053,121,59,32768,1118,118,101,59,32768,365,512,105,121,17062,17069,114,99,33024,251,59,32768,251,59,32768,1091,768,97,98,104,17079,17084,17090,114,114,59,32768,8645,108,97,99,59,32768,369,97,114,59,32768,10606,512,105,114,17100,17106,115,104,116,59,32768,10622,59,32896,55349,56626,114,97,118,101,33024,249,59,32768,249,562,17123,17135,114,512,108,114,17128,17131,59,32768,8639,59,32768,8638,108,107,59,32768,9600,512,99,116,17144,17167,1088,17150,0,0,17163,114,110,512,59,101,17156,17158,32768,8988,114,59,32768,8988,111,112,59,32768,8975,114,105,59,32768,9720,512,97,108,17177,17182,99,114,59,32768,363,33024,168,59,32768,168,512,103,112,17192,17197,111,110,59,32768,371,102,59,32896,55349,56678,1536,97,100,104,108,115,117,17215,17222,17233,17257,17262,17280,114,114,111,119,59,32768,8593,111,119,110,97,114,114,111,119,59,32768,8597,97,114,112,111,111,110,512,108,114,17244,17250,101,102,116,59,32768,8639,105,103,104,116,59,32768,8638,117,115,59,32768,8846,105,768,59,104,108,17270,17272,17275,32768,965,59,32768,978,111,110,59,32768,965,112,97,114,114,111,119,115,59,32768,8648,768,99,105,116,17297,17320,17325,1088,17303,0,0,17316,114,110,512,59,101,17309,17311,32768,8989,114,59,32768,8989,111,112,59,32768,8974,110,103,59,32768,367,114,105,59,32768,9721,99,114,59,32896,55349,56522,768,100,105,114,17343,17348,17354,111,116,59,32768,8944,108,100,101,59,32768,361,105,512,59,102,17360,17362,32768,9653,59,32768,9652,512,97,109,17370,17375,114,114,59,32768,8648,108,33024,252,59,32768,252,97,110,103,108,101,59,32768,10663,3840,65,66,68,97,99,100,101,102,108,110,111,112,114,115,122,17420,17425,17437,17443,17613,17617,17623,17667,17672,17678,17693,17699,17705,17711,17754,114,114,59,32768,8661,97,114,512,59,118,17432,17434,32768,10984,59,32768,10985,97,115,104,59,32768,8872,512,110,114,17448,17454,103,114,116,59,32768,10652,1792,101,107,110,112,114,115,116,17469,17478,17485,17494,17515,17526,17578,112,115,105,108,111,110,59,32768,1013,97,112,112,97,59,32768,1008,111,116,104,105,110,103,59,32768,8709,768,104,105,114,17501,17505,17508,105,59,32768,981,59,32768,982,111,112,116,111,59,32768,8733,512,59,104,17520,17522,32768,8597,111,59,32768,1009,512,105,117,17531,17537,103,109,97,59,32768,962,512,98,112,17542,17560,115,101,116,110,101,113,512,59,113,17553,17556,32896,8842,65024,59,32896,10955,65024,115,101,116,110,101,113,512,59,113,17571,17574,32896,8843,65024,59,32896,10956,65024,512,104,114,17583,17589,101,116,97,59,32768,977,105,97,110,103,108,101,512,108,114,17600,17606,101,102,116,59,32768,8882,105,103,104,116,59,32768,8883,121,59,32768,1074,97,115,104,59,32768,8866,768,101,108,114,17630,17648,17654,768,59,98,101,17637,17639,17644,32768,8744,97,114,59,32768,8891,113,59,32768,8794,108,105,112,59,32768,8942,512,98,116,17659,17664,97,114,59,32768,124,59,32768,124,114,59,32896,55349,56627,116,114,105,59,32768,8882,115,117,512,98,112,17685,17689,59,32896,8834,8402,59,32896,8835,8402,112,102,59,32896,55349,56679,114,111,112,59,32768,8733,116,114,105,59,32768,8883,512,99,117,17716,17721,114,59,32896,55349,56523,512,98,112,17726,17740,110,512,69,101,17732,17736,59,32896,10955,65024,59,32896,8842,65024,110,512,69,101,17746,17750,59,32896,10956,65024,59,32896,8843,65024,105,103,122,97,103,59,32768,10650,1792,99,101,102,111,112,114,115,17777,17783,17815,17820,17826,17829,17842,105,114,99,59,32768,373,512,100,105,17788,17809,512,98,103,17793,17798,97,114,59,32768,10847,101,512,59,113,17804,17806,32768,8743,59,32768,8793,101,114,112,59,32768,8472,114,59,32896,55349,56628,112,102,59,32896,55349,56680,59,32768,8472,512,59,101,17834,17836,32768,8768,97,116,104,59,32768,8768,99,114,59,32896,55349,56524,5428,17871,17891,0,17897,0,17902,17917,0,0,17920,17935,17940,17945,0,0,17977,17992,0,18008,18024,18029,768,97,105,117,17877,17881,17886,112,59,32768,8898,114,99,59,32768,9711,112,59,32768,8899,116,114,105,59,32768,9661,114,59,32896,55349,56629,512,65,97,17906,17911,114,114,59,32768,10234,114,114,59,32768,10231,59,32768,958,512,65,97,17924,17929,114,114,59,32768,10232,114,114,59,32768,10229,97,112,59,32768,10236,105,115,59,32768,8955,768,100,112,116,17951,17956,17970,111,116,59,32768,10752,512,102,108,17961,17965,59,32896,55349,56681,117,115,59,32768,10753,105,109,101,59,32768,10754,512,65,97,17981,17986,114,114,59,32768,10233,114,114,59,32768,10230,512,99,113,17996,18001,114,59,32896,55349,56525,99,117,112,59,32768,10758,512,112,116,18012,18018,108,117,115,59,32768,10756,114,105,59,32768,9651,101,101,59,32768,8897,101,100,103,101,59,32768,8896,2048,97,99,101,102,105,111,115,117,18052,18068,18081,18087,18092,18097,18103,18109,99,512,117,121,18058,18065,116,101,33024,253,59,32768,253,59,32768,1103,512,105,121,18073,18078,114,99,59,32768,375,59,32768,1099,110,33024,165,59,32768,165,114,59,32896,55349,56630,99,121,59,32768,1111,112,102,59,32896,55349,56682,99,114,59,32896,55349,56526,512,99,109,18114,18118,121,59,32768,1102,108,33024,255,59,32768,255,2560,97,99,100,101,102,104,105,111,115,119,18145,18152,18166,18171,18186,18191,18196,18204,18210,18216,99,117,116,101,59,32768,378,512,97,121,18157,18163,114,111,110,59,32768,382,59,32768,1079,111,116,59,32768,380,512,101,116,18176,18182,116,114,102,59,32768,8488,97,59,32768,950,114,59,32896,55349,56631,99,121,59,32768,1078,103,114,97,114,114,59,32768,8669,112,102,59,32896,55349,56683,99,114,59,32896,55349,56527,512,106,110,18221,18224,59,32768,8205,106,59,32768,8204])},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array([1024,97,103,108,113,9,23,27,31,1086,15,0,0,19,112,59,32768,38,111,115,59,32768,39,116,59,32768,62,116,59,32768,60,117,111,116,59,32768,34])},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),i=String.fromCodePoint||function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+=String.fromCharCode(e)};t.default=function(e){var t;return e>=55296&&e<=57343||e>1114111?"�":i(null!==(t=n.get(e))&&void 0!==t?t:e)}},function(e){e.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')},function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getTrie=t.encodeHTMLTrieRe=t.getCodePoint=void 0;var i=n(r(242));function o(e){return 55296==(64512&e)}t.getCodePoint=null!=String.prototype.codePointAt?function(e,t){return e.codePointAt(t)}:function(e,t){return o(e.charCodeAt(t))?1024*(e.charCodeAt(t)-55296)+e.charCodeAt(t+1)-56320+65536:e.charCodeAt(t)};var s=a(i.default);function a(e){for(var t,r,n,i,o=new Map,s=0,a=Object.keys(e);s4294967295||l(t)!==t)throw new a("`length` must be a positive 32-bit integer");var r=arguments.length>2&&!!arguments[2],n=!0,c=!0;if("length"in e&&s){var u=s(e,"length");u&&!u.configurable&&(n=!1),u&&!u.writable&&(c=!1)}return(n||c||!r)&&(o?i(e,"length",t,!0,!0):i(e,"length",t)),e}},function(e,t,r){"use strict";var n=Array.prototype.slice,i=r(249),o=Object.keys,s=o?function(e){return o(e)}:r(371),a=Object.keys;s.shim=function(){Object.keys?function(){var e=Object.keys(arguments);return e&&e.length===arguments.length}(1,2)||(Object.keys=function(e){return i(e)?a(n.call(e)):a(e)}):Object.keys=s;return Object.keys||s},e.exports=s},function(e,t,r){"use strict";var n;if(!Object.keys){var i=Object.prototype.hasOwnProperty,o=Object.prototype.toString,s=r(249),a=Object.prototype.propertyIsEnumerable,l=!a.call({toString:null},"toString"),c=a.call((function(){}),"prototype"),u=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],p=function(e){var t=e.constructor;return t&&t.prototype===e},f={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},h=function(){if("undefined"==typeof window)return!1;for(var e in window)try{if(!f["$"+e]&&i.call(window,e)&&null!==window[e]&&"object"==typeof window[e])try{p(window[e])}catch(e){return!0}}catch(e){return!0}return!1}();n=function(e){var t=null!==e&&"object"==typeof e,r="[object Function]"===o.call(e),n=s(e),a=t&&"[object String]"===o.call(e),f=[];if(!t&&!r&&!n)throw new TypeError("Object.keys called on a non-object");var d=c&&r;if(a&&e.length>0&&!i.call(e,0))for(var m=0;m0)for(var g=0;g1?arguments[1]:"[object Date]"===n.call(e)?String:Number)===String||t===Number){var r,s,a=t===String?["toString","valueOf"]:["valueOf","toString"];for(s=0;s1?s(e,arguments[1]):s(e)}},function(e,t,r){"use strict";var n,i,o,s,a=r(197),l=r(254)();if(l){n=a("Object.prototype.hasOwnProperty"),i=a("RegExp.prototype.exec"),o={};var c=function(){throw o};s={toString:c,valueOf:c},"symbol"==typeof Symbol.toPrimitive&&(s[Symbol.toPrimitive]=c)}var u=a("Object.prototype.toString"),p=Object.getOwnPropertyDescriptor;e.exports=l?function(e){if(!e||"object"!=typeof e)return!1;var t=p(e,"lastIndex");if(!(t&&n(t,"value")))return!1;try{i(e,s)}catch(e){return e===o}}:function(e){return!(!e||"object"!=typeof e&&"function"!=typeof e)&&"[object RegExp]"===u(e)}},function(e,t,r){"use strict";var n=r(255);e.exports=function(e){return("number"==typeof e||"bigint"==typeof e)&&!n(e)&&e!==1/0&&e!==-1/0}},function(e,t,r){"use strict";e.exports=function(e){return e>=0?1:-1}},function(e,t,r){"use strict";var n=r(168),i=r(169),o=n("%Number%"),s=n("%RegExp%"),a=n("%parseInt%"),l=r(197),c=r(253),u=r(385),p=l("String.prototype.slice"),f=c(/^0b[01]+$/i),h=c(/^0o[0-7]+$/i),d=c(/^[-+]0x[0-9a-f]+$/i),m=c(new s("["+["…","​","￾"].join("")+"]","g")),g=r(386),y=r(389);e.exports=function e(t){var r=u(t)?t:y(t,o);if("symbol"==typeof r)throw new i("Cannot convert a Symbol value to a number");if("string"==typeof r){if(f(r))return e(a(p(r,2),2));if(h(r))return e(a(p(r,2),8));if(m(r)||d(r))return NaN;var n=g(r);if(n!==r)return e(n)}return o(r)}},function(e,t,r){"use strict";e.exports=function(e){return null===e||"function"!=typeof e&&"object"!=typeof e}},function(e,t,r){"use strict";var n=r(215),i=r(202),o=r(218),s=r(256),a=r(257),l=r(388),c=n(a()),u=function(e){return o(e),c(e)};i(u,{getPolyfill:a,implementation:s,shim:l}),e.exports=u},function(e,t,r){"use strict";var n=r(168)("%String%"),i=r(169);e.exports=function(e){if("symbol"==typeof e)throw new i("Cannot convert a Symbol value to a string");return n(e)}},function(e,t,r){"use strict";var n=r(202),i=r(257);e.exports=function(){var e=i();return n(String.prototype,{trim:e},{trim:function(){return String.prototype.trim!==e}}),e}},function(e,t,r){"use strict";var n=r(390);e.exports=function(e){return arguments.length>1?n(e,arguments[1]):n(e)}},function(e,t,r){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator,i=r(251),o=r(252),s=r(391),a=r(392),l=function(e,t){if(null==e)throw new TypeError("Cannot call method on "+e);if("string"!=typeof t||"number"!==t&&"string"!==t)throw new TypeError('hint must be "string" or "number"');var r,n,s,a="string"===t?["toString","valueOf"]:["valueOf","toString"];for(s=0;s1&&(arguments[1]===String?r="string":arguments[1]===Number&&(r="number")),n&&(Symbol.toPrimitive?t=c(e,Symbol.toPrimitive):a(e)&&(t=Symbol.prototype.valueOf)),void 0!==t){var o=t.call(e,r);if(i(o))return o;throw new TypeError("unable to convert exotic object to primitive")}return"default"===r&&(s(e)||a(e))&&(r="string"),l(e,"default"===r?"number":r)}},function(e,t,r){"use strict";var n=Date.prototype.getDay,i=Object.prototype.toString,o=r(254)();e.exports=function(e){return"object"==typeof e&&null!==e&&(o?function(e){try{return n.call(e),!0}catch(e){return!1}}(e):"[object Date]"===i.call(e))}},function(e,t,r){"use strict";var n=Object.prototype.toString;if(r(244)()){var i=Symbol.prototype.toString,o=/^Symbol\(.*\)$/;e.exports=function(e){if("symbol"==typeof e)return!0;if("[object Symbol]"!==n.call(e))return!1;try{return function(e){return"symbol"==typeof e.valueOf()&&o.test(i.call(e))}(e)}catch(e){return!1}}}else e.exports=function(e){return!1}},function(e,t,r){"use strict"; +/*! https://mths.be/repeat v1.0.0 by @mathias */var n=r(202),i=r(258);e.exports=function(){var e=i();return String.prototype.repeat!==e&&n(String.prototype,{repeat:e}),e}},function(e,t,r){"use strict";r(259)},function(e,t,r){"use strict";r(260)},function(e,t,r){"use strict";r(261)},function(e,t,r){"use strict";r(262)},function(e,t,r){"use strict";r(263)},function(e,t,r){"use strict";r(264)},function(e,t,r){"use strict";r(265)},function(e,t,r){"use strict"; /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT - */var n=r(400),i=r(401),o=r(402);function s(){return l.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function d(e,t){if(l.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return F(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return I(e).length;default:if(n)return F(e).length;t=(""+t).toLowerCase(),n=!0}}function m(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return k(this,t,r);case"utf8":case"utf-8":return C(this,t,r);case"ascii":return O(this,t,r);case"latin1":case"binary":return T(this,t,r);case"base64":return E(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function g(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function y(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=l.from(t,n)),l.isBuffer(t))return 0===t.length?-1:b(e,t,r,n,i);if("number"==typeof t)return t&=255,l.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):b(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function b(e,t,r,n,i){var o,s=1,a=e.length,l=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,a/=2,l/=2,r/=2}function c(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var u=-1;for(o=r;oa&&(r=a-l),o=r;o>=0;o--){for(var p=!0,f=0;fi&&(n=i):n=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(t,e.length-r),e,r,n)}function E(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function C(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i239?4:c>223?3:c>191?2:1;if(i+p<=r)switch(p){case 1:c<128&&(u=c);break;case 2:128==(192&(o=e[i+1]))&&(l=(31&c)<<6|63&o)>127&&(u=l);break;case 3:o=e[i+1],s=e[i+2],128==(192&o)&&128==(192&s)&&(l=(15&c)<<12|(63&o)<<6|63&s)>2047&&(l<55296||l>57343)&&(u=l);break;case 4:o=e[i+1],s=e[i+2],a=e[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(l=(15&c)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&l<1114112&&(u=l)}null===u?(u=65533,p=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),i+=p}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var r="",n=0;for(;n0&&(e=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(e+=" ... ")),""},l.prototype.compare=function(e,t,r,n,i){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(t>>>=0),a=Math.min(o,s),c=this.slice(n,i),u=e.slice(t,r),p=0;pi)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return v(this,e,t,r);case"utf8":case"utf-8":return w(this,e,t,r);case"ascii":return _(this,e,t,r);case"latin1":case"binary":return x(this,e,t,r);case"base64":return A(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function O(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;in)&&(r=n);for(var i="",o=t;or)throw new RangeError("Trying to access beyond buffer length")}function j(e,t,r,n,i,o){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function R(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);i>>8*(n?i:1-i)}function D(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);i>>8*(n?i:3-i)&255}function N(e,t,r,n,i,o){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function B(e,t,r,n,o){return o||N(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function U(e,t,r,n,o){return o||N(e,0,r,8),i.write(e,t,r,n,52,8),r+8}l.prototype.slice=function(e,t){var r,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(i*=256);)n+=this[e+--t]*i;return n},l.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},l.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||P(e,t,this.length);for(var n=this[e],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*t)),n},l.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||P(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*t)),o},l.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),i.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),i.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),i.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),i.read(this,e,!1,52,8)},l.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||j(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[t]=255&e;++o=0&&(o*=256);)this[t+i]=e/o&255;return t+r},l.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,1,255,0),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},l.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):R(this,e,t,!0),t+2},l.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):R(this,e,t,!1),t+2},l.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):D(this,e,t,!0),t+4},l.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):D(this,e,t,!1),t+4},l.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);j(this,e,t,r,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++o>0)-a&255;return t+r},l.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);j(this,e,t,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},l.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,1,127,-128),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):R(this,e,t,!0),t+2},l.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):R(this,e,t,!1),t+2},l.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,2147483647,-2147483648),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):D(this,e,t,!0),t+4},l.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):D(this,e,t,!1),t+4},l.prototype.writeFloatLE=function(e,t,r){return B(this,e,t,!0,r)},l.prototype.writeFloatBE=function(e,t,r){return B(this,e,t,!1,r)},l.prototype.writeDoubleLE=function(e,t,r){return U(this,e,t,!0,r)},l.prototype.writeDoubleBE=function(e,t,r){return U(this,e,t,!1,r)},l.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--i)e[i+t]=this[i+r];else if(o<1e3||!l.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(o=t;o55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function I(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(q,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function H(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}},function(e,t,r){"use strict";t.byteLength=function(e){var t=c(e),r=t[0],n=t[1];return 3*(r+n)/4-n},t.toByteArray=function(e){var t,r,n=c(e),s=n[0],a=n[1],l=new o(function(e,t,r){return 3*(t+r)/4-r}(0,s,a)),u=0,p=a>0?s-4:s;for(r=0;r>16&255,l[u++]=t>>8&255,l[u++]=255&t;2===a&&(t=i[e.charCodeAt(r)]<<2|i[e.charCodeAt(r+1)]>>4,l[u++]=255&t);1===a&&(t=i[e.charCodeAt(r)]<<10|i[e.charCodeAt(r+1)]<<4|i[e.charCodeAt(r+2)]>>2,l[u++]=t>>8&255,l[u++]=255&t);return l},t.fromByteArray=function(e){for(var t,r=e.length,i=r%3,o=[],s=0,a=r-i;sa?a:s+16383));1===i?(t=e[r-1],o.push(n[t>>2]+n[t<<4&63]+"==")):2===i&&(t=(e[r-2]<<8)+e[r-1],o.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return o.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,l=s.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function u(e,t,r){for(var i,o,s=[],a=t;a>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]);return s.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(e,t){ + */var n=r(402),i=r(403),o=r(404);function s(){return l.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function d(e,t){if(l.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return F(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return I(e).length;default:if(n)return F(e).length;t=(""+t).toLowerCase(),n=!0}}function m(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return k(this,t,r);case"utf8":case"utf-8":return C(this,t,r);case"ascii":return O(this,t,r);case"latin1":case"binary":return T(this,t,r);case"base64":return E(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function g(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function y(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=l.from(t,n)),l.isBuffer(t))return 0===t.length?-1:b(e,t,r,n,i);if("number"==typeof t)return t&=255,l.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):b(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function b(e,t,r,n,i){var o,s=1,a=e.length,l=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,a/=2,l/=2,r/=2}function c(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var u=-1;for(o=r;oa&&(r=a-l),o=r;o>=0;o--){for(var p=!0,f=0;fi&&(n=i):n=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(t,e.length-r),e,r,n)}function E(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function C(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i239?4:c>223?3:c>191?2:1;if(i+p<=r)switch(p){case 1:c<128&&(u=c);break;case 2:128==(192&(o=e[i+1]))&&(l=(31&c)<<6|63&o)>127&&(u=l);break;case 3:o=e[i+1],s=e[i+2],128==(192&o)&&128==(192&s)&&(l=(15&c)<<12|(63&o)<<6|63&s)>2047&&(l<55296||l>57343)&&(u=l);break;case 4:o=e[i+1],s=e[i+2],a=e[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(l=(15&c)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&l<1114112&&(u=l)}null===u?(u=65533,p=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),i+=p}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var r="",n=0;for(;n0&&(e=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(e+=" ... ")),""},l.prototype.compare=function(e,t,r,n,i){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(t>>>=0),a=Math.min(o,s),c=this.slice(n,i),u=e.slice(t,r),p=0;pi)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return v(this,e,t,r);case"utf8":case"utf-8":return w(this,e,t,r);case"ascii":return _(this,e,t,r);case"latin1":case"binary":return x(this,e,t,r);case"base64":return A(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function O(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;in)&&(r=n);for(var i="",o=t;or)throw new RangeError("Trying to access beyond buffer length")}function j(e,t,r,n,i,o){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function R(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);i>>8*(n?i:1-i)}function D(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);i>>8*(n?i:3-i)&255}function N(e,t,r,n,i,o){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function B(e,t,r,n,o){return o||N(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function U(e,t,r,n,o){return o||N(e,0,r,8),i.write(e,t,r,n,52,8),r+8}l.prototype.slice=function(e,t){var r,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(i*=256);)n+=this[e+--t]*i;return n},l.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},l.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||P(e,t,this.length);for(var n=this[e],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*t)),n},l.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||P(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*t)),o},l.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),i.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),i.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),i.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),i.read(this,e,!1,52,8)},l.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||j(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[t]=255&e;++o=0&&(o*=256);)this[t+i]=e/o&255;return t+r},l.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,1,255,0),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},l.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):R(this,e,t,!0),t+2},l.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):R(this,e,t,!1),t+2},l.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):D(this,e,t,!0),t+4},l.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):D(this,e,t,!1),t+4},l.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);j(this,e,t,r,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++o>0)-a&255;return t+r},l.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);j(this,e,t,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},l.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,1,127,-128),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):R(this,e,t,!0),t+2},l.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):R(this,e,t,!1),t+2},l.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,2147483647,-2147483648),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):D(this,e,t,!0),t+4},l.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||j(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):D(this,e,t,!1),t+4},l.prototype.writeFloatLE=function(e,t,r){return B(this,e,t,!0,r)},l.prototype.writeFloatBE=function(e,t,r){return B(this,e,t,!1,r)},l.prototype.writeDoubleLE=function(e,t,r){return U(this,e,t,!0,r)},l.prototype.writeDoubleBE=function(e,t,r){return U(this,e,t,!1,r)},l.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--i)e[i+t]=this[i+r];else if(o<1e3||!l.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(o=t;o55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function I(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(q,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function H(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}},function(e,t,r){"use strict";t.byteLength=function(e){var t=c(e),r=t[0],n=t[1];return 3*(r+n)/4-n},t.toByteArray=function(e){var t,r,n=c(e),s=n[0],a=n[1],l=new o(function(e,t,r){return 3*(t+r)/4-r}(0,s,a)),u=0,p=a>0?s-4:s;for(r=0;r>16&255,l[u++]=t>>8&255,l[u++]=255&t;2===a&&(t=i[e.charCodeAt(r)]<<2|i[e.charCodeAt(r+1)]>>4,l[u++]=255&t);1===a&&(t=i[e.charCodeAt(r)]<<10|i[e.charCodeAt(r+1)]<<4|i[e.charCodeAt(r+2)]>>2,l[u++]=t>>8&255,l[u++]=255&t);return l},t.fromByteArray=function(e){for(var t,r=e.length,i=r%3,o=[],s=0,a=r-i;sa?a:s+16383));1===i?(t=e[r-1],o.push(n[t>>2]+n[t<<4&63]+"==")):2===i&&(t=(e[r-2]<<8)+e[r-1],o.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return o.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,l=s.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function u(e,t,r){for(var i,o,s=[],a=t;a>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]);return s.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(e,t){ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ -t.read=function(e,t,r,n,i){var o,s,a=8*i-n-1,l=(1<>1,u=-7,p=r?i-1:0,f=r?-1:1,h=e[t+p];for(p+=f,o=h&(1<<-u)-1,h>>=-u,u+=a;u>0;o=256*o+e[t+p],p+=f,u-=8);for(s=o&(1<<-u)-1,o>>=-u,u+=n;u>0;s=256*s+e[t+p],p+=f,u-=8);if(0===o)o=1-c;else{if(o===l)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,n),o-=c}return(h?-1:1)*s*Math.pow(2,o-n)},t.write=function(e,t,r,n,i,o){var s,a,l,c=8*o-i-1,u=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=n?0:o-1,d=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=u):(s=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-s))<1&&(s--,l*=2),(t+=s+p>=1?f/l:f*Math.pow(2,1-p))*l>=2&&(s++,l/=2),s+p>=u?(a=0,s=u):s+p>=1?(a=(t*l-1)*Math.pow(2,i),s+=p):(a=t*Math.pow(2,p-1)*Math.pow(2,i),s=0));i>=8;e[r+h]=255&a,h+=d,a/=256,i-=8);for(s=s<0;e[r+h]=255&s,h+=d,s/=256,c-=8);e[r+h-d]|=128*m}},function(e,t){var r={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},function(e,t,r){"use strict";r(267)},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";r.r(t);function n(e){switch(e._type){case"document":case"block_quote":case"list":case"item":case"paragraph":case"heading":case"emph":case"strong":case"link":case"image":case"custom_inline":case"custom_block":return!0;default:return!1}}var i=function(e,t){this.current=e,this.entering=!0===t},o=function(){var e=this.current,t=this.entering;if(null===e)return null;var r=n(e);return t&&r?e._firstChild?(this.current=e._firstChild,this.entering=!0):this.entering=!1:e===this.root?this.current=null:null===e._next?(this.current=e._parent,this.entering=!1):(this.current=e._next,this.entering=!0),{entering:t,node:e}},s=function(e){return{current:e,root:e,entering:!0,next:o,resumeAt:i}},a=function(e,t){this._type=e,this._parent=null,this._firstChild=null,this._lastChild=null,this._prev=null,this._next=null,this._sourcepos=t,this._open=!0,this._string_content=null,this._literal=null,this._listData={},this._info=null,this._destination=null,this._title=null,this._isFenced=!1,this._fenceChar=null,this._fenceLength=0,this._fenceOffset=null,this._level=null,this._onEnter=null,this._onExit=null},l=a.prototype;Object.defineProperty(l,"isContainer",{get:function(){return n(this)}}),Object.defineProperty(l,"type",{get:function(){return this._type}}),Object.defineProperty(l,"firstChild",{get:function(){return this._firstChild}}),Object.defineProperty(l,"lastChild",{get:function(){return this._lastChild}}),Object.defineProperty(l,"next",{get:function(){return this._next}}),Object.defineProperty(l,"prev",{get:function(){return this._prev}}),Object.defineProperty(l,"parent",{get:function(){return this._parent}}),Object.defineProperty(l,"sourcepos",{get:function(){return this._sourcepos}}),Object.defineProperty(l,"literal",{get:function(){return this._literal},set:function(e){this._literal=e}}),Object.defineProperty(l,"destination",{get:function(){return this._destination},set:function(e){this._destination=e}}),Object.defineProperty(l,"title",{get:function(){return this._title},set:function(e){this._title=e}}),Object.defineProperty(l,"info",{get:function(){return this._info},set:function(e){this._info=e}}),Object.defineProperty(l,"level",{get:function(){return this._level},set:function(e){this._level=e}}),Object.defineProperty(l,"listType",{get:function(){return this._listData.type},set:function(e){this._listData.type=e}}),Object.defineProperty(l,"listTight",{get:function(){return this._listData.tight},set:function(e){this._listData.tight=e}}),Object.defineProperty(l,"listStart",{get:function(){return this._listData.start},set:function(e){this._listData.start=e}}),Object.defineProperty(l,"listDelimiter",{get:function(){return this._listData.delimiter},set:function(e){this._listData.delimiter=e}}),Object.defineProperty(l,"onEnter",{get:function(){return this._onEnter},set:function(e){this._onEnter=e}}),Object.defineProperty(l,"onExit",{get:function(){return this._onExit},set:function(e){this._onExit=e}}),a.prototype.appendChild=function(e){e.unlink(),e._parent=this,this._lastChild?(this._lastChild._next=e,e._prev=this._lastChild,this._lastChild=e):(this._firstChild=e,this._lastChild=e)},a.prototype.prependChild=function(e){e.unlink(),e._parent=this,this._firstChild?(this._firstChild._prev=e,e._next=this._firstChild,this._firstChild=e):(this._firstChild=e,this._lastChild=e)},a.prototype.unlink=function(){this._prev?this._prev._next=this._next:this._parent&&(this._parent._firstChild=this._next),this._next?this._next._prev=this._prev:this._parent&&(this._parent._lastChild=this._prev),this._parent=null,this._next=null,this._prev=null},a.prototype.insertAfter=function(e){e.unlink(),e._next=this._next,e._next&&(e._next._prev=e),e._prev=this,this._next=e,e._parent=this._parent,e._next||(e._parent._lastChild=e)},a.prototype.insertBefore=function(e){e.unlink(),e._prev=this._prev,e._prev&&(e._prev._next=e),e._next=this,this._prev=e,e._parent=this._parent,e._prev||(e._parent._firstChild=e)},a.prototype.walker=function(){return new s(this)};var c,u=a,p=r(351),f=r.n(p),h=r(238),d="&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});",m="<[A-Za-z][A-Za-z0-9-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*/?>",g="]",y=new RegExp("^(?:<[A-Za-z][A-Za-z0-9-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*/?>|]|\x3c!--\x3e|\x3c!---\x3e|\x3c!--(?:[^-]|-[^-]|--[^>])*--\x3e|[<][?][\\s\\S]*?[?][>]|]*>|)"),b=/[\\&]/,v="[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]",w=new RegExp("\\\\"+v+"|"+d,"gi"),_=new RegExp('[&<>"]',"g"),x=function(e){return 92===e.charCodeAt(0)?e.charAt(1):Object(h.decodeHTMLStrict)(e)},A=function(e){return b.test(e)?e.replace(w,x):e},S=function(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";default:return e}},E=function(e){return _.test(e)?e.replace(_,S):e};function C(e){return c(e)}if(String.fromCodePoint)c=function(e){try{return String.fromCodePoint(e)}catch(e){if(e instanceof RangeError)return String.fromCharCode(65533);throw e}};else{var O=String.fromCharCode,T=Math.floor;c=function(){var e,t,r=16384,n=[],i=-1,o=arguments.length;if(!o)return"";for(var s="";++i1114111||T(a)!==a)return String.fromCharCode(65533);a<=65535?n.push(a):(e=55296+((a-=65536)>>10),t=a%1024+56320,n.push(e,t)),(i+1===o||n.length>r)&&(s+=O.apply(null,n),n.length=0)}return s}}r(357);var k=function(e){try{return f()(e)}catch(t){return e}},L=A,P="\\\\[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]",j=y,R=new RegExp(/^[!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~\p{P}\p{S}]/u),D=new RegExp('^(?:"('+P+'|\\\\[^\\\\]|[^\\\\"\\x00])*"|\'('+P+"|\\\\[^\\\\]|[^\\\\'\\x00])*'|\\(("+P+"|\\\\[^\\\\]|[^\\\\()\\x00])*\\))"),N=/^(?:<(?:[^<>\n\\\x00]|\\.)*>)/,B=new RegExp("^[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]"),U=new RegExp("^&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});","i"),q=/`+/,M=/^`+/,F=/\.\.\./g,I=/--+/g,H=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,z=/^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]*>/i,$=/^ *(?:\n *)?/,V=/^[ \t\n\x0b\x0c\x0d]/,G=/^\s/,J=/ *$/,Y=/^ */,Z=/^ *(?:\n|$)/,K=/^\[(?:[^\\\[\]]|\\.){0,1000}\]/s,W=/^[^\n`\[\]\\!<&*_'"]+/m,X=function(e){var t=new u("text");return t._literal=e,t},Q=function(e){return e.slice(1,e.length-1).trim().replace(/[ \t\r\n]+/g," ").toLowerCase().toUpperCase()},ee=function(e){var t=e.exec(this.subject.slice(this.pos));return null===t?null:(this.pos+=t.index+t[0].length,t[0])},te=function(){return this.pos0&&null!==i.match(/[^ ]/)&&" "==i[0]&&" "==i[i.length-1]?n._literal=i.slice(1,i.length-1):n._literal=i,e.appendChild(n),!0;return this.pos=o,e.appendChild(X(t)),!0},ie=function(e){var t,r=this.subject;return this.pos+=1,10===this.peek()?(this.pos+=1,t=new u("linebreak"),e.appendChild(t)):B.test(r.charAt(this.pos))?(e.appendChild(X(r.charAt(this.pos))),this.pos+=1):e.appendChild(X("\\")),!0},oe=function(e){var t,r,n;return(t=this.match(H))?(r=t.slice(1,t.length-1),(n=new u("link"))._destination=k("mailto:"+r),n._title="",n.appendChild(X(r)),e.appendChild(n),!0):!!(t=this.match(z))&&(r=t.slice(1,t.length-1),(n=new u("link"))._destination=k(r),n._title="",n.appendChild(X(r)),e.appendChild(n),!0)},se=function(e){var t=this.match(j);if(null===t)return!1;var r=new u("html_inline");return r._literal=t,e.appendChild(r),!0},ae=function(e){var t,r,n,i,o,s,a,l,c,u,p,f=0,h=this.pos;if(39===e||34===e)f++,this.pos++;else for(;this.peek()===e;)f++,this.pos++;return 0===f?null:(t=0===h?"\n":this.subject.charAt(h-1),r=-1===(n=this.peek())?"\n":C(n),l=G.test(r),c=R.test(r),u=G.test(t),p=R.test(t),i=!l&&(!c||u||p),o=!u&&(!p||l||c),95===e?(s=i&&(!o||p),a=o&&(!i||c)):39===e||34===e?(s=i&&!o,a=o):(s=i,a=o),this.pos=h,{numdelims:f,can_open:s,can_close:a})},le=function(e,t){var r=this.scanDelims(e);if(!r)return!1;var n,i=r.numdelims,o=this.pos;this.pos+=i,n=39===e?"’":34===e?"“":this.subject.slice(o,this.pos);var s=X(n);return t.appendChild(s),(r.can_open||r.can_close)&&(this.options.smart||39!==e&&34!==e)&&(this.delimiters={cc:e,numdelims:i,origdelims:i,node:s,previous:this.delimiters,next:null,can_open:r.can_open,can_close:r.can_close},null!==this.delimiters.previous&&(this.delimiters.previous.next=this.delimiters)),!0},ce=function(e){null!==e.previous&&(e.previous.next=e.next),null===e.next?this.delimiters=e.previous:e.next.previous=e.previous},ue=function(e){for(var t,r,n,i,o,s,a,l,c,p,f,h,d,m=[],g=!1,y=0;y<14;y++)m[y]=e;for(r=this.delimiters;null!==r&&r.previous!==e;)r=r.previous;for(;null!==r;){var b=r.cc;if(r.can_close){switch(t=r.previous,p=!1,b){case 39:f=0;break;case 34:f=1;break;case 95:f=2+(r.can_open?3:0)+r.origdelims%3;break;case 42:f=8+(r.can_open?3:0)+r.origdelims%3}for(;null!==t&&t!==e&&t!==m[f];){if(g=(r.can_open||t.can_close)&&r.origdelims%3!=0&&(t.origdelims+r.origdelims)%3==0,t.cc===r.cc&&t.can_open&&!g){p=!0;break}t=t.previous}if(n=r,42===b||95===b)if(p){a=r.numdelims>=2&&t.numdelims>=2?2:1,i=t.node,o=r.node,t.numdelims-=a,r.numdelims-=a,i._literal=i._literal.slice(0,i._literal.length-a),o._literal=o._literal.slice(0,o._literal.length-a);var v=new u(1===a?"emph":"strong");for(l=i._next;l&&l!==o;)c=l._next,l.unlink(),v.appendChild(l),l=c;i.insertAfter(v),d=r,(h=t).next!==d&&(h.next=d,d.previous=h),0===t.numdelims&&(i.unlink(),this.removeDelimiter(t)),0===r.numdelims&&(o.unlink(),s=r.next,this.removeDelimiter(r),r=s)}else r=r.next;else 39===b?(r.node._literal="’",p&&(t.node._literal="‘"),r=r.next):34===b&&(r.node._literal="”",p&&(t.node.literal="“"),r=r.next);p||(m[f]=n.previous,n.can_open||this.removeDelimiter(n))}else r=r.next}for(;null!==this.delimiters&&this.delimiters!==e;)this.removeDelimiter(this.delimiters)},pe=function(){var e=this.match(D);return null===e?null:L(e.slice(1,-1))},fe=function(){var e=this.match(N);if(null===e){if(60===this.peek())return null;for(var t,r=this.pos,n=0;-1!==(t=this.peek());)if(92===t&&B.test(this.subject.charAt(this.pos+1)))this.pos+=1,-1!==this.peek()&&(this.pos+=1);else if(40===t)this.pos+=1,n+=1;else if(41===t){if(n<1)break;this.pos+=1,n-=1}else{if(null!==V.exec(C(t)))break;this.pos+=1}return this.pos===r&&41!==t||0!==n?null:(e=this.subject.slice(r,this.pos),k(L(e)))}return k(L(e.slice(1,-1)))},he=function(){var e=this.match(K);return null===e||e.length>1001?0:e.length},de=function(e){var t=this.pos;this.pos+=1;var r=X("[");return e.appendChild(r),this.addBracket(r,t,!1),!0},me=function(e){var t=this.pos;if(this.pos+=1,91===this.peek()){this.pos+=1;var r=X("![");e.appendChild(r),this.addBracket(r,t+1,!0)}else e.appendChild(X("!"));return!0},ge=function(e){var t,r,n,i,o,s,a=!1;if(this.pos+=1,t=this.pos,null===(s=this.brackets))return e.appendChild(X("]")),!0;if(!s.active)return e.appendChild(X("]")),this.removeBracket(),!0;r=s.image;var l=this.pos;if(40===this.peek()&&(this.pos++,this.spnl()&&null!==(n=this.parseLinkDestination())&&this.spnl()&&(V.test(this.subject.charAt(this.pos-1))&&(i=this.parseLinkTitle()),1)&&this.spnl()&&41===this.peek()?(this.pos+=1,a=!0):this.pos=l),!a){var c=this.pos,p=this.parseLinkLabel();if(p>2?o=this.subject.slice(c,c+p):s.bracketAfter||(o=this.subject.slice(s.index,t)),0===p&&(this.pos=l),o){var f=this.refmap[Q(o)];f&&(n=f.destination,i=f.title,a=!0)}}if(a){var h,d,m=new u(r?"image":"link");for(m._destination=n,m._title=i||"",h=s.node._next;h;)d=h._next,h.unlink(),m.appendChild(h),h=d;if(e.appendChild(m),this.processEmphasis(s.previousDelimiter),this.removeBracket(),s.node.unlink(),!r)for(s=this.brackets;null!==s;)s.image||(s.active=!1),s=s.previous;return!0}return this.removeBracket(),this.pos=t,e.appendChild(X("]")),!0},ye=function(e,t,r){null!==this.brackets&&(this.brackets.bracketAfter=!0),this.brackets={node:e,previous:this.brackets,previousDelimiter:this.delimiters,index:t,image:r,active:!0}},be=function(){this.brackets=this.brackets.previous},ve=function(e){var t;return!!(t=this.match(U))&&(e.appendChild(X(Object(h.decodeHTMLStrict)(t))),!0)},we=function(e){var t;return!!(t=this.match(W))&&(this.options.smart?e.appendChild(X(t.replace(F,"…").replace(I,(function(e){var t=0,r=0;return e.length%3==0?r=e.length/3:e.length%2==0?t=e.length/2:e.length%3==2?(t=1,r=(e.length-2)/3):(t=2,r=(e.length-4)/3),"—".repeat(r)+"–".repeat(t)})))):e.appendChild(X(t)),!0)},_e=function(e){this.pos+=1;var t=e._lastChild;if(t&&"text"===t.type&&" "===t._literal[t._literal.length-1]){var r=" "===t._literal[t._literal.length-2];t._literal=t._literal.replace(J,""),e.appendChild(new u(r?"linebreak":"softbreak"))}else e.appendChild(new u("softbreak"));return this.match(Y),!0},xe=function(e,t){var r,n,i,o;this.subject=e,this.pos=0;var s=this.pos;if(0===(o=this.parseLinkLabel()))return 0;if(r=this.subject.slice(0,o),58!==this.peek())return this.pos=s,0;if(this.pos++,this.spnl(),null===(n=this.parseLinkDestination()))return this.pos=s,0;var a=this.pos;this.spnl(),this.pos!==a&&(i=this.parseLinkTitle()),null===i&&(i="",this.pos=a);var l=!0;if(null===this.match(Z)&&(""===i?l=!1:(i="",this.pos=a,l=null!==this.match(Z))),!l)return this.pos=s,0;var c=Q(r);return""===c?(this.pos=s,0):(t[c]||(t[c]={destination:n,title:i}),this.pos-s)},Ae=function(e){var t=!1,r=this.peek();if(-1===r)return!1;switch(r){case 10:t=this.parseNewline(e);break;case 92:t=this.parseBackslash(e);break;case 96:t=this.parseBackticks(e);break;case 42:case 95:t=this.handleDelim(r,e);break;case 39:case 34:t=this.options.smart&&this.handleDelim(r,e);break;case 91:t=this.parseOpenBracket(e);break;case 33:t=this.parseBang(e);break;case 93:t=this.parseCloseBracket(e);break;case 60:t=this.parseAutolink(e)||this.parseHtmlTag(e);break;case 38:t=this.parseEntity(e);break;default:t=this.parseString(e)}return t||(this.pos+=1,e.appendChild(X(C(r)))),!0},Se=function(e){for(this.subject=e._string_content.trim(),this.pos=0,this.delimiters=null,this.brackets=null;this.parseInline(e););e._string_content=null,this.processEmphasis(null)};var Ee=function(e){return{subject:"",delimiters:null,brackets:null,pos:0,refmap:{},match:ee,peek:te,spnl:re,parseBackticks:ne,parseBackslash:ie,parseAutolink:oe,parseHtmlTag:se,scanDelims:ae,handleDelim:le,parseLinkTitle:pe,parseLinkDestination:fe,parseLinkLabel:he,parseOpenBracket:de,parseBang:me,parseCloseBracket:ge,addBracket:ye,removeBracket:be,parseEntity:ve,parseString:we,parseNewline:_e,parseReference:xe,parseInline:Ae,processEmphasis:ue,removeDelimiter:ce,options:e||{},parse:Se}},Ce=[/./,/^<(?:script|pre|textarea|style)(?:\s|>|$)/i,/^/,/\?>/,/>/,/\]\]>/],Te=/^(?:\*[ \t]*){3,}$|^(?:_[ \t]*){3,}$|^(?:-[ \t]*){3,}$/,ke=/^[#`~*+_=<>0-9-]/,Le=/[^ \t\f\v\r\n]/,Pe=/^[*+-]/,je=/^(\d{1,9})([.)])/,Re=/^#{1,6}(?:[ \t]+|$)/,De=/^`{3,}(?!.*`)|^~{3,}/,Ne=/^(?:`{3,}|~{3,})(?=[ \t]*$)/,Be=/^(?:=+|-+)[ \t]*$/,Ue=/\r\n|\n|\r/,qe=function(e){return 32===e||9===e},Me=function(e,t){return t=t._listData.markerOffset+t._listData.padding))return 1;e.advanceOffset(t._listData.markerOffset+t._listData.padding,!0)}return 0},finalize:function(e,t){t._lastChild?t.sourcepos[1]=t._lastChild.sourcepos[1]:(t.sourcepos[1][0]=t.sourcepos[0][0],t.sourcepos[1][1]=t._listData.markerOffset+t._listData.padding)},canContain:function(e){return"item"!==e},acceptsLines:!1},heading:{continue:function(){return 1},finalize:function(){},canContain:function(){return!1},acceptsLines:!1},thematic_break:{continue:function(){return 1},finalize:function(){},canContain:function(){return!1},acceptsLines:!1},code_block:{continue:function(e,t){var r=e.currentLine,n=e.indent;if(t._isFenced){var i=n<=3&&r.charAt(e.nextNonspace)===t._fenceChar&&r.slice(e.nextNonspace).match(Ne);if(i&&i[0].length>=t._fenceLength)return e.lastLineLength=e.offset+n+i[0].length,e.finalize(t,e.lineNumber),2;for(var o=t._fenceOffset;o>0&&qe(Me(r,e.offset));)e.advanceOffset(1,!0),o--}else if(n>=4)e.advanceOffset(4,!0);else{if(!e.blank)return 1;e.advanceNextNonspace()}return 0},finalize:function(e,t){if(t._isFenced){var r=t._string_content,n=r.indexOf("\n"),i=r.slice(0,n),o=r.slice(n+1);t.info=A(i.trim()),t._literal=o}else{for(var s=t._string_content.split("\n");/^[ \t]*$/.test(s[s.length-1]);)s.pop();t._literal=s.join("\n")+"\n",t.sourcepos[1][0]=t.sourcepos[0][0]+s.length-1,t.sourcepos[1][1]=t.sourcepos[0][1]+s[s.length-1].length-1}t._string_content=null},canContain:function(){return!1},acceptsLines:!0},html_block:{continue:function(e,t){return!e.blank||6!==t._htmlBlockType&&7!==t._htmlBlockType?0:1},finalize:function(e,t){t._literal=t._string_content.replace(/\n$/,""),t._string_content=null},canContain:function(){return!1},acceptsLines:!0},paragraph:{continue:function(e){return e.blank?1:0},finalize:function(){},canContain:function(){return!1},acceptsLines:!0}},Ve=[function(e){return e.indented||62!==Me(e.currentLine,e.nextNonspace)?0:(e.advanceNextNonspace(),e.advanceOffset(1,!1),qe(Me(e.currentLine,e.offset))&&e.advanceOffset(1,!0),e.closeUnmatchedBlocks(),e.addChild("block_quote",e.nextNonspace),1)},function(e){var t;if(!e.indented&&(t=e.currentLine.slice(e.nextNonspace).match(Re))){e.advanceNextNonspace(),e.advanceOffset(t[0].length,!1),e.closeUnmatchedBlocks();var r=e.addChild("heading",e.nextNonspace);return r.level=t[0].trim().length,r._string_content=e.currentLine.slice(e.offset).replace(/^[ \t]*#+[ \t]*$/,"").replace(/[ \t]+#+[ \t]*$/,""),e.advanceOffset(e.currentLine.length-e.offset),2}return 0},function(e){var t;if(!e.indented&&(t=e.currentLine.slice(e.nextNonspace).match(De))){var r=t[0].length;e.closeUnmatchedBlocks();var n=e.addChild("code_block",e.nextNonspace);return n._isFenced=!0,n._fenceLength=r,n._fenceChar=t[0][0],n._fenceOffset=e.indent,e.advanceNextNonspace(),e.advanceOffset(r,!1),2}return 0},function(e,t){if(!e.indented&&60===Me(e.currentLine,e.nextNonspace)){var r,n=e.currentLine.slice(e.nextNonspace);for(r=1;r<=7;r++){if(Ce[r].test(n)&&(r<7||"paragraph"!==t.type&&(e.allClosed||e.blank||"paragraph"!==e.tip.type)))return e.closeUnmatchedBlocks(),e.addChild("html_block",e.offset)._htmlBlockType=r,2}}return 0},function(e,t){var r;if(!e.indented&&"paragraph"===t.type&&(r=e.currentLine.slice(e.nextNonspace).match(Be))){var n;for(e.closeUnmatchedBlocks();91===Me(t._string_content,0)&&(n=e.inlineParser.parseReference(t._string_content,e.refmap));)t._string_content=t._string_content.slice(n);if(t._string_content.length>0){var i=new u("heading",t.sourcepos);return i.level="="===r[0][0]?1:2,i._string_content=t._string_content,t.insertAfter(i),t.unlink(),e.tip=i,e.advanceOffset(e.currentLine.length-e.offset,!1),2}return 0}return 0},function(e){return!e.indented&&Te.test(e.currentLine.slice(e.nextNonspace))?(e.closeUnmatchedBlocks(),e.addChild("thematic_break",e.nextNonspace),e.advanceOffset(e.currentLine.length-e.offset,!1),2):0},function(e,t){var r,n,i;return e.indented&&"list"!==t.type||!(r=function(e,t){var r,n,i,o,s=e.currentLine.slice(e.nextNonspace),a={type:null,tight:!0,bulletChar:null,start:null,delimiter:null,padding:null,markerOffset:e.indent};if(e.indent>=4)return null;if(r=s.match(Pe))a.type="bullet",a.bulletChar=r[0][0];else{if(!(r=s.match(je))||"paragraph"===t.type&&1!=r[1])return null;a.type="ordered",a.start=parseInt(r[1]),a.delimiter=r[2]}if(-1!==(n=Me(e.currentLine,e.nextNonspace+r[0].length))&&9!==n&&32!==n)return null;if("paragraph"===t.type&&!e.currentLine.slice(e.nextNonspace+r[0].length).match(Le))return null;e.advanceNextNonspace(),e.advanceOffset(r[0].length,!0),i=e.column,o=e.offset;do{e.advanceOffset(1,!0),n=Me(e.currentLine,e.offset)}while(e.column-i<5&&qe(n));var l=-1===Me(e.currentLine,e.offset),c=e.column-i;return c>=5||c<1||l?(a.padding=r[0].length+1,e.column=i,e.offset=o,qe(Me(e.currentLine,e.offset))&&e.advanceOffset(1,!0)):a.padding=r[0].length+c,a}(e,t))?0:(e.closeUnmatchedBlocks(),"list"===e.tip.type&&(n=t._listData,i=r,n.type===i.type&&n.delimiter===i.delimiter&&n.bulletChar===i.bulletChar)||((t=e.addChild("list",e.nextNonspace))._listData=r),(t=e.addChild("item",e.nextNonspace))._listData=r,1)},function(e){return e.indented&&"paragraph"!==e.tip.type&&!e.blank?(e.advanceOffset(4,!0),e.closeUnmatchedBlocks(),e.addChild("code_block",e.offset),2):0}],Ge=function(e,t){for(var r,n,i,o=this.currentLine;e>0&&(i=o[this.offset]);)"\t"===i?(r=4-this.column%4,t?(this.partiallyConsumedTab=r>e,n=r>e?e:r,this.column+=n,this.offset+=this.partiallyConsumedTab?0:1,e-=n):(this.partiallyConsumedTab=!1,this.column+=r,this.offset+=1,e-=1)):(this.partiallyConsumedTab=!1,this.offset+=1,this.column+=1,e-=1)},Je=function(){this.offset=this.nextNonspace,this.column=this.nextNonspaceColumn,this.partiallyConsumedTab=!1},Ye=function(){for(var e,t=this.currentLine,r=this.offset,n=this.column;""!==(e=t.charAt(r));)if(" "===e)r++,n++;else{if("\t"!==e)break;r++,n+=4-n%4}this.blank="\n"===e||"\r"===e||""===e,this.nextNonspace=r,this.nextNonspaceColumn=n,this.indent=this.nextNonspaceColumn-this.column,this.indented=this.indent>=4},Ze=function(e){var t,r,n=!0,i=this.doc;for(this.oldtip=this.tip,this.offset=0,this.column=0,this.blank=!1,this.partiallyConsumedTab=!1,this.lineNumber+=1,-1!==e.indexOf("\0")&&(e=e.replace(/\0/g,"�")),this.currentLine=e;(r=i._lastChild)&&r._open;){switch(i=r,this.findNextNonspace(),this.blocks[i.type].continue(this,i)){case 0:break;case 1:n=!1;break;case 2:return;default:throw"continue returned illegal value, must be 0, 1, or 2"}if(!n){i=i._parent;break}}this.allClosed=i===this.oldtip,this.lastMatchedContainer=i;for(var o="paragraph"!==i.type&&$e[i.type].acceptsLines,s=this.blockStarts,a=s.length;!o;){if(this.findNextNonspace(),!this.indented&&!ke.test(e.slice(this.nextNonspace))){this.advanceNextNonspace();break}for(var l=0;l=1&&i._htmlBlockType<=5&&Oe[i._htmlBlockType].test(this.currentLine.slice(this.offset))&&(this.lastLineLength=e.length,this.finalize(i,this.lineNumber))):this.offset')))},st.prototype.emph=function(e,t){this.tag(t?"em":"/em")},st.prototype.strong=function(e,t){this.tag(t?"strong":"/strong")},st.prototype.paragraph=function(e,t){var r=e.parent.parent,n=this.attrs(e);null!==r&&"list"===r.type&&r.listTight||(t?(this.cr(),this.tag("p",n)):(this.tag("/p"),this.cr()))},st.prototype.heading=function(e,t){var r="h"+e.level,n=this.attrs(e);t?(this.cr(),this.tag(r,n)):(this.tag("/"+r),this.cr())},st.prototype.code=function(e){this.tag("code"),this.out(e.literal),this.tag("/code")},st.prototype.code_block=function(e){var t=e.info?e.info.split(/\s+/):[],r=this.attrs(e);if(t.length>0&&t[0].length>0){var n=this.esc(t[0]);/^language-/.exec(n)||(n="language-"+n),r.push(["class",n])}this.cr(),this.tag("pre"),this.tag("code",r),this.out(e.literal),this.tag("/code"),this.tag("/pre"),this.cr()},st.prototype.thematic_break=function(e){var t=this.attrs(e);this.cr(),this.tag("hr",t,!0),this.cr()},st.prototype.block_quote=function(e,t){var r=this.attrs(e);t?(this.cr(),this.tag("blockquote",r),this.cr()):(this.cr(),this.tag("/blockquote"),this.cr())},st.prototype.list=function(e,t){var r="bullet"===e.listType?"ul":"ol",n=this.attrs(e);if(t){var i=e.listStart;null!==i&&1!==i&&n.push(["start",i.toString()]),this.cr(),this.tag(r,n),this.cr()}else this.cr(),this.tag("/"+r),this.cr()},st.prototype.item=function(e,t){var r=this.attrs(e);t?this.tag("li",r):(this.tag("/li"),this.cr())},st.prototype.custom_inline=function(e,t){t&&e.onEnter?this.lit(e.onEnter):!t&&e.onExit&&this.lit(e.onExit)},st.prototype.custom_block=function(e,t){this.cr(),t&&e.onEnter?this.lit(e.onEnter):!t&&e.onExit&&this.lit(e.onExit),this.cr()},st.prototype.esc=E,st.prototype.out=function(e){this.lit(this.esc(e))},st.prototype.tag=function(e,t,r){if(!(this.disableTags>0)){if(this.buffer+="<"+e,t&&t.length>0)for(var n,i=0;void 0!==(n=t[i]);)this.buffer+=" "+n[0]+'="'+n[1]+'"',i++;r&&(this.buffer+=" /"),this.buffer+=">",this.lastOut=">"}},st.prototype.attrs=function(e){var t=[];if(this.options.sourcepos){var r=e.sourcepos;r&&t.push(["data-sourcepos",String(r[0][0])+":"+String(r[0][1])+"-"+String(r[1][0])+":"+String(r[1][1])])}return t};var at=st,lt=/\<[^>]*\>/;function ct(e){e=e||{},this.disableTags=0,this.lastOut="\n",this.indentLevel=0,this.indent=" ",this.esc=e.esc||E,this.options=e}ct.prototype=Object.create(rt.prototype),ct.prototype.render=function(e){var t,r;this.buffer="";var n,i,o,s,a,l,c=e.walker(),u=this.options;for(u.time&&console.time("rendering"),this.buffer+='\n',this.buffer+='\n';n=c.next();)if(o=n.entering,l=(i=n.node).type,s=i.isContainer,a="thematic_break"===l||"linebreak"===l||"softbreak"===l,r=l.replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase(),o){switch(t=[],l){case"document":t.push(["xmlns","http://commonmark.org/xml/1.0"]);break;case"list":null!==i.listType&&t.push(["type",i.listType.toLowerCase()]),null!==i.listStart&&t.push(["start",String(i.listStart)]),null!==i.listTight&&t.push(["tight",i.listTight?"true":"false"]);var p=i.listDelimiter;if(null!==p){var f="";f="."===p?"period":"paren",t.push(["delimiter",f])}break;case"code_block":i.info&&t.push(["info",i.info]);break;case"heading":t.push(["level",String(i.level)]);break;case"link":case"image":t.push(["destination",i.destination]),t.push(["title",i.title]);break;case"custom_inline":case"custom_block":t.push(["on_enter",i.onEnter]),t.push(["on_exit",i.onExit])}if(u.sourcepos){var h=i.sourcepos;h&&t.push(["sourcepos",String(h[0][0])+":"+String(h[0][1])+"-"+String(h[1][0])+":"+String(h[1][1])])}if(this.cr(),this.out(this.tag(r,t,a)),s)this.indentLevel+=1;else if(!s&&!a){var d=i.literal;d&&this.out(this.esc(d)),this.out(this.tag("/"+r))}}else this.indentLevel-=1,this.cr(),this.out(this.tag("/"+r));return u.time&&console.timeEnd("rendering"),this.buffer+="\n",this.buffer},ct.prototype.out=function(e){this.disableTags>0?this.buffer+=e.replace(lt,""):this.buffer+=e,this.lastOut=e},ct.prototype.cr=function(){if("\n"!==this.lastOut){this.buffer+="\n",this.lastOut="\n";for(var e=this.indentLevel;e>0;e--)this.buffer+=this.indent}},ct.prototype.tag=function(e,t,r){var n="<"+e;if(t&&t.length>0)for(var i,o=0;void 0!==(i=t[o]);)n+=" "+i[0]+'="'+this.esc(i[1])+'"',o++;return r&&(n+=" /"),n+=">"},ct.prototype.esc=E;var ut=r(157),pt={name:"Description",props:{description:{type:String,default:""},preprocessor:{type:Function,default:null},processor:{type:Function,default:null},processUrl:{type:String,default:null},compact:{type:Boolean,default:!1},allowHTML:{type:Boolean,default:!1}},beforeCreate(){ut.a.enableHtmlProps(this)},methods:{markup(e){if("string"!=typeof e)return"";"string"==typeof this.processUrl&&(e=e.replace(/(^|[^\w`])``(\w+)\(\)``(?![\w`])/g,(e,t,r)=>`${t}@pid:${r}@@`));var t=new et,r=new at({safe:!this.allowHTML,smart:!0});"function"==typeof this.preprocessor&&(e=this.preprocessor(e));var n=t.parse(e),i=r.render(n);return"function"==typeof this.processor&&(i=this.processor(i)),"string"==typeof this.processUrl&&(i=i.replace(/@pid:(\w+)@@/g,(e,t)=>this.linkToProcess(t))),i},linkToProcess(e){return`${e}`}}},ft=(r(392),r(4)),ht=Object(ft.a)(pt,(function(){return(0,this._self._c)("div",{staticClass:"vue-component styled-description",class:{compact:this.compact},domProps:{innerHTML:this._s(this.markup(this.description))}})}),[],!1,null,null,null);t.default=ht.exports},,function(e,t,r){"use strict";r.r(t);var n=r(157),i={name:"ProcessExample",props:{id:Number,example:Object,processId:String,processParameters:Array,processUrl:String},components:{Description:()=>Promise.resolve().then(r.bind(null,462))},computed:{identifier(){return"#"+(this.id+1)},title(){return this.example.title?this.example.title+" ("+this.identifier+")":"Example "+this.identifier},renderedArguments(){var e=[];for(var t in this.processParameters){var r=this.processParameters[t];if(void 0!==this.example.arguments[r.name]){var i=this.example.arguments[r.name];let t;t=n.a.isObject(i)&&i.from_parameter?'$'+n.a.htmlentities(i.from_parameter)+"":n.a.isObject(i)&&i.from_node?'$'+n.a.htmlentities(i.from_node)+"":JSON.stringify(i),e.push(''+r.name+' = '+t+"")}}var o="";return void 0!==this.example.returns&&(o=' => '+JSON.stringify(this.example.returns)+""),''+this.processId+"("+e.join(", ")+")"+o}}},o=(r(394),r(4)),s=Object(o.a)(i,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component process-example"},[t("h4",[e._v(e._s(e.title))]),e._v(" "),t("div",{staticClass:"content"},[e.example.description?t("Description",{attrs:{description:e.example.description,processUrl:e.processUrl,compact:!0}}):e._e(),e._v(" "),e.example.arguments?t("div",{staticClass:"arguments"},[t("code",{domProps:{innerHTML:e._s(e.renderedArguments)}})]):e._e()],1)])}),[],!1,null,null,null).exports,a=r(177),l={name:"Process",components:{JsonSchema:()=>Promise.all([r.e(0),r.e(22)]).then(r.bind(null,468)),DeprecationNotice:()=>Promise.all([r.e(0),r.e(5)]).then(r.bind(null,484)),Description:()=>Promise.resolve().then(r.bind(null,462)),ExperimentalNotice:()=>Promise.all([r.e(0),r.e(6)]).then(r.bind(null,485)),ModelBuilder:()=>Promise.all([r.e(0),r.e(11)]).then(r.bind(null,461)),ProcessExample:s,ProcessParameter:()=>Promise.all([r.e(0),r.e(35)]).then(r.bind(null,227)),LinkList:()=>Promise.resolve().then(r.bind(null,466))},mixins:[a.a],props:{process:{type:Object,default:()=>({})},namespace:{type:String,default:null},provideDownload:{type:Boolean,default:!0},processUrl:String,showGraph:{type:Boolean,default:!1},...a.a.props},computed:{displayableNamespace(){let e=this.process.namespace||this.namespace;return"backend"===e?"":"user"===e?"user-defined":e},id(){return this.process.id||"unnamed"},parameters(){return Array.isArray(this.process.parameters)?this.process.parameters:[]},returns(){return n.a.isObject(this.process.returns)?this.process.returns:{}},signature(e=!0){return n.a.formatProcessSignature(this,e)},exampleLinks(){return Array.isArray(this.process.links)?this.process.links.filter(e=>"example"===e.rel):[]}},beforeCreate(){n.a.enableHtmlProps(this)},methods:{hasElements:e=>"object"==typeof e&&null!==e&&Object.keys(e).length>0,formatCategory:e=>e.replace("_"," "),download(){let e="data:application/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(this.process,null,2)),t=document.createElement("a");t.setAttribute("href",e),t.setAttribute("download",this.id+".json"),document.body.appendChild(t),t.click(),t.remove()}}},c=(r(395),Object(o.a)(l,(function(){var e=this,t=e._self._c;return t("article",{staticClass:"vue-component process"},[e.process.id?e._t("title",(function(){return[t("a",{staticClass:"anchor",attrs:{name:e.process.id}}),e._v(" "),t("h2",[e._v("\n\t\t\t"+e._s(e.process.id)+"\n\t\t\t"),e.displayableNamespace?t("span",{staticClass:"namespace"},[e._v(" — "+e._s(e.displayableNamespace))]):e._e()])]}),{vBind:e.$props,displayableNamespace:e.displayableNamespace}):e._e(),e._v(" "),e.process.summary||e.process.deprecated||e.process.experimental?[t("summary",[e._v("\n\t\t\t"+e._s(e.process.summary)+"\n\t\t\t"),e.process.deprecated||e.process.experimental?[e.process.summary?[e._v(" — ")]:e._e(),e._v(" "),e.process.deprecated?t("strong",{staticClass:"deprecated"},[e._v("deprecated")]):e._e(),e._v(" "),e.process.experimental?t("strong",{staticClass:"experimental"},[e._v("experimental")]):e._e()]:e._e()],2)]:e._e(),e._v(" "),e.provideDownload||e.hasElements(e.process.categories)?[t("div",{staticClass:"process-bar"},[e.hasElements(e.process.categories)?t("ul",{staticClass:"badges categories"},e._l(e.process.categories,(function(r){return t("li",{key:r,staticClass:"badge category",domProps:{textContent:e._s(e.formatCategory(r))}})})),0):e._e(),e._v(" "),e.provideDownload?t("ul",{staticClass:"badges actions"},[t("li",{staticClass:"badge action download"},[t("a",{staticClass:"badge-fill",on:{click:e.download}},[e._v("Download JSON")])])]):e._e()])]:e._e(),e._v(" "),e._t("before-description",null,{vBind:e.$props}),e._v(" "),e.process.description?t("section",{staticClass:"description"},[t("h3",[e._v("Description")]),e._v(" "),t("code",{staticClass:"signature",domProps:{innerHTML:e._s(e.signature)}}),e._v(" "),t("Description",{attrs:{description:e.process.description,processUrl:e.processUrl}}),e._v(" "),e.process.deprecated?t("DeprecationNotice",{attrs:{entity:"process"}}):e._e(),e._v(" "),e.process.experimental?t("ExperimentalNotice",{attrs:{entity:"process"}}):e._e(),e._v(" "),e.process["federation:backends"]?t("FederationNotice",{attrs:{backends:e.process["federation:backends"],federation:e.federation,entity:"process"}}):e._e()],1):e._e(),e._v(" "),t("section",{staticClass:"parameters"},[t("h3",[e._v("Parameters")]),e._v(" "),e._l(e.parameters,(function(r){return t("ProcessParameter",{key:r.name,attrs:{parameter:r,processUrl:e.processUrl,federation:e.federation}})})),e._v(" "),0===e.parameters.length?t("p",[e._v("This process has no parameters.")]):e._e()],2),e._v(" "),t("section",{staticClass:"returns"},[t("h3",[e._v("Return Value")]),e._v(" "),e.returns.description||e.returns.schema?[e.returns.description?t("Description",{attrs:{description:e.returns.description,processUrl:e.processUrl}}):e._e(),e._v(" "),e.returns.schema?t("div",{staticClass:"json-schema-container"},[t("JsonSchema",{attrs:{schema:e.returns.schema}})],1):e._e()]:t("p",[e._v("The return value has not been defined.")])],2),e._v(" "),e.hasElements(e.process.exceptions)?t("section",{staticClass:"exceptions"},[t("h3",[e._v("Errors/Exceptions")]),e._v(" "),t("ul",e._l(e.process.exceptions,(function(r,n){return t("li",{key:n,staticClass:"exception"},[t("code",[e._v(e._s(n))]),e._v(" "),r.http?t("span",{staticClass:"http-code"},[e._v(" — HTTP "+e._s(r.http))]):e._e(),e._v(" "),r.code?t("span",{staticClass:"error-code"},[e._v(" — "+e._s(r.code))]):e._e(),e._v(" "),r.description?t("Description",{attrs:{description:r.description,processUrl:e.processUrl,compact:!0}}):e._e(),e._v(" "),r.message?t("div",{staticClass:"message"},[e._v("Message: "),t("em",[e._v(e._s(r.message))])]):e._e()],1)})),0)]):e._e(),e._v(" "),e.hasElements(e.process.examples)?t("section",{staticClass:"examples"},[t("h3",[e._v("Examples")]),e._v(" "),e._l(e.process.examples,(function(r,n){return t("ProcessExample",{key:n,attrs:{id:n,example:r,processId:e.id,processParameters:e.parameters,processUrl:e.processUrl}})})),e._v(" "),t("LinkList",{attrs:{links:e.exampleLinks,heading:"Processes",headingTag:"h4"}})],2):e._e(),e._v(" "),t("section",{staticClass:"links"},[t("LinkList",{attrs:{links:e.process.links,heading:"See Also",headingTag:"h3",ignoreRel:["self","example"]}})],1),e._v(" "),e.showGraph&&e.process.process_graph?t("section",{staticClass:"process-graph"},[t("h3",[e._v("Processing Instructions")]),e._v(" "),t("div",{staticClass:"graph"},[e._t("process-graph",(function(){return[t("ModelBuilder",{attrs:{id:e.id,value:e.process,explicitZoom:!0}})]}),{vBind:e.$props})],2)]):e._e(),e._v(" "),e._t("end",null,{vBind:e.$props})],2)}),[],!1,null,null,null));t.default=c.exports},function(e,t,r){"use strict";r.r(t);var n=r(157),i=r(294),o={data:()=>({canCopy:!1}),mounted(){this.canCopy=navigator&&navigator.clipboard&&"function"==typeof navigator.clipboard.writeText},methods:{copyText(e,t=null,r=null){if(this.canCopy){const n=navigator.clipboard.writeText(e);t&&n.then(t),r&&n.catch(r)}},toggleIcon(e,t){if(e){let r=e.innerText;e.innerText=t,setTimeout(()=>e.innerText=r,2e3)}}}},s=r(0),a={name:"SearchableList",components:{Loading:i.a,SearchBox:()=>Promise.resolve().then(r.bind(null,467))},mixins:[o],props:{data:{type:[Array,Object],default:()=>[]},identifierKey:{type:String,default:"id"},summaryKey:{type:String,default:"summary"},keywordsKey:{type:String,default:null},showKeywords:{type:Boolean,default:!1},externalSearchTerm:{type:String,default:null},searchPlaceholder:{type:String,default:"Search"},sort:{type:Boolean,default:!0},offerDetails:{type:Boolean,default:!0},showSummaryOnExpand:{type:Boolean,default:!0},heading:{type:String,default:null},collapsed:{type:Boolean,default:null},searchMinLength:{type:Number,default:2},loadAdditionalData:{type:Function,default:null},allowCopy:{type:Boolean,default:!1},externalHideDeprecated:{type:Boolean,default:!1},deprecatedFilter:{type:Boolean,default:!1},externalHideExperimental:{type:Boolean,default:!1},experimentalFilter:{type:Boolean,default:!1}},data(){return{searchTerm:"",showDetails:{},showList:!this.collapsed||null,hideDeprecated:this.externalHideDeprecated,hideExperimental:this.externalHideExperimental,summaries:[]}},watch:{loadAdditionalData:{handler(){this.generateSummaries(this.summaries)}},data:{immediate:!0,handler(e,t){e!==t&&this.generateSummaries(e)}},externalSearchTerm:{immediate:!0,handler(e){this.searchTerm="string"==typeof e?e:""}},externalHideDeprecated:{immediate:!0,handler(e){this.hideDeprecated=e}},externalHideExperimental:{immediate:!0,handler(e){this.hideExperimental=e}},summaries:{immediate:!0,handler(){this.$emit("summaries",this.summaries)}},searchTerm(){this.filter()},hideDeprecated(){null!==this.hideDeprecatedByDefault&&this.filter()},hideExperimental(){null!==this.hideExperimentalByDefault&&this.filter()},collapsed(e){!1===e?this.showList=!0:null!==this.showList&&(this.showList=!1)}},computed:{totalCount(){return n.a.size(this.data)},filteredCount(){return this.hasActiveFilter()?this.summaries.filter(e=>!0===e.show).length:null}},created(){this.filter()},methods:{hasActiveFilter(){return this.searchTerm.length>=this.searchMinLength||null!==this.hideDeprecatedByDefault&&this.hideDeprecated||null!==this.hideExperimentalByDefault&&this.hideExperimental},filter(){const e=this.searchTerm.length>=this.searchMinLength;this.summaries.forEach(t=>{let r=!0;null!==this.hideDeprecatedByDefault&&this.hideDeprecated&&t.deprecated||null!==this.hideExperimentalByDefault&&this.hideExperimental&&t.experimental?r=!1:e&&(r=n.a.search(this.searchTerm,[t.identifier,t.summary].concat(t.keywords))),this.$set(t,"show",r)}),this.$emit("summaries",this.summaries)},copyIdentifier(e,t){if(this.allowCopy){const r=e.composedPath()[0];this.copyText(t.identifier,()=>this.toggleIcon(r,"✅"),()=>this.toggleIcon(r,"❌"))}},generateSummaries(){let e="function"==typeof this.loadAdditionalData,t=[];for(let r in this.data){let n=this.data[r],i={identifier:r,summary:"",show:!0,loaded:!e,index:r,experimental:n.experimental,deprecated:n.deprecated,data:null};"string"==typeof this.identifierKey&&"string"==typeof n[this.identifierKey]&&(i.identifier=n[this.identifierKey]),"string"==typeof this.summaryKey&&"string"==typeof n[this.summaryKey]&&(i.summary=n[this.summaryKey]),"string"==typeof this.keywordsKey&&Array.isArray(n[this.keywordsKey])?i.keywords=n[this.keywordsKey]:i.keywords=[];let o=s.a.observable(i);o.data=n,t.push(o)}this.sort&&t.sort((e,t)=>n.a.compareStringCaseInsensitive(e.identifier,t.identifier)),this.summaries=t},toggleHeading(e=null){null!==this.collapsed&&(this.showList=null===e?!this.showList:e,this.$emit("headingToggled",this.showList),this.$parent&&this.$parent.$emit("headingToggled",this.showList))},async toggleDetails(e,t){if(!this.offerDetails)return;if(void 0===t&&(t=!this.showDetails[e]),void 0===this.showDetails[e]&&!1===t)return;this.$set(this.showDetails,e,t);let r=this.summaries[e];if(t&&"function"==typeof this.loadAdditionalData&&!r.loaded)try{r.data=await this.loadAdditionalData(r.index,r.identifier,r.data),r.loaded=!0}catch(e){console.error(e)}this.$emit("detailsToggled",t,r.index,r.identifier,r.data)}}},l=(r(397),r(4)),c=Object(l.a)(a,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component searchable-list",class:{expandable:null!==e.collapsed,expanded:e.showList,noResults:0===e.filteredCount}},[e._t("heading",(function(){return[e.heading?t("h2",{staticClass:"heading",on:{click:function(t){return e.toggleHeading(null)}}},[e._v("\n\t\t\t"+e._s(e.heading)+"\n\t\t\t"),null!==e.filteredCount&&e.filteredCount!==e.totalCount?[e._v("("+e._s(e.filteredCount)+"/"+e._s(e.totalCount)+")")]:[e._v("("+e._s(e.totalCount)+")")]],2):e._e()]}),{filteredCount:e.filteredCount,totalCount:e.totalCount}),e._v(" "),null!==e.showList?t("div",{directives:[{name:"show",rawName:"v-show",value:!0===e.showList,expression:"showList === true"}],staticClass:"body"},[e._t("content-start"),e._v(" "),0===e.totalCount?[t("p",[e._v("No data available.")])]:[t("section",{staticClass:"action-bar"},[null===e.externalSearchTerm?t("SearchBox",{attrs:{placeholder:e.searchPlaceholder,minLength:e.searchMinLength},model:{value:e.searchTerm,callback:function(t){e.searchTerm=t},expression:"searchTerm"}}):e._e(),e._v(" "),e.deprecatedFilter?t("label",{staticClass:"deprecated",attrs:{title:"Show deprecated elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.hideDeprecated,expression:"hideDeprecated"}],attrs:{type:"checkbox","true-value":!1,"false-value":!0},domProps:{checked:Array.isArray(e.hideDeprecated)?e._i(e.hideDeprecated,null)>-1:e._q(e.hideDeprecated,!1)},on:{change:function(t){var r=e.hideDeprecated,n=t.target,i=!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.hideDeprecated=r.concat([null])):o>-1&&(e.hideDeprecated=r.slice(0,o).concat(r.slice(o+1)))}else e.hideDeprecated=i}}}),e._v("\n\t\t\t\t\tShow deprecated\n\t\t\t\t")]):e._e(),e._v(" "),e.experimentalFilter?t("label",{staticClass:"experimental",attrs:{title:"Show experimental elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.hideExperimental,expression:"hideExperimental"}],attrs:{type:"checkbox","true-value":!1,"false-value":!0},domProps:{checked:Array.isArray(e.hideExperimental)?e._i(e.hideExperimental,null)>-1:e._q(e.hideExperimental,!1)},on:{change:function(t){var r=e.hideExperimental,n=t.target,i=!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.hideExperimental=r.concat([null])):o>-1&&(e.hideExperimental=r.slice(0,o).concat(r.slice(o+1)))}else e.hideExperimental=i}}}),e._v("\n\t\t\t\t\tShow experimental\n\t\t\t\t")]):e._e()],1),e._v(" "),e._t("after-search-box",null,{filteredCount:e.filteredCount,summaries:e.summaries}),e._v(" "),0===e.filteredCount?t("p",[e._v("No search results found.")]):t("ul",{staticClass:"list",class:{expandable:e.offerDetails}},e._l(e.summaries,(function(r,n){return t("li",{directives:[{name:"show",rawName:"v-show",value:r.show,expression:"summary.show"}],key:r.identifier,class:{expanded:e.showDetails[n]}},[t("summary",{staticClass:"summary",class:{experimental:r.experimental,deprecated:r.deprecated},on:{click:function(t){return e.toggleDetails(n)}}},[e._t("summary",(function(){return[t("strong",[e._v("\n\t\t\t\t\t\t\t\t"+e._s(r.identifier)+"\n\t\t\t\t\t\t\t\t"),e.allowCopy&&e.canCopy?t("span",{staticClass:"copy",attrs:{title:"Copy identifier"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),e.copyIdentifier(t,r)}}},[e._v("📋")]):e._e()]),e._v(" "),r.summary?t("small",{class:{hideOnExpand:!e.showSummaryOnExpand}},[e._v(e._s(r.summary))]):e._e(),e._v(" "),e.showKeywords&&r.keywords.length>0?t("ul",{staticClass:"badges small block hideOnExpand"},e._l(r.keywords,(function(r){return t("li",{key:r,staticClass:"badge"},[e._v(e._s(r))])})),0):e._e()]}),{summary:r,item:r.data})],2),e._v(" "),"boolean"==typeof e.showDetails[n]?t("div",{directives:[{name:"show",rawName:"v-show",value:!0===e.showDetails[n],expression:"showDetails[i] === true"}],staticClass:"details"},[r.loaded?e._t("details",(function(){return[e._v("\n\t\t\t\t\t\t\tNo details available!\n\t\t\t\t\t\t")]}),{summary:r,item:r.data}):t("Loading")],2):e._e()])})),0)]],2):e._e()],2)}),[],!1,null,null,null);t.default=c.exports},function(e,t,r){"use strict";r.r(t);var n=r(157),i={name:"LinkList",props:{links:{type:Array,default:()=>[]},sort:{type:Boolean,default:!0},heading:{type:String,default:null},headingTag:{type:String,default:"strong"},ignoreRel:{type:Array,default:()=>["self"]},showRel:{type:Boolean,default:!1}},computed:{friendlyLinks(){return n.a.friendlyLinks(this.links,this.sort,this.ignoreRel)}},beforeCreate(){n.a.enableHtmlProps(this)}},o=(r(393),r(4)),s=Object(o.a)(i,(function(){var e=this,t=e._self._c;return e.friendlyLinks.length>0?t("div",{staticClass:"vue-component link-list"},[e.heading?t(e.headingTag,{tag:"component"},[e._v(e._s(e.heading))]):e._e(),e._v(" "),t("ul",e._l(e.friendlyLinks,(function(r,n){return t("li",{key:n},[t("a",{attrs:{href:r.href,target:"_blank",rel:r.rel}},[e._v(e._s(r.title))]),e._v(" "),e.showRel&&r.rel?t("span",{staticClass:"relation"},[e._v(" ("+e._s(r.rel)+")")]):e._e()])})),0)],1):e._e()}),[],!1,null,null,null);t.default=s.exports},function(e,t,r){"use strict";r.r(t);var n={name:"SearchBox",props:{value:{type:String,default:""},placeholder:{type:String,default:"Search"},minLength:{type:Number,default:1},compact:{type:Boolean,default:!1}},data(){return{searchTerm:this.value}},watch:{searchTerm(e,t){e.length1?`Searching requires at least ${this.minLength} characters.`:null}}},i=(r(398),r(4)),o=Object(i.a)(n,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component search-box",class:{compact:e.compact}},[t("span",{staticClass:"icon"},[e._v("🔎")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.searchTerm,expression:"searchTerm"}],attrs:{type:"search",placeholder:e.placeholder,minlength:e.minLength,title:e.searchHint},domProps:{value:e.searchTerm},on:{input:function(t){t.target.composing||(e.searchTerm=t.target.value)}}})])}),[],!1,null,null,null);t.default=o.exports},,,,,,,function(e,t,r){"use strict";r.r(t);var n={};r.r(n),r.d(n,"hasBrowserEnv",(function(){return y})),r.d(n,"hasStandardBrowserWebWorkerEnv",(function(){return w})),r.d(n,"hasStandardBrowserEnv",(function(){return b})),r.d(n,"origin",(function(){return _}));var i=r(156),o=r(265),s=r(203);function a(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function l(e,t){this._pairs=[],e&&Object(s.a)(e,this,t)}const c=l.prototype;c.append=function(e,t){this._pairs.push([e,t])},c.toString=function(e){const t=e?function(t){return e.call(this,t,a)}:a;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var u=l;function p(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function f(e,t,r){if(!t)return e;const n=r&&r.encode||p,o=r&&r.serialize;let s;if(s=o?o(t,r):i.a.isURLSearchParams(t)?t.toString():new u(t,r).toString(n),s){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}var h=class{constructor(){this.handlers=[]}use(e,t,r){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!r&&r.synchronous,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){i.a.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},d=r(166),m={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},g={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:u,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const y="undefined"!=typeof window&&"undefined"!=typeof document,b=(v="undefined"!=typeof navigator&&navigator.product,y&&["ReactNative","NativeScript","NS"].indexOf(v)<0);var v;const w="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,_=y&&window.location.href||"http://localhost";var x={...n,...g};var A=function(e){function t(e,r,n,o){let s=e[o++];if("__proto__"===s)return!0;const a=Number.isFinite(+s),l=o>=e.length;if(s=!s&&i.a.isArray(n)?n.length:s,l)return i.a.hasOwnProp(n,s)?n[s]=[n[s],r]:n[s]=r,!a;n[s]&&i.a.isObject(n[s])||(n[s]=[]);return t(e,r,n[s],o)&&i.a.isArray(n[s])&&(n[s]=function(e){const t={},r=Object.keys(e);let n;const i=r.length;let o;for(n=0;n{t(function(e){return i.a.matchAll(/\w+|\[(\w*)]/g,e).map(e=>"[]"===e[0]?"":e[1]||e[0])}(e),n,r,0)}),r}return null};const S={transitional:m,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const r=t.getContentType()||"",n=r.indexOf("application/json")>-1,o=i.a.isObject(e);o&&i.a.isHTMLForm(e)&&(e=new FormData(e));if(i.a.isFormData(e))return n?JSON.stringify(A(e)):e;if(i.a.isArrayBuffer(e)||i.a.isBuffer(e)||i.a.isStream(e)||i.a.isFile(e)||i.a.isBlob(e)||i.a.isReadableStream(e))return e;if(i.a.isArrayBufferView(e))return e.buffer;if(i.a.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let a;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Object(s.a)(e,new x.classes.URLSearchParams,Object.assign({visitor:function(e,t,r,n){return x.isNode&&i.a.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((a=i.a.isFileList(e))||r.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return Object(s.a)(a?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||n?(t.setContentType("application/json",!1),function(e,t,r){if(i.a.isString(e))try{return(t||JSON.parse)(e),i.a.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(r||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||S.transitional,r=t&&t.forcedJSONParsing,n="json"===this.responseType;if(i.a.isResponse(e)||i.a.isReadableStream(e))return e;if(e&&i.a.isString(e)&&(r&&!this.responseType||n)){const r=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e)}catch(e){if(r){if("SyntaxError"===e.name)throw d.a.from(e,d.a.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:x.classes.FormData,Blob:x.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};i.a.forEach(["delete","get","head","post","put","patch"],e=>{S.headers[e]={}});var E=S;const C=i.a.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);const O=Symbol("internals");function T(e){return e&&String(e).trim().toLowerCase()}function k(e){return!1===e||null==e?e:i.a.isArray(e)?e.map(k):String(e)}function L(e,t,r,n,o){return i.a.isFunction(n)?n.call(this,t,r):(o&&(t=r),i.a.isString(t)?i.a.isString(n)?-1!==t.indexOf(n):i.a.isRegExp(n)?n.test(t):void 0:void 0)}class P{constructor(e){e&&this.set(e)}set(e,t,r){const n=this;function o(e,t,r){const o=T(t);if(!o)throw new Error("header name must be a non-empty string");const s=i.a.findKey(n,o);(!s||void 0===n[s]||!0===r||void 0===r&&!1!==n[s])&&(n[s||t]=k(e))}const s=(e,t)=>i.a.forEach(e,(e,r)=>o(e,r,t));if(i.a.isPlainObject(e)||e instanceof this.constructor)s(e,t);else if(i.a.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))s((e=>{const t={};let r,n,i;return e&&e.split("\n").forEach((function(e){i=e.indexOf(":"),r=e.substring(0,i).trim().toLowerCase(),n=e.substring(i+1).trim(),!r||t[r]&&C[r]||("set-cookie"===r?t[r]?t[r].push(n):t[r]=[n]:t[r]=t[r]?t[r]+", "+n:n)})),t})(e),t);else if(i.a.isHeaders(e))for(const[t,n]of e.entries())o(n,t,r);else null!=e&&o(t,e,r);return this}get(e,t){if(e=T(e)){const r=i.a.findKey(this,e);if(r){const e=this[r];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=r.exec(e);)t[n[1]]=n[2];return t}(e);if(i.a.isFunction(t))return t.call(this,e,r);if(i.a.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=T(e)){const r=i.a.findKey(this,e);return!(!r||void 0===this[r]||t&&!L(0,this[r],r,t))}return!1}delete(e,t){const r=this;let n=!1;function o(e){if(e=T(e)){const o=i.a.findKey(r,e);!o||t&&!L(0,r[o],o,t)||(delete r[o],n=!0)}}return i.a.isArray(e)?e.forEach(o):o(e),n}clear(e){const t=Object.keys(this);let r=t.length,n=!1;for(;r--;){const i=t[r];e&&!L(0,this[i],i,e,!0)||(delete this[i],n=!0)}return n}normalize(e){const t=this,r={};return i.a.forEach(this,(n,o)=>{const s=i.a.findKey(r,o);if(s)return t[s]=k(n),void delete t[o];const a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,r)=>t.toUpperCase()+r)}(o):String(o).trim();a!==o&&delete t[o],t[a]=k(n),r[a]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return i.a.forEach(this,(r,n)=>{null!=r&&!1!==r&&(t[n]=e&&i.a.isArray(r)?r.join(", "):r)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+": "+t).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const r=new this(e);return t.forEach(e=>r.set(e)),r}static accessor(e){const t=(this[O]=this[O]={accessors:{}}).accessors,r=this.prototype;function n(e){const n=T(e);t[n]||(!function(e,t){const r=i.a.toCamelCase(" "+t);["get","set","has"].forEach(n=>{Object.defineProperty(e,n+r,{value:function(e,r,i){return this[n].call(this,t,e,r,i)},configurable:!0})})}(r,e),t[n]=!0)}return i.a.isArray(e)?e.forEach(n):n(e),this}}P.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),i.a.reduceDescriptors(P.prototype,({value:e},t)=>{let r=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[r]=e}}}),i.a.freezeMethods(P);var j=P;function R(e,t){const r=this||E,n=t||r,o=j.from(n.headers);let s=n.data;return i.a.forEach(e,(function(e){s=e.call(r,s,o.normalize(),t?t.status:void 0)})),o.normalize(),s}function D(e){return!(!e||!e.__CANCEL__)}function N(e,t,r){d.a.call(this,null==e?"canceled":e,d.a.ERR_CANCELED,t,r),this.name="CanceledError"}i.a.inherits(N,d.a,{__CANCEL__:!0});var B=N,U=r(266);function q(e,t,r){const n=r.config.validateStatus;r.status&&n&&!n(r.status)?t(new d.a("Request failed with status code "+r.status,[d.a.ERR_BAD_REQUEST,d.a.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r)):e(r)}var M=function(e,t){e=e||10;const r=new Array(e),n=new Array(e);let i,o=0,s=0;return t=void 0!==t?t:1e3,function(a){const l=Date.now(),c=n[s];i||(i=l),r[o]=a,n[o]=l;let u=s,p=0;for(;u!==o;)p+=r[u++],u%=e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),l-in)return i&&(clearTimeout(i),i=null),r=o,e.apply(null,arguments);i||(i=setTimeout(()=>(i=null,r=Date.now(),e.apply(null,arguments)),n-(o-r)))}},I=(e,t,r=3)=>{let n=0;const i=M(50,250);return F(r=>{const o=r.loaded,s=r.lengthComputable?r.total:void 0,a=o-n,l=i(a);n=o;const c={loaded:o,total:s,progress:s?o/s:void 0,bytes:a,rate:l||void 0,estimated:l&&s&&o<=s?(s-o)/l:void 0,event:r,lengthComputable:null!=s};c[t?"download":"upload"]=!0,e(c)},r)},H=x.hasStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");let r;function n(r){let n=r;return e&&(t.setAttribute("href",n),n=t.href),t.setAttribute("href",n),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return r=n(window.location.href),function(e){const t=i.a.isString(e)?n(e):e;return t.protocol===r.protocol&&t.host===r.host}}():function(){return!0},z=x.hasStandardBrowserEnv?{write(e,t,r,n,o,s){const a=[e+"="+encodeURIComponent(t)];i.a.isNumber(r)&&a.push("expires="+new Date(r).toGMTString()),i.a.isString(n)&&a.push("path="+n),i.a.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function $(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const V=e=>e instanceof j?{...e}:e;function G(e,t){t=t||{};const r={};function n(e,t,r){return i.a.isPlainObject(e)&&i.a.isPlainObject(t)?i.a.merge.call({caseless:r},e,t):i.a.isPlainObject(t)?i.a.merge({},t):i.a.isArray(t)?t.slice():t}function o(e,t,r){return i.a.isUndefined(t)?i.a.isUndefined(e)?void 0:n(void 0,e,r):n(e,t,r)}function s(e,t){if(!i.a.isUndefined(t))return n(void 0,t)}function a(e,t){return i.a.isUndefined(t)?i.a.isUndefined(e)?void 0:n(void 0,e):n(void 0,t)}function l(r,i,o){return o in t?n(r,i):o in e?n(void 0,r):void 0}const c={url:s,method:s,data:s,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:l,headers:(e,t)=>o(V(e),V(t),!0)};return i.a.forEach(Object.keys(Object.assign({},e,t)),(function(n){const s=c[n]||o,a=s(e[n],t[n],n);i.a.isUndefined(a)&&s!==l||(r[n]=a)})),r}var J=e=>{const t=G({},e);let r,{data:n,withXSRFToken:o,xsrfHeaderName:s,xsrfCookieName:a,headers:l,auth:c}=t;if(t.headers=l=j.from(l),t.url=f($(t.baseURL,t.url),e.params,e.paramsSerializer),c&&l.set("Authorization","Basic "+btoa((c.username||"")+":"+(c.password?unescape(encodeURIComponent(c.password)):""))),i.a.isFormData(n))if(x.hasStandardBrowserEnv||x.hasStandardBrowserWebWorkerEnv)l.setContentType(void 0);else if(!1!==(r=l.getContentType())){const[e,...t]=r?r.split(";").map(e=>e.trim()).filter(Boolean):[];l.setContentType([e||"multipart/form-data",...t].join("; "))}if(x.hasStandardBrowserEnv&&(o&&i.a.isFunction(o)&&(o=o(t)),o||!1!==o&&H(t.url))){const e=s&&a&&z.read(a);e&&l.set(s,e)}return t};var Y="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,r){const n=J(e);let o=n.data;const s=j.from(n.headers).normalize();let a,{responseType:l}=n;function c(){n.cancelToken&&n.cancelToken.unsubscribe(a),n.signal&&n.signal.removeEventListener("abort",a)}let u=new XMLHttpRequest;function p(){if(!u)return;const n=j.from("getAllResponseHeaders"in u&&u.getAllResponseHeaders());q((function(e){t(e),c()}),(function(e){r(e),c()}),{data:l&&"text"!==l&&"json"!==l?u.response:u.responseText,status:u.status,statusText:u.statusText,headers:n,config:e,request:u}),u=null}u.open(n.method.toUpperCase(),n.url,!0),u.timeout=n.timeout,"onloadend"in u?u.onloadend=p:u.onreadystatechange=function(){u&&4===u.readyState&&(0!==u.status||u.responseURL&&0===u.responseURL.indexOf("file:"))&&setTimeout(p)},u.onabort=function(){u&&(r(new d.a("Request aborted",d.a.ECONNABORTED,n,u)),u=null)},u.onerror=function(){r(new d.a("Network Error",d.a.ERR_NETWORK,n,u)),u=null},u.ontimeout=function(){let e=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const t=n.transitional||m;n.timeoutErrorMessage&&(e=n.timeoutErrorMessage),r(new d.a(e,t.clarifyTimeoutError?d.a.ETIMEDOUT:d.a.ECONNABORTED,n,u)),u=null},void 0===o&&s.setContentType(null),"setRequestHeader"in u&&i.a.forEach(s.toJSON(),(function(e,t){u.setRequestHeader(t,e)})),i.a.isUndefined(n.withCredentials)||(u.withCredentials=!!n.withCredentials),l&&"json"!==l&&(u.responseType=n.responseType),"function"==typeof n.onDownloadProgress&&u.addEventListener("progress",I(n.onDownloadProgress,!0)),"function"==typeof n.onUploadProgress&&u.upload&&u.upload.addEventListener("progress",I(n.onUploadProgress)),(n.cancelToken||n.signal)&&(a=t=>{u&&(r(!t||t.type?new B(null,e,u):t),u.abort(),u=null)},n.cancelToken&&n.cancelToken.subscribe(a),n.signal&&(n.signal.aborted?a():n.signal.addEventListener("abort",a)));const f=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(n.url);f&&-1===x.protocols.indexOf(f)?r(new d.a("Unsupported protocol "+f+":",d.a.ERR_BAD_REQUEST,e)):u.send(o||null)}))};var Z=(e,t)=>{let r,n=new AbortController;const i=function(e){if(!r){r=!0,s();const t=e instanceof Error?e:this.reason;n.abort(t instanceof d.a?t:new B(t instanceof Error?t.message:t))}};let o=t&&setTimeout(()=>{i(new d.a(`timeout ${t} of ms exceeded`,d.a.ETIMEDOUT))},t);const s=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(e=>{e&&(e.removeEventListener?e.removeEventListener("abort",i):e.unsubscribe(i))}),e=null)};e.forEach(e=>e&&e.addEventListener&&e.addEventListener("abort",i));const{signal:a}=n;return a.unsubscribe=s,[a,()=>{o&&clearTimeout(o),o=null}]};const K=function*(e,t){let r=e.byteLength;if(!t||r{const o=async function*(e,t,r){for await(const n of e)yield*K(ArrayBuffer.isView(n)?n:await r(String(n)),t)}(e,t,i);let s=0;return new ReadableStream({type:"bytes",async pull(e){const{done:t,value:i}=await o.next();if(t)return e.close(),void n();let a=i.byteLength;r&&r(s+=a),e.enqueue(new Uint8Array(i))},cancel:e=>(n(e),o.return())},{highWaterMark:2})},X=(e,t)=>{const r=null!=e;return n=>setTimeout(()=>t({lengthComputable:r,total:e,loaded:n}))},Q="function"==typeof fetch&&"function"==typeof Request&&"function"==typeof Response,ee=Q&&"function"==typeof ReadableStream,te=Q&&("function"==typeof TextEncoder?(re=new TextEncoder,e=>re.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var re;const ne=ee&&(()=>{let e=!1;const t=new Request(x.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})(),ie=ee&&!!(()=>{try{return i.a.isReadableStream(new Response("").body)}catch(e){}})(),oe={stream:ie&&(e=>e.body)};var se;Q&&(se=new Response,["text","arrayBuffer","blob","formData","stream"].forEach(e=>{!oe[e]&&(oe[e]=i.a.isFunction(se[e])?t=>t[e]():(t,r)=>{throw new d.a(`Response type '${e}' is not supported`,d.a.ERR_NOT_SUPPORT,r)})}));const ae=async(e,t)=>{const r=i.a.toFiniteNumber(e.getContentLength());return null==r?(async e=>null==e?0:i.a.isBlob(e)?e.size:i.a.isSpecCompliantForm(e)?(await new Request(e).arrayBuffer()).byteLength:i.a.isArrayBufferView(e)?e.byteLength:(i.a.isURLSearchParams(e)&&(e+=""),i.a.isString(e)?(await te(e)).byteLength:void 0))(t):r};var le=Q&&(async e=>{let{url:t,method:r,data:n,signal:o,cancelToken:s,timeout:a,onDownloadProgress:l,onUploadProgress:c,responseType:u,headers:p,withCredentials:f="same-origin",fetchOptions:h}=J(e);u=u?(u+"").toLowerCase():"text";let m,g,[y,b]=o||s||a?Z([o,s],a):[];const v=()=>{!m&&setTimeout(()=>{y&&y.unsubscribe()}),m=!0};let w;try{if(c&&ne&&"get"!==r&&"head"!==r&&0!==(w=await ae(p,n))){let e,r=new Request(t,{method:"POST",body:n,duplex:"half"});i.a.isFormData(n)&&(e=r.headers.get("content-type"))&&p.setContentType(e),r.body&&(n=W(r.body,65536,X(w,I(c)),null,te))}i.a.isString(f)||(f=f?"cors":"omit"),g=new Request(t,{...h,signal:y,method:r.toUpperCase(),headers:p.normalize().toJSON(),body:n,duplex:"half",withCredentials:f});let o=await fetch(g);const s=ie&&("stream"===u||"response"===u);if(ie&&(l||s)){const e={};["status","statusText","headers"].forEach(t=>{e[t]=o[t]});const t=i.a.toFiniteNumber(o.headers.get("content-length"));o=new Response(W(o.body,65536,l&&X(t,I(l,!0)),s&&v,te),e)}u=u||"text";let a=await oe[i.a.findKey(oe,u)||"text"](o,e);return!s&&v(),b&&b(),await new Promise((t,r)=>{q(t,r,{data:a,headers:j.from(o.headers),status:o.status,statusText:o.statusText,config:e,request:g})})}catch(t){if(v(),t&&"TypeError"===t.name&&/fetch/i.test(t.message))throw Object.assign(new d.a("Network Error",d.a.ERR_NETWORK,e,g),{cause:t.cause||t});throw d.a.from(t,t&&t.code,e,g)}});const ce={http:U.a,xhr:Y,fetch:le};i.a.forEach(ce,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}});const ue=e=>"- "+e,pe=e=>i.a.isFunction(e)||null===e||!1===e;var fe=e=>{e=i.a.isArray(e)?e:[e];const{length:t}=e;let r,n;const o={};for(let i=0;i`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build"));let r=t?e.length>1?"since :\n"+e.map(ue).join("\n"):" "+ue(e[0]):"as no adapter specified";throw new d.a("There is no suitable adapter to dispatch the request "+r,"ERR_NOT_SUPPORT")}return n};function he(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new B(null,e)}function de(e){he(e),e.headers=j.from(e.headers),e.data=R.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return fe(e.adapter||E.adapter)(e).then((function(t){return he(e),t.data=R.call(e,e.transformResponse,t),t.headers=j.from(t.headers),t}),(function(t){return D(t)||(he(e),t&&t.response&&(t.response.data=R.call(e,e.transformResponse,t.response),t.response.headers=j.from(t.response.headers))),Promise.reject(t)}))}const me={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{me[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const ge={};me.transitional=function(e,t,r){function n(e,t){return"[Axios v1.7.2] Transitional option '"+e+"'"+t+(r?". "+r:"")}return(r,i,o)=>{if(!1===e)throw new d.a(n(i," has been removed"+(t?" in "+t:"")),d.a.ERR_DEPRECATED);return t&&!ge[i]&&(ge[i]=!0,console.warn(n(i," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(r,i,o)}};var ye={assertOptions:function(e,t,r){if("object"!=typeof e)throw new d.a("options must be an object",d.a.ERR_BAD_OPTION_VALUE);const n=Object.keys(e);let i=n.length;for(;i-- >0;){const o=n[i],s=t[o];if(s){const t=e[o],r=void 0===t||s(t,o,e);if(!0!==r)throw new d.a("option "+o+" must be "+r,d.a.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new d.a("Unknown option "+o,d.a.ERR_BAD_OPTION)}},validators:me};const be=ye.validators;class ve{constructor(e){this.defaults=e,this.interceptors={request:new h,response:new h}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t;Error.captureStackTrace?Error.captureStackTrace(t={}):t=new Error;const r=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?r&&!String(e.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+r):e.stack=r}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=G(this.defaults,t);const{transitional:r,paramsSerializer:n,headers:o}=t;void 0!==r&&ye.assertOptions(r,{silentJSONParsing:be.transitional(be.boolean),forcedJSONParsing:be.transitional(be.boolean),clarifyTimeoutError:be.transitional(be.boolean)},!1),null!=n&&(i.a.isFunction(n)?t.paramsSerializer={serialize:n}:ye.assertOptions(n,{encode:be.function,serialize:be.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();let s=o&&i.a.merge(o.common,o[t.method]);o&&i.a.forEach(["delete","get","head","post","put","patch","common"],e=>{delete o[e]}),t.headers=j.concat(s,o);const a=[];let l=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(l=l&&e.synchronous,a.unshift(e.fulfilled,e.rejected))}));const c=[];let u;this.interceptors.response.forEach((function(e){c.push(e.fulfilled,e.rejected)}));let p,f=0;if(!l){const e=[de.bind(this),void 0];for(e.unshift.apply(e,a),e.push.apply(e,c),p=e.length,u=Promise.resolve(t);f{if(!r._listeners)return;let t=r._listeners.length;for(;t-- >0;)r._listeners[t](e);r._listeners=null}),this.promise.then=e=>{let t;const n=new Promise(e=>{r.subscribe(e),t=e}).then(e);return n.cancel=function(){r.unsubscribe(t)},n},e((function(e,n,i){r.reason||(r.reason=new B(e,n,i),t(r.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}static source(){let e;return{token:new _e((function(t){e=t})),cancel:e}}}var xe=_e;const Ae={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ae).forEach(([e,t])=>{Ae[t]=e});var Se=Ae;const Ee=function e(t){const r=new we(t),n=Object(o.a)(we.prototype.request,r);return i.a.extend(n,we.prototype,r,{allOwnKeys:!0}),i.a.extend(n,r,null,{allOwnKeys:!0}),n.create=function(r){return e(G(t,r))},n}(E);Ee.Axios=we,Ee.CanceledError=B,Ee.CancelToken=xe,Ee.isCancel=D,Ee.VERSION="1.7.2",Ee.toFormData=s.a,Ee.AxiosError=d.a,Ee.Cancel=Ee.CanceledError,Ee.all=function(e){return Promise.all(e)},Ee.spread=function(e){return function(t){return e.apply(null,t)}},Ee.isAxiosError=function(e){return i.a.isObject(e)&&!0===e.isAxiosError},Ee.mergeConfig=G,Ee.AxiosHeaders=j,Ee.formToJSON=e=>A(i.a.isHTMLForm(e)?new FormData(e):e),Ee.getAdapter=fe,Ee.HttpStatusCode=Se,Ee.default=Ee;var Ce=Ee,Oe=r(157),Te="processes.json",ke="1.2.0",Le="Processes",Pe=!0,je=!0,Re="Uncategorized",De=!0,Ne=!0,Be="",Ue=!1,qe=!1,Me=r(462),Fe=r(466),Ie=r(464),He=r(177),ze={name:"Processes",components:{Process:()=>Oe.a.loadAsyncComponent(Promise.resolve().then(r.bind(null,464))),SearchableList:()=>Oe.a.loadAsyncComponent(Promise.resolve().then(r.bind(null,465)))},mixins:[He.a],props:{processes:{type:Array,default:()=>[]},provideDownload:{type:Boolean,default:!0},processUrl:String,searchTerm:{type:String,default:null},sort:{type:Boolean,default:!0},offerDetails:{type:Boolean,default:!0},heading:{type:String,default:"Processes"},collapsed:{type:Boolean,default:null},showCategories:{type:Boolean,default:!1},showGraph:{type:Boolean,default:!1},hideDeprecated:{type:Boolean,default:!1},deprecatedFilter:{type:Boolean,default:!1},hideExperimental:{type:Boolean,default:!1},experimentalFilter:{type:Boolean,default:!1},loadAdditionalData:{type:Function,default:null},missing:{type:Array,default:null},...He.a.props},beforeCreate(){Oe.a.enableHtmlProps(this)},methods:{detailsToggled(...e){this.$emit("detailsToggled",...e)}}},$e=(r(396),r(4)),Ve=Object($e.a)(ze,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component processes"},[t("SearchableList",{attrs:{data:e.processes,keywordsKey:"categories",showKeywords:e.showCategories,showSummaryOnExpand:!1,externalSearchTerm:e.searchTerm,externalHideDeprecated:e.hideDeprecated,deprecatedFilter:e.deprecatedFilter,externalHideExperimental:e.hideExperimental,experimentalFilter:e.experimentalFilter,sort:e.sort,offerDetails:e.offerDetails,heading:e.heading,collapsed:e.collapsed,loadAdditionalData:e.loadAdditionalData,allowCopy:""},on:{detailsToggled:e.detailsToggled},scopedSlots:e._u([{key:"heading",fn:function(t){return[e._t("heading",null,null,t)]}},e.missing?{key:"content-start",fn:function(){return[t("FederationMissingNotice",{attrs:{missing:e.missing,federation:e.federation}})]},proxy:!0}:null,{key:"summary",fn:function(t){return[e._t("summary",null,null,t)]}},{key:"details",fn:function(r){return[t("Process",{attrs:{process:r.item,provideDownload:e.provideDownload,processUrl:e.processUrl,showGraph:e.showGraph,federation:e.federation},scopedSlots:e._u([{key:"title",fn:function(){return[t("span",{staticClass:"hidden"})]},proxy:!0},{key:"before-description",fn:function(t){return[e._t("process-before-description",null,null,t)]}},{key:"end",fn:function(t){return[e._t("process-end",null,null,t)]}}],null,!0)})]}}],null,!0)})],1)}),[],!1,null,null,null).exports,Ge=r(465),Je=r(467),Ye=r(194),Ze={name:"DocGen",components:{Description:Me.default,LinkList:Fe.default,Process:Ie.default,Processes:Ve,SearchableList:Ge.default,SearchBox:Je.default},props:{title:{type:String,default:Le},document:{type:[String,Array,Object],default:Te},apiVersion:{type:String,default:ke},sortProcessesById:{type:Boolean,default:Pe},categorize:{type:Boolean,default:je},provideDownload:{type:Boolean,default:De},showTableOfContents:{type:Boolean,default:Ne},uncategorizedName:{type:String,default:Re},notice:{type:String,default:Be},showDeprecatedByDefault:{type:Boolean,default:qe},showExperimentalByDefault:{type:Boolean,default:Ue}},data(){return{hideNotice:!1,searchTerm:"",allCollapsedState:!0,hasResults:!0,showCategories:this.categorize,processes:[],categories:[],links:[],protocol:null,copied:null,canCopy:!1,showDeprecated:this.showDeprecatedByDefault,showExperimental:this.showExperimentalByDefault}},watch:{document(){this.changeDocument()},async processes(){await this.$nextTick(),this.moveToAnchor()},searchTerm(){this.updateCategoryView()},showCategories(){this.updateCategoryView()}},computed:{isLocalDocument(){return"file:"===this.protocol&&!this.document.match(/^https?:/i)}},mounted(){document.title=this.title,this.loadLink("https://use.fontawesome.com/releases/v5.13.0/webfonts/fa-solid-900.woff2",{rel:"preload",crossorigin:!0,as:"font",type:"font/woff2"}),this.loadLink("https://use.fontawesome.com/releases/v5.13.0/css/all.css",{rel:"stylesheet",media:"all",type:"text/css"}),this.protocol=window?window.location.protocol:null,this.changeDocument(),this.canCopy=navigator&&navigator.clipboard&&"function"==typeof navigator.clipboard.writeText},methods:{copyLink(e){if(this.canCopy){let t=new URL(window.location.href);t.hash=e,navigator.clipboard.writeText(t.toString()).then(()=>{this.copied=e,setTimeout(()=>this.copied=null,2e3)}).catch(()=>canCopy=!1)}},loadLink(e,t={}){t.href=e;let r=document.createElement("link");for(let e in t)r.setAttribute(e,t[e]);document.head.appendChild(r)},loadLocalFile(e){const t=new FileReader;t.onload=()=>{try{this.setProcesses(JSON.parse(t.result))}catch(e){alert(e.message),console.error(e)}},t.readAsText(e.target.files[0])},changeDocument(){"string"==typeof this.document&&this.document.length>0?this.isLocalDocument||Ce.get(this.document).then(e=>this.setProcesses(e.data)).catch(e=>console.error(e)):"object"==typeof this.document&&null!==this.document?this.setProcesses(this.document):console.error("Specified document is not a URL, array or object.")},setProcesses(e){Array.isArray(e)&&(e={processes:e}),Oe.a.isObject(e)&&Array.isArray(e.processes)||console.error("Invalid document specified, can't find processes."),e=Ye.MigrateProcesses.convertProcessesToLatestSpec(e,this.apiVersion),this.processes=e.processes,this.links=Array.isArray(e.links)?e.links:[],!0===this.sortProcessesById&&this.processes.sort((e,t)=>Oe.a.compareStringCaseInsensitive(e.id,t.id)),this.categories=[];for(let e of this.processes){let t=Array.isArray(e.categories)&&e.categories.length>0?e.categories:[this.uncategorizedName];for(let r of t){r=r.replace("_"," ");let t=this.categories.findIndex(e=>e.id===r);t>=0?this.categories[t].processes.push(e):this.categories.push({id:r,processes:[e]})}}this.categories.sort((e,t)=>Oe.a.compareStringCaseInsensitive(e.id,t.id))},moveToAnchor(){if("string"==typeof window.location.hash&&window.location.hash.length>1){var e=window.location.hash.substring(1),t=this.$el.querySelector("a[name="+e+"]");t&&t.scrollIntoView()}},switchCategoryView(){this.showCategories=!this.showCategories},expandAll(){this.toggleAll(!0)},collapseAll(){this.toggleAll(!1)},toggleAll(e){this.allCollapsedState=!e},async updateCategoryView(){await this.$nextTick(),this.hasResults=!0,this.toggleAll(this.searchTerm.length>=2),this.searchTerm.length>=2&&Array.isArray(this.$refs.categories)&&(this.hasResults=!!this.$refs.categories.find(e=>!e.$children[0].$el.classList.contains("noResults")))}}},Ke=(r(403),Object($e.a)(Ze,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"docgen"},[!e.isLocalDocument||e.processes.length||e.links.length?t("div",{staticClass:"page-container"},[e.showTableOfContents?t("aside",{staticClass:"menu-container"},[t("section",{staticClass:"toc"},[t("h2",[e._v(e._s(e.title))]),e._v(" "),t("SearchBox",{attrs:{placeholder:"Search in processes"},model:{value:e.searchTerm,callback:function(t){e.searchTerm=t},expression:"searchTerm"}}),e._v(" "),t("div",{staticClass:"filters"},[t("span",{staticClass:"label"},[e._v("\n\t\t\t\t\t\tShow\n\t\t\t\t\t")]),e._v(" "),t("label",{staticClass:"show-deprecated",attrs:{title:"Show deprecated elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.showDeprecated,expression:"showDeprecated"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.showDeprecated)?e._i(e.showDeprecated,null)>-1:e.showDeprecated},on:{change:function(t){var r=e.showDeprecated,n=t.target,i=!!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.showDeprecated=r.concat([null])):o>-1&&(e.showDeprecated=r.slice(0,o).concat(r.slice(o+1)))}else e.showDeprecated=i}}}),e._v("\n\t\t\t\t\t\tdeprecated\n\t\t\t\t\t")]),e._v(" "),t("label",{staticClass:"show-experimental",attrs:{title:"Show experimental elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.showExperimental,expression:"showExperimental"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.showExperimental)?e._i(e.showExperimental,null)>-1:e.showExperimental},on:{change:function(t){var r=e.showExperimental,n=t.target,i=!!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.showExperimental=r.concat([null])):o>-1&&(e.showExperimental=r.slice(0,o).concat(r.slice(o+1)))}else e.showExperimental=i}}}),e._v("\n\t\t\t\t\t\texperimental\n\t\t\t\t\t")])]),e._v(" "),t("ul",{staticClass:"controls"},[e.showCategories?t("li",[t("a",{attrs:{title:"Expand all"},on:{click:e.expandAll}},[t("i",{staticClass:"fas fa-angle-double-down"})])]):e._e(),e._v(" "),e.showCategories?t("li",[t("a",{attrs:{title:"Collapse all"},on:{click:e.collapseAll}},[t("i",{staticClass:"fas fa-angle-double-up"})])]):e._e(),e._v(" "),e.showCategories?t("li",[t("a",{attrs:{title:"Hide Categories"},on:{click:e.switchCategoryView}},[t("i",{staticClass:"fas fa-list-ol"})])]):t("li",[t("a",{attrs:{title:"Show Categories"},on:{click:e.switchCategoryView}},[t("i",{staticClass:"fas fa-folder"})])])]),e._v(" "),e.showCategories?[e._l(e.categories,(function(r){return t("Processes",{key:r.id,ref:"categories",refInFor:!0,staticClass:"categories",attrs:{processes:r.processes,searchTerm:e.searchTerm,offerDetails:!1,heading:r.id,collapsed:e.allCollapsedState,hideDeprecated:!e.showDeprecated,hideExperimental:!e.showExperimental},scopedSlots:e._u([{key:"summary",fn:function({summary:r}){return[t("a",{attrs:{href:"#"+r.identifier}},[t("strong",[e._v(e._s(r.identifier))])]),e._v(" "),r.summary?t("small",[e._v(e._s(r.summary))]):e._e()]}}],null,!0)})})),e._v(" "),e.hasResults?e._e():t("p",[e._v("No search results found.")])]:t("Processes",{attrs:{processes:e.processes,searchTerm:e.searchTerm,offerDetails:!1,heading:null,hideDeprecated:!e.showDeprecated,hideExperimental:!e.showExperimental},scopedSlots:e._u([{key:"summary",fn:function({summary:r}){return[t("a",{attrs:{href:"#"+r.identifier}},[t("strong",[e._v(e._s(r.identifier))])]),e._v(" "),r.summary?t("small",[e._v(e._s(r.summary))]):e._e()]}}],null,!1,2378471087)})],2),e._v(" "),t("section",{staticClass:"related-links"},[t("LinkList",{attrs:{links:e.links,heading:"Related Links",headingTag:"h3"}})],1)]):e._e(),e._v(" "),t("main",{staticClass:"content-container",class:{toc:e.showTableOfContents}},[!e.hideNotice&&e.notice?t("div",{staticClass:"notice"},[t("Description",{attrs:{description:e.notice}}),e._v(" "),t("button",{staticClass:"close",attrs:{type:"button",title:"Close"},on:{click:function(t){e.hideNotice=!0}}},[e._v("×")])],1):e._e(),e._v(" "),e._l(e.processes,(function(r){return t("Process",{key:r.id,ref:"processes",refInFor:!0,attrs:{process:r,provideDownload:e.provideDownload,sort:!1,processUrl:"#${}"},scopedSlots:e._u([{key:"title",fn:function(n){return[t("a",{staticClass:"anchor",attrs:{name:r.id}}),e._v(" "),t("h2",[e._v("\n\t\t\t\t\t\t"+e._s(r.id)+"\n\t\t\t\t\t\t"),e.canCopy?[e.copied===r.id?t("span",{staticClass:"copy success",attrs:{title:"Copied to clipboard"}},[t("i",{staticClass:"fas fa-clipboard-check"})]):t("span",{staticClass:"copy",attrs:{title:"Copy link for this process"},on:{click:function(t){return e.copyLink(r.id)}}},[t("i",{staticClass:"fas fa-clipboard"})])]:e._e(),e._v(" "),n.displayableNamespace?t("span",{staticClass:"namespace"},[e._v(" — "+e._s(n.displayableNamespace))]):e._e()],2)]}}],null,!0)})}))],2)]):t("div",{staticClass:"fileChooser"},[t("p",[e._v("\n\t\t\tSorry, can't automatically read files from the local file system.\n\t\t\tPlease specify the file to load here:\n\t\t\t"),t("input",{attrs:{type:"file"},on:{change:e.loadLocalFile}})])])])}),[],!1,null,null,null));t.default=Ke.exports}])]); \ No newline at end of file +t.read=function(e,t,r,n,i){var o,s,a=8*i-n-1,l=(1<>1,u=-7,p=r?i-1:0,f=r?-1:1,h=e[t+p];for(p+=f,o=h&(1<<-u)-1,h>>=-u,u+=a;u>0;o=256*o+e[t+p],p+=f,u-=8);for(s=o&(1<<-u)-1,o>>=-u,u+=n;u>0;s=256*s+e[t+p],p+=f,u-=8);if(0===o)o=1-c;else{if(o===l)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,n),o-=c}return(h?-1:1)*s*Math.pow(2,o-n)},t.write=function(e,t,r,n,i,o){var s,a,l,c=8*o-i-1,u=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=n?0:o-1,d=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=u):(s=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-s))<1&&(s--,l*=2),(t+=s+p>=1?f/l:f*Math.pow(2,1-p))*l>=2&&(s++,l/=2),s+p>=u?(a=0,s=u):s+p>=1?(a=(t*l-1)*Math.pow(2,i),s+=p):(a=t*Math.pow(2,p-1)*Math.pow(2,i),s=0));i>=8;e[r+h]=255&a,h+=d,a/=256,i-=8);for(s=s<0;e[r+h]=255&s,h+=d,s/=256,c-=8);e[r+h-d]|=128*m}},function(e,t){var r={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},function(e,t,r){"use strict";r(268)},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";r.r(t);function n(e){switch(e._type){case"document":case"block_quote":case"list":case"item":case"paragraph":case"heading":case"emph":case"strong":case"link":case"image":case"custom_inline":case"custom_block":return!0;default:return!1}}var i=function(e,t){this.current=e,this.entering=!0===t},o=function(){var e=this.current,t=this.entering;if(null===e)return null;var r=n(e);return t&&r?e._firstChild?(this.current=e._firstChild,this.entering=!0):this.entering=!1:e===this.root?this.current=null:null===e._next?(this.current=e._parent,this.entering=!1):(this.current=e._next,this.entering=!0),{entering:t,node:e}},s=function(e){return{current:e,root:e,entering:!0,next:o,resumeAt:i}},a=function(e,t){this._type=e,this._parent=null,this._firstChild=null,this._lastChild=null,this._prev=null,this._next=null,this._sourcepos=t,this._open=!0,this._string_content=null,this._literal=null,this._listData={},this._info=null,this._destination=null,this._title=null,this._isFenced=!1,this._fenceChar=null,this._fenceLength=0,this._fenceOffset=null,this._level=null,this._onEnter=null,this._onExit=null},l=a.prototype;Object.defineProperty(l,"isContainer",{get:function(){return n(this)}}),Object.defineProperty(l,"type",{get:function(){return this._type}}),Object.defineProperty(l,"firstChild",{get:function(){return this._firstChild}}),Object.defineProperty(l,"lastChild",{get:function(){return this._lastChild}}),Object.defineProperty(l,"next",{get:function(){return this._next}}),Object.defineProperty(l,"prev",{get:function(){return this._prev}}),Object.defineProperty(l,"parent",{get:function(){return this._parent}}),Object.defineProperty(l,"sourcepos",{get:function(){return this._sourcepos}}),Object.defineProperty(l,"literal",{get:function(){return this._literal},set:function(e){this._literal=e}}),Object.defineProperty(l,"destination",{get:function(){return this._destination},set:function(e){this._destination=e}}),Object.defineProperty(l,"title",{get:function(){return this._title},set:function(e){this._title=e}}),Object.defineProperty(l,"info",{get:function(){return this._info},set:function(e){this._info=e}}),Object.defineProperty(l,"level",{get:function(){return this._level},set:function(e){this._level=e}}),Object.defineProperty(l,"listType",{get:function(){return this._listData.type},set:function(e){this._listData.type=e}}),Object.defineProperty(l,"listTight",{get:function(){return this._listData.tight},set:function(e){this._listData.tight=e}}),Object.defineProperty(l,"listStart",{get:function(){return this._listData.start},set:function(e){this._listData.start=e}}),Object.defineProperty(l,"listDelimiter",{get:function(){return this._listData.delimiter},set:function(e){this._listData.delimiter=e}}),Object.defineProperty(l,"onEnter",{get:function(){return this._onEnter},set:function(e){this._onEnter=e}}),Object.defineProperty(l,"onExit",{get:function(){return this._onExit},set:function(e){this._onExit=e}}),a.prototype.appendChild=function(e){e.unlink(),e._parent=this,this._lastChild?(this._lastChild._next=e,e._prev=this._lastChild,this._lastChild=e):(this._firstChild=e,this._lastChild=e)},a.prototype.prependChild=function(e){e.unlink(),e._parent=this,this._firstChild?(this._firstChild._prev=e,e._next=this._firstChild,this._firstChild=e):(this._firstChild=e,this._lastChild=e)},a.prototype.unlink=function(){this._prev?this._prev._next=this._next:this._parent&&(this._parent._firstChild=this._next),this._next?this._next._prev=this._prev:this._parent&&(this._parent._lastChild=this._prev),this._parent=null,this._next=null,this._prev=null},a.prototype.insertAfter=function(e){e.unlink(),e._next=this._next,e._next&&(e._next._prev=e),e._prev=this,this._next=e,e._parent=this._parent,e._next||(e._parent._lastChild=e)},a.prototype.insertBefore=function(e){e.unlink(),e._prev=this._prev,e._prev&&(e._prev._next=e),e._next=this,this._prev=e,e._parent=this._parent,e._prev||(e._parent._firstChild=e)},a.prototype.walker=function(){return new s(this)};var c,u=a,p=r(353),f=r.n(p),h=r(239),d="&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});",m="<[A-Za-z][A-Za-z0-9-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*/?>",g="]",y=new RegExp("^(?:<[A-Za-z][A-Za-z0-9-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*/?>|]|\x3c!--\x3e|\x3c!---\x3e|\x3c!--(?:[^-]|-[^-]|--[^>])*--\x3e|[<][?][\\s\\S]*?[?][>]|]*>|)"),b=/[\\&]/,v="[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]",w=new RegExp("\\\\"+v+"|"+d,"gi"),_=new RegExp('[&<>"]',"g"),x=function(e){return 92===e.charCodeAt(0)?e.charAt(1):Object(h.decodeHTMLStrict)(e)},A=function(e){return b.test(e)?e.replace(w,x):e},S=function(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";default:return e}},E=function(e){return _.test(e)?e.replace(_,S):e};function C(e){return c(e)}if(String.fromCodePoint)c=function(e){try{return String.fromCodePoint(e)}catch(e){if(e instanceof RangeError)return String.fromCharCode(65533);throw e}};else{var O=String.fromCharCode,T=Math.floor;c=function(){var e,t,r=16384,n=[],i=-1,o=arguments.length;if(!o)return"";for(var s="";++i1114111||T(a)!==a)return String.fromCharCode(65533);a<=65535?n.push(a):(e=55296+((a-=65536)>>10),t=a%1024+56320,n.push(e,t)),(i+1===o||n.length>r)&&(s+=O.apply(null,n),n.length=0)}return s}}r(359);var k=function(e){try{return f()(e)}catch(t){return e}},L=A,P="\\\\[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]",j=y,R=new RegExp(/^[!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~\p{P}\p{S}]/u),D=new RegExp('^(?:"('+P+'|\\\\[^\\\\]|[^\\\\"\\x00])*"|\'('+P+"|\\\\[^\\\\]|[^\\\\'\\x00])*'|\\(("+P+"|\\\\[^\\\\]|[^\\\\()\\x00])*\\))"),N=/^(?:<(?:[^<>\n\\\x00]|\\.)*>)/,B=new RegExp("^[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]"),U=new RegExp("^&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});","i"),q=/`+/,M=/^`+/,F=/\.\.\./g,I=/--+/g,H=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,z=/^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]*>/i,$=/^ *(?:\n *)?/,V=/^[ \t\n\x0b\x0c\x0d]/,G=/^\s/,J=/ *$/,Y=/^ */,Z=/^ *(?:\n|$)/,K=/^\[(?:[^\\\[\]]|\\.){0,1000}\]/s,W=/^[^\n`\[\]\\!<&*_'"]+/m,X=function(e){var t=new u("text");return t._literal=e,t},Q=function(e){return e.slice(1,e.length-1).trim().replace(/[ \t\r\n]+/g," ").toLowerCase().toUpperCase()},ee=function(e){var t=e.exec(this.subject.slice(this.pos));return null===t?null:(this.pos+=t.index+t[0].length,t[0])},te=function(){return this.pos0&&null!==i.match(/[^ ]/)&&" "==i[0]&&" "==i[i.length-1]?n._literal=i.slice(1,i.length-1):n._literal=i,e.appendChild(n),!0;return this.pos=o,e.appendChild(X(t)),!0},ie=function(e){var t,r=this.subject;return this.pos+=1,10===this.peek()?(this.pos+=1,t=new u("linebreak"),e.appendChild(t)):B.test(r.charAt(this.pos))?(e.appendChild(X(r.charAt(this.pos))),this.pos+=1):e.appendChild(X("\\")),!0},oe=function(e){var t,r,n;return(t=this.match(H))?(r=t.slice(1,t.length-1),(n=new u("link"))._destination=k("mailto:"+r),n._title="",n.appendChild(X(r)),e.appendChild(n),!0):!!(t=this.match(z))&&(r=t.slice(1,t.length-1),(n=new u("link"))._destination=k(r),n._title="",n.appendChild(X(r)),e.appendChild(n),!0)},se=function(e){var t=this.match(j);if(null===t)return!1;var r=new u("html_inline");return r._literal=t,e.appendChild(r),!0},ae=function(e){var t,r,n,i,o,s,a,l,c,u,p,f=0,h=this.pos;if(39===e||34===e)f++,this.pos++;else for(;this.peek()===e;)f++,this.pos++;return 0===f?null:(t=0===h?"\n":this.subject.charAt(h-1),r=-1===(n=this.peek())?"\n":C(n),l=G.test(r),c=R.test(r),u=G.test(t),p=R.test(t),i=!l&&(!c||u||p),o=!u&&(!p||l||c),95===e?(s=i&&(!o||p),a=o&&(!i||c)):39===e||34===e?(s=i&&!o,a=o):(s=i,a=o),this.pos=h,{numdelims:f,can_open:s,can_close:a})},le=function(e,t){var r=this.scanDelims(e);if(!r)return!1;var n,i=r.numdelims,o=this.pos;this.pos+=i,n=39===e?"’":34===e?"“":this.subject.slice(o,this.pos);var s=X(n);return t.appendChild(s),(r.can_open||r.can_close)&&(this.options.smart||39!==e&&34!==e)&&(this.delimiters={cc:e,numdelims:i,origdelims:i,node:s,previous:this.delimiters,next:null,can_open:r.can_open,can_close:r.can_close},null!==this.delimiters.previous&&(this.delimiters.previous.next=this.delimiters)),!0},ce=function(e){null!==e.previous&&(e.previous.next=e.next),null===e.next?this.delimiters=e.previous:e.next.previous=e.previous},ue=function(e){for(var t,r,n,i,o,s,a,l,c,p,f,h,d,m=[],g=!1,y=0;y<14;y++)m[y]=e;for(r=this.delimiters;null!==r&&r.previous!==e;)r=r.previous;for(;null!==r;){var b=r.cc;if(r.can_close){switch(t=r.previous,p=!1,b){case 39:f=0;break;case 34:f=1;break;case 95:f=2+(r.can_open?3:0)+r.origdelims%3;break;case 42:f=8+(r.can_open?3:0)+r.origdelims%3}for(;null!==t&&t!==e&&t!==m[f];){if(g=(r.can_open||t.can_close)&&r.origdelims%3!=0&&(t.origdelims+r.origdelims)%3==0,t.cc===r.cc&&t.can_open&&!g){p=!0;break}t=t.previous}if(n=r,42===b||95===b)if(p){a=r.numdelims>=2&&t.numdelims>=2?2:1,i=t.node,o=r.node,t.numdelims-=a,r.numdelims-=a,i._literal=i._literal.slice(0,i._literal.length-a),o._literal=o._literal.slice(0,o._literal.length-a);var v=new u(1===a?"emph":"strong");for(l=i._next;l&&l!==o;)c=l._next,l.unlink(),v.appendChild(l),l=c;i.insertAfter(v),d=r,(h=t).next!==d&&(h.next=d,d.previous=h),0===t.numdelims&&(i.unlink(),this.removeDelimiter(t)),0===r.numdelims&&(o.unlink(),s=r.next,this.removeDelimiter(r),r=s)}else r=r.next;else 39===b?(r.node._literal="’",p&&(t.node._literal="‘"),r=r.next):34===b&&(r.node._literal="”",p&&(t.node.literal="“"),r=r.next);p||(m[f]=n.previous,n.can_open||this.removeDelimiter(n))}else r=r.next}for(;null!==this.delimiters&&this.delimiters!==e;)this.removeDelimiter(this.delimiters)},pe=function(){var e=this.match(D);return null===e?null:L(e.slice(1,-1))},fe=function(){var e=this.match(N);if(null===e){if(60===this.peek())return null;for(var t,r=this.pos,n=0;-1!==(t=this.peek());)if(92===t&&B.test(this.subject.charAt(this.pos+1)))this.pos+=1,-1!==this.peek()&&(this.pos+=1);else if(40===t)this.pos+=1,n+=1;else if(41===t){if(n<1)break;this.pos+=1,n-=1}else{if(null!==V.exec(C(t)))break;this.pos+=1}return this.pos===r&&41!==t||0!==n?null:(e=this.subject.slice(r,this.pos),k(L(e)))}return k(L(e.slice(1,-1)))},he=function(){var e=this.match(K);return null===e||e.length>1001?0:e.length},de=function(e){var t=this.pos;this.pos+=1;var r=X("[");return e.appendChild(r),this.addBracket(r,t,!1),!0},me=function(e){var t=this.pos;if(this.pos+=1,91===this.peek()){this.pos+=1;var r=X("![");e.appendChild(r),this.addBracket(r,t+1,!0)}else e.appendChild(X("!"));return!0},ge=function(e){var t,r,n,i,o,s,a=!1;if(this.pos+=1,t=this.pos,null===(s=this.brackets))return e.appendChild(X("]")),!0;if(!s.active)return e.appendChild(X("]")),this.removeBracket(),!0;r=s.image;var l=this.pos;if(40===this.peek()&&(this.pos++,this.spnl()&&null!==(n=this.parseLinkDestination())&&this.spnl()&&(V.test(this.subject.charAt(this.pos-1))&&(i=this.parseLinkTitle()),1)&&this.spnl()&&41===this.peek()?(this.pos+=1,a=!0):this.pos=l),!a){var c=this.pos,p=this.parseLinkLabel();if(p>2?o=this.subject.slice(c,c+p):s.bracketAfter||(o=this.subject.slice(s.index,t)),0===p&&(this.pos=l),o){var f=this.refmap[Q(o)];f&&(n=f.destination,i=f.title,a=!0)}}if(a){var h,d,m=new u(r?"image":"link");for(m._destination=n,m._title=i||"",h=s.node._next;h;)d=h._next,h.unlink(),m.appendChild(h),h=d;if(e.appendChild(m),this.processEmphasis(s.previousDelimiter),this.removeBracket(),s.node.unlink(),!r)for(s=this.brackets;null!==s;)s.image||(s.active=!1),s=s.previous;return!0}return this.removeBracket(),this.pos=t,e.appendChild(X("]")),!0},ye=function(e,t,r){null!==this.brackets&&(this.brackets.bracketAfter=!0),this.brackets={node:e,previous:this.brackets,previousDelimiter:this.delimiters,index:t,image:r,active:!0}},be=function(){this.brackets=this.brackets.previous},ve=function(e){var t;return!!(t=this.match(U))&&(e.appendChild(X(Object(h.decodeHTMLStrict)(t))),!0)},we=function(e){var t;return!!(t=this.match(W))&&(this.options.smart?e.appendChild(X(t.replace(F,"…").replace(I,(function(e){var t=0,r=0;return e.length%3==0?r=e.length/3:e.length%2==0?t=e.length/2:e.length%3==2?(t=1,r=(e.length-2)/3):(t=2,r=(e.length-4)/3),"—".repeat(r)+"–".repeat(t)})))):e.appendChild(X(t)),!0)},_e=function(e){this.pos+=1;var t=e._lastChild;if(t&&"text"===t.type&&" "===t._literal[t._literal.length-1]){var r=" "===t._literal[t._literal.length-2];t._literal=t._literal.replace(J,""),e.appendChild(new u(r?"linebreak":"softbreak"))}else e.appendChild(new u("softbreak"));return this.match(Y),!0},xe=function(e,t){var r,n,i,o;this.subject=e,this.pos=0;var s=this.pos;if(0===(o=this.parseLinkLabel()))return 0;if(r=this.subject.slice(0,o),58!==this.peek())return this.pos=s,0;if(this.pos++,this.spnl(),null===(n=this.parseLinkDestination()))return this.pos=s,0;var a=this.pos;this.spnl(),this.pos!==a&&(i=this.parseLinkTitle()),null===i&&(i="",this.pos=a);var l=!0;if(null===this.match(Z)&&(""===i?l=!1:(i="",this.pos=a,l=null!==this.match(Z))),!l)return this.pos=s,0;var c=Q(r);return""===c?(this.pos=s,0):(t[c]||(t[c]={destination:n,title:i}),this.pos-s)},Ae=function(e){var t=!1,r=this.peek();if(-1===r)return!1;switch(r){case 10:t=this.parseNewline(e);break;case 92:t=this.parseBackslash(e);break;case 96:t=this.parseBackticks(e);break;case 42:case 95:t=this.handleDelim(r,e);break;case 39:case 34:t=this.options.smart&&this.handleDelim(r,e);break;case 91:t=this.parseOpenBracket(e);break;case 33:t=this.parseBang(e);break;case 93:t=this.parseCloseBracket(e);break;case 60:t=this.parseAutolink(e)||this.parseHtmlTag(e);break;case 38:t=this.parseEntity(e);break;default:t=this.parseString(e)}return t||(this.pos+=1,e.appendChild(X(C(r)))),!0},Se=function(e){for(this.subject=e._string_content.trim(),this.pos=0,this.delimiters=null,this.brackets=null;this.parseInline(e););e._string_content=null,this.processEmphasis(null)};var Ee=function(e){return{subject:"",delimiters:null,brackets:null,pos:0,refmap:{},match:ee,peek:te,spnl:re,parseBackticks:ne,parseBackslash:ie,parseAutolink:oe,parseHtmlTag:se,scanDelims:ae,handleDelim:le,parseLinkTitle:pe,parseLinkDestination:fe,parseLinkLabel:he,parseOpenBracket:de,parseBang:me,parseCloseBracket:ge,addBracket:ye,removeBracket:be,parseEntity:ve,parseString:we,parseNewline:_e,parseReference:xe,parseInline:Ae,processEmphasis:ue,removeDelimiter:ce,options:e||{},parse:Se}},Ce=[/./,/^<(?:script|pre|textarea|style)(?:\s|>|$)/i,/^/,/\?>/,/>/,/\]\]>/],Te=/^(?:\*[ \t]*){3,}$|^(?:_[ \t]*){3,}$|^(?:-[ \t]*){3,}$/,ke=/^[#`~*+_=<>0-9-]/,Le=/[^ \t\f\v\r\n]/,Pe=/^[*+-]/,je=/^(\d{1,9})([.)])/,Re=/^#{1,6}(?:[ \t]+|$)/,De=/^`{3,}(?!.*`)|^~{3,}/,Ne=/^(?:`{3,}|~{3,})(?=[ \t]*$)/,Be=/^(?:=+|-+)[ \t]*$/,Ue=/\r\n|\n|\r/,qe=function(e){return 32===e||9===e},Me=function(e,t){return t=t._listData.markerOffset+t._listData.padding))return 1;e.advanceOffset(t._listData.markerOffset+t._listData.padding,!0)}return 0},finalize:function(e,t){t._lastChild?t.sourcepos[1]=t._lastChild.sourcepos[1]:(t.sourcepos[1][0]=t.sourcepos[0][0],t.sourcepos[1][1]=t._listData.markerOffset+t._listData.padding)},canContain:function(e){return"item"!==e},acceptsLines:!1},heading:{continue:function(){return 1},finalize:function(){},canContain:function(){return!1},acceptsLines:!1},thematic_break:{continue:function(){return 1},finalize:function(){},canContain:function(){return!1},acceptsLines:!1},code_block:{continue:function(e,t){var r=e.currentLine,n=e.indent;if(t._isFenced){var i=n<=3&&r.charAt(e.nextNonspace)===t._fenceChar&&r.slice(e.nextNonspace).match(Ne);if(i&&i[0].length>=t._fenceLength)return e.lastLineLength=e.offset+n+i[0].length,e.finalize(t,e.lineNumber),2;for(var o=t._fenceOffset;o>0&&qe(Me(r,e.offset));)e.advanceOffset(1,!0),o--}else if(n>=4)e.advanceOffset(4,!0);else{if(!e.blank)return 1;e.advanceNextNonspace()}return 0},finalize:function(e,t){if(t._isFenced){var r=t._string_content,n=r.indexOf("\n"),i=r.slice(0,n),o=r.slice(n+1);t.info=A(i.trim()),t._literal=o}else{for(var s=t._string_content.split("\n");/^[ \t]*$/.test(s[s.length-1]);)s.pop();t._literal=s.join("\n")+"\n",t.sourcepos[1][0]=t.sourcepos[0][0]+s.length-1,t.sourcepos[1][1]=t.sourcepos[0][1]+s[s.length-1].length-1}t._string_content=null},canContain:function(){return!1},acceptsLines:!0},html_block:{continue:function(e,t){return!e.blank||6!==t._htmlBlockType&&7!==t._htmlBlockType?0:1},finalize:function(e,t){t._literal=t._string_content.replace(/\n$/,""),t._string_content=null},canContain:function(){return!1},acceptsLines:!0},paragraph:{continue:function(e){return e.blank?1:0},finalize:function(){},canContain:function(){return!1},acceptsLines:!0}},Ve=[function(e){return e.indented||62!==Me(e.currentLine,e.nextNonspace)?0:(e.advanceNextNonspace(),e.advanceOffset(1,!1),qe(Me(e.currentLine,e.offset))&&e.advanceOffset(1,!0),e.closeUnmatchedBlocks(),e.addChild("block_quote",e.nextNonspace),1)},function(e){var t;if(!e.indented&&(t=e.currentLine.slice(e.nextNonspace).match(Re))){e.advanceNextNonspace(),e.advanceOffset(t[0].length,!1),e.closeUnmatchedBlocks();var r=e.addChild("heading",e.nextNonspace);return r.level=t[0].trim().length,r._string_content=e.currentLine.slice(e.offset).replace(/^[ \t]*#+[ \t]*$/,"").replace(/[ \t]+#+[ \t]*$/,""),e.advanceOffset(e.currentLine.length-e.offset),2}return 0},function(e){var t;if(!e.indented&&(t=e.currentLine.slice(e.nextNonspace).match(De))){var r=t[0].length;e.closeUnmatchedBlocks();var n=e.addChild("code_block",e.nextNonspace);return n._isFenced=!0,n._fenceLength=r,n._fenceChar=t[0][0],n._fenceOffset=e.indent,e.advanceNextNonspace(),e.advanceOffset(r,!1),2}return 0},function(e,t){if(!e.indented&&60===Me(e.currentLine,e.nextNonspace)){var r,n=e.currentLine.slice(e.nextNonspace);for(r=1;r<=7;r++){if(Ce[r].test(n)&&(r<7||"paragraph"!==t.type&&(e.allClosed||e.blank||"paragraph"!==e.tip.type)))return e.closeUnmatchedBlocks(),e.addChild("html_block",e.offset)._htmlBlockType=r,2}}return 0},function(e,t){var r;if(!e.indented&&"paragraph"===t.type&&(r=e.currentLine.slice(e.nextNonspace).match(Be))){var n;for(e.closeUnmatchedBlocks();91===Me(t._string_content,0)&&(n=e.inlineParser.parseReference(t._string_content,e.refmap));)t._string_content=t._string_content.slice(n);if(t._string_content.length>0){var i=new u("heading",t.sourcepos);return i.level="="===r[0][0]?1:2,i._string_content=t._string_content,t.insertAfter(i),t.unlink(),e.tip=i,e.advanceOffset(e.currentLine.length-e.offset,!1),2}return 0}return 0},function(e){return!e.indented&&Te.test(e.currentLine.slice(e.nextNonspace))?(e.closeUnmatchedBlocks(),e.addChild("thematic_break",e.nextNonspace),e.advanceOffset(e.currentLine.length-e.offset,!1),2):0},function(e,t){var r,n,i;return e.indented&&"list"!==t.type||!(r=function(e,t){var r,n,i,o,s=e.currentLine.slice(e.nextNonspace),a={type:null,tight:!0,bulletChar:null,start:null,delimiter:null,padding:null,markerOffset:e.indent};if(e.indent>=4)return null;if(r=s.match(Pe))a.type="bullet",a.bulletChar=r[0][0];else{if(!(r=s.match(je))||"paragraph"===t.type&&1!=r[1])return null;a.type="ordered",a.start=parseInt(r[1]),a.delimiter=r[2]}if(-1!==(n=Me(e.currentLine,e.nextNonspace+r[0].length))&&9!==n&&32!==n)return null;if("paragraph"===t.type&&!e.currentLine.slice(e.nextNonspace+r[0].length).match(Le))return null;e.advanceNextNonspace(),e.advanceOffset(r[0].length,!0),i=e.column,o=e.offset;do{e.advanceOffset(1,!0),n=Me(e.currentLine,e.offset)}while(e.column-i<5&&qe(n));var l=-1===Me(e.currentLine,e.offset),c=e.column-i;return c>=5||c<1||l?(a.padding=r[0].length+1,e.column=i,e.offset=o,qe(Me(e.currentLine,e.offset))&&e.advanceOffset(1,!0)):a.padding=r[0].length+c,a}(e,t))?0:(e.closeUnmatchedBlocks(),"list"===e.tip.type&&(n=t._listData,i=r,n.type===i.type&&n.delimiter===i.delimiter&&n.bulletChar===i.bulletChar)||((t=e.addChild("list",e.nextNonspace))._listData=r),(t=e.addChild("item",e.nextNonspace))._listData=r,1)},function(e){return e.indented&&"paragraph"!==e.tip.type&&!e.blank?(e.advanceOffset(4,!0),e.closeUnmatchedBlocks(),e.addChild("code_block",e.offset),2):0}],Ge=function(e,t){for(var r,n,i,o=this.currentLine;e>0&&(i=o[this.offset]);)"\t"===i?(r=4-this.column%4,t?(this.partiallyConsumedTab=r>e,n=r>e?e:r,this.column+=n,this.offset+=this.partiallyConsumedTab?0:1,e-=n):(this.partiallyConsumedTab=!1,this.column+=r,this.offset+=1,e-=1)):(this.partiallyConsumedTab=!1,this.offset+=1,this.column+=1,e-=1)},Je=function(){this.offset=this.nextNonspace,this.column=this.nextNonspaceColumn,this.partiallyConsumedTab=!1},Ye=function(){for(var e,t=this.currentLine,r=this.offset,n=this.column;""!==(e=t.charAt(r));)if(" "===e)r++,n++;else{if("\t"!==e)break;r++,n+=4-n%4}this.blank="\n"===e||"\r"===e||""===e,this.nextNonspace=r,this.nextNonspaceColumn=n,this.indent=this.nextNonspaceColumn-this.column,this.indented=this.indent>=4},Ze=function(e){var t,r,n=!0,i=this.doc;for(this.oldtip=this.tip,this.offset=0,this.column=0,this.blank=!1,this.partiallyConsumedTab=!1,this.lineNumber+=1,-1!==e.indexOf("\0")&&(e=e.replace(/\0/g,"�")),this.currentLine=e;(r=i._lastChild)&&r._open;){switch(i=r,this.findNextNonspace(),this.blocks[i.type].continue(this,i)){case 0:break;case 1:n=!1;break;case 2:return;default:throw"continue returned illegal value, must be 0, 1, or 2"}if(!n){i=i._parent;break}}this.allClosed=i===this.oldtip,this.lastMatchedContainer=i;for(var o="paragraph"!==i.type&&$e[i.type].acceptsLines,s=this.blockStarts,a=s.length;!o;){if(this.findNextNonspace(),!this.indented&&!ke.test(e.slice(this.nextNonspace))){this.advanceNextNonspace();break}for(var l=0;l=1&&i._htmlBlockType<=5&&Oe[i._htmlBlockType].test(this.currentLine.slice(this.offset))&&(this.lastLineLength=e.length,this.finalize(i,this.lineNumber))):this.offset')))},st.prototype.emph=function(e,t){this.tag(t?"em":"/em")},st.prototype.strong=function(e,t){this.tag(t?"strong":"/strong")},st.prototype.paragraph=function(e,t){var r=e.parent.parent,n=this.attrs(e);null!==r&&"list"===r.type&&r.listTight||(t?(this.cr(),this.tag("p",n)):(this.tag("/p"),this.cr()))},st.prototype.heading=function(e,t){var r="h"+e.level,n=this.attrs(e);t?(this.cr(),this.tag(r,n)):(this.tag("/"+r),this.cr())},st.prototype.code=function(e){this.tag("code"),this.out(e.literal),this.tag("/code")},st.prototype.code_block=function(e){var t=e.info?e.info.split(/\s+/):[],r=this.attrs(e);if(t.length>0&&t[0].length>0){var n=this.esc(t[0]);/^language-/.exec(n)||(n="language-"+n),r.push(["class",n])}this.cr(),this.tag("pre"),this.tag("code",r),this.out(e.literal),this.tag("/code"),this.tag("/pre"),this.cr()},st.prototype.thematic_break=function(e){var t=this.attrs(e);this.cr(),this.tag("hr",t,!0),this.cr()},st.prototype.block_quote=function(e,t){var r=this.attrs(e);t?(this.cr(),this.tag("blockquote",r),this.cr()):(this.cr(),this.tag("/blockquote"),this.cr())},st.prototype.list=function(e,t){var r="bullet"===e.listType?"ul":"ol",n=this.attrs(e);if(t){var i=e.listStart;null!==i&&1!==i&&n.push(["start",i.toString()]),this.cr(),this.tag(r,n),this.cr()}else this.cr(),this.tag("/"+r),this.cr()},st.prototype.item=function(e,t){var r=this.attrs(e);t?this.tag("li",r):(this.tag("/li"),this.cr())},st.prototype.custom_inline=function(e,t){t&&e.onEnter?this.lit(e.onEnter):!t&&e.onExit&&this.lit(e.onExit)},st.prototype.custom_block=function(e,t){this.cr(),t&&e.onEnter?this.lit(e.onEnter):!t&&e.onExit&&this.lit(e.onExit),this.cr()},st.prototype.esc=E,st.prototype.out=function(e){this.lit(this.esc(e))},st.prototype.tag=function(e,t,r){if(!(this.disableTags>0)){if(this.buffer+="<"+e,t&&t.length>0)for(var n,i=0;void 0!==(n=t[i]);)this.buffer+=" "+n[0]+'="'+n[1]+'"',i++;r&&(this.buffer+=" /"),this.buffer+=">",this.lastOut=">"}},st.prototype.attrs=function(e){var t=[];if(this.options.sourcepos){var r=e.sourcepos;r&&t.push(["data-sourcepos",String(r[0][0])+":"+String(r[0][1])+"-"+String(r[1][0])+":"+String(r[1][1])])}return t};var at=st,lt=/\<[^>]*\>/;function ct(e){e=e||{},this.disableTags=0,this.lastOut="\n",this.indentLevel=0,this.indent=" ",this.esc=e.esc||E,this.options=e}ct.prototype=Object.create(rt.prototype),ct.prototype.render=function(e){var t,r;this.buffer="";var n,i,o,s,a,l,c=e.walker(),u=this.options;for(u.time&&console.time("rendering"),this.buffer+='\n',this.buffer+='\n';n=c.next();)if(o=n.entering,l=(i=n.node).type,s=i.isContainer,a="thematic_break"===l||"linebreak"===l||"softbreak"===l,r=l.replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase(),o){switch(t=[],l){case"document":t.push(["xmlns","http://commonmark.org/xml/1.0"]);break;case"list":null!==i.listType&&t.push(["type",i.listType.toLowerCase()]),null!==i.listStart&&t.push(["start",String(i.listStart)]),null!==i.listTight&&t.push(["tight",i.listTight?"true":"false"]);var p=i.listDelimiter;if(null!==p){var f="";f="."===p?"period":"paren",t.push(["delimiter",f])}break;case"code_block":i.info&&t.push(["info",i.info]);break;case"heading":t.push(["level",String(i.level)]);break;case"link":case"image":t.push(["destination",i.destination]),t.push(["title",i.title]);break;case"custom_inline":case"custom_block":t.push(["on_enter",i.onEnter]),t.push(["on_exit",i.onExit])}if(u.sourcepos){var h=i.sourcepos;h&&t.push(["sourcepos",String(h[0][0])+":"+String(h[0][1])+"-"+String(h[1][0])+":"+String(h[1][1])])}if(this.cr(),this.out(this.tag(r,t,a)),s)this.indentLevel+=1;else if(!s&&!a){var d=i.literal;d&&this.out(this.esc(d)),this.out(this.tag("/"+r))}}else this.indentLevel-=1,this.cr(),this.out(this.tag("/"+r));return u.time&&console.timeEnd("rendering"),this.buffer+="\n",this.buffer},ct.prototype.out=function(e){this.disableTags>0?this.buffer+=e.replace(lt,""):this.buffer+=e,this.lastOut=e},ct.prototype.cr=function(){if("\n"!==this.lastOut){this.buffer+="\n",this.lastOut="\n";for(var e=this.indentLevel;e>0;e--)this.buffer+=this.indent}},ct.prototype.tag=function(e,t,r){var n="<"+e;if(t&&t.length>0)for(var i,o=0;void 0!==(i=t[o]);)n+=" "+i[0]+'="'+this.esc(i[1])+'"',o++;return r&&(n+=" /"),n+=">"},ct.prototype.esc=E;var ut=r(157),pt={name:"Description",props:{description:{type:String,default:""},preprocessor:{type:Function,default:null},processor:{type:Function,default:null},processUrl:{type:String,default:null},compact:{type:Boolean,default:!1},allowHTML:{type:Boolean,default:!1}},beforeCreate(){ut.a.enableHtmlProps(this)},methods:{markup(e){if("string"!=typeof e)return"";"string"==typeof this.processUrl&&(e=e.replace(/(^|[^\w`])``(\w+)\(\)``(?![\w`])/g,(e,t,r)=>`${t}@pid:${r}@@`));var t=new et,r=new at({safe:!this.allowHTML,smart:!0});"function"==typeof this.preprocessor&&(e=this.preprocessor(e));var n=t.parse(e),i=r.render(n);return"function"==typeof this.processor&&(i=this.processor(i)),"string"==typeof this.processUrl&&(i=i.replace(/@pid:(\w+)@@/g,(e,t)=>this.linkToProcess(t))),i},linkToProcess(e){return`${e}`}}},ft=(r(394),r(4)),ht=Object(ft.a)(pt,(function(){return(0,this._self._c)("div",{staticClass:"vue-component styled-description",class:{compact:this.compact},domProps:{innerHTML:this._s(this.markup(this.description))}})}),[],!1,null,null,null);t.default=ht.exports},,function(e,t,r){"use strict";r.r(t);var n=r(157),i={name:"ProcessExample",props:{id:Number,example:Object,processId:String,processParameters:Array,processUrl:String},components:{Description:()=>Promise.resolve().then(r.bind(null,464))},computed:{identifier(){return"#"+(this.id+1)},title(){return this.example.title?this.example.title+" ("+this.identifier+")":"Example "+this.identifier},renderedArguments(){var e=[];for(var t in this.processParameters){var r=this.processParameters[t];if(void 0!==this.example.arguments[r.name]){var i=this.example.arguments[r.name];let t;t=n.a.isObject(i)&&i.from_parameter?'$'+n.a.htmlentities(i.from_parameter)+"":n.a.isObject(i)&&i.from_node?'$'+n.a.htmlentities(i.from_node)+"":JSON.stringify(i),e.push(''+r.name+' = '+t+"")}}var o="";return void 0!==this.example.returns&&(o=' => '+JSON.stringify(this.example.returns)+""),''+this.processId+"("+e.join(", ")+")"+o}}},o=(r(396),r(4)),s=Object(o.a)(i,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component process-example"},[t("h4",[e._v(e._s(e.title))]),e._v(" "),t("div",{staticClass:"content"},[e.example.description?t("Description",{attrs:{description:e.example.description,processUrl:e.processUrl,compact:!0}}):e._e(),e._v(" "),e.example.arguments?t("div",{staticClass:"arguments"},[t("code",{domProps:{innerHTML:e._s(e.renderedArguments)}})]):e._e()],1)])}),[],!1,null,null,null).exports,a=r(177),l={name:"Process",components:{JsonSchema:()=>Promise.all([r.e(0),r.e(22)]).then(r.bind(null,470)),DeprecationNotice:()=>Promise.all([r.e(0),r.e(5)]).then(r.bind(null,486)),Description:()=>Promise.resolve().then(r.bind(null,464)),ExperimentalNotice:()=>Promise.all([r.e(0),r.e(6)]).then(r.bind(null,487)),ModelBuilder:()=>Promise.all([r.e(0),r.e(11)]).then(r.bind(null,463)),ProcessExample:s,ProcessParameter:()=>Promise.all([r.e(0),r.e(36)]).then(r.bind(null,227)),LinkList:()=>Promise.resolve().then(r.bind(null,468))},mixins:[a.a],props:{process:{type:Object,default:()=>({})},namespace:{type:String,default:null},provideDownload:{type:Boolean,default:!0},processUrl:String,showGraph:{type:Boolean,default:!1},...a.a.props},computed:{displayableNamespace(){let e=this.process.namespace||this.namespace;return"backend"===e?"":"user"===e?"user-defined":e},id(){return this.process.id||"unnamed"},parameters(){return Array.isArray(this.process.parameters)?this.process.parameters:[]},returns(){return n.a.isObject(this.process.returns)?this.process.returns:{}},signature(e=!0){return n.a.formatProcessSignature(this,e)},exampleLinks(){return Array.isArray(this.process.links)?this.process.links.filter(e=>"example"===e.rel):[]}},beforeCreate(){n.a.enableHtmlProps(this)},methods:{hasElements:e=>"object"==typeof e&&null!==e&&Object.keys(e).length>0,formatCategory:e=>e.replace("_"," "),download(){let e="data:application/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(this.process,null,2)),t=document.createElement("a");t.setAttribute("href",e),t.setAttribute("download",this.id+".json"),document.body.appendChild(t),t.click(),t.remove()}}},c=(r(397),Object(o.a)(l,(function(){var e=this,t=e._self._c;return t("article",{staticClass:"vue-component process"},[e.process.id?e._t("title",(function(){return[t("a",{staticClass:"anchor",attrs:{name:e.process.id}}),e._v(" "),t("h2",[e._v("\n\t\t\t"+e._s(e.process.id)+"\n\t\t\t"),e.displayableNamespace?t("span",{staticClass:"namespace"},[e._v(" — "+e._s(e.displayableNamespace))]):e._e()])]}),{vBind:e.$props,displayableNamespace:e.displayableNamespace}):e._e(),e._v(" "),e.process.summary||e.process.deprecated||e.process.experimental?[t("summary",[e._v("\n\t\t\t"+e._s(e.process.summary)+"\n\t\t\t"),e.process.deprecated||e.process.experimental?[e.process.summary?[e._v(" — ")]:e._e(),e._v(" "),e.process.deprecated?t("strong",{staticClass:"deprecated"},[e._v("deprecated")]):e._e(),e._v(" "),e.process.experimental?t("strong",{staticClass:"experimental"},[e._v("experimental")]):e._e()]:e._e()],2)]:e._e(),e._v(" "),e.provideDownload||e.hasElements(e.process.categories)?[t("div",{staticClass:"process-bar"},[e.hasElements(e.process.categories)?t("ul",{staticClass:"badges categories"},e._l(e.process.categories,(function(r){return t("li",{key:r,staticClass:"badge category",domProps:{textContent:e._s(e.formatCategory(r))}})})),0):e._e(),e._v(" "),e.provideDownload?t("ul",{staticClass:"badges actions"},[t("li",{staticClass:"badge action download"},[t("a",{staticClass:"badge-fill",on:{click:e.download}},[e._v("Download JSON")])])]):e._e()])]:e._e(),e._v(" "),e._t("before-description",null,{vBind:e.$props}),e._v(" "),e.process.description?t("section",{staticClass:"description"},[t("h3",[e._v("Description")]),e._v(" "),t("code",{staticClass:"signature",domProps:{innerHTML:e._s(e.signature)}}),e._v(" "),t("Description",{attrs:{description:e.process.description,processUrl:e.processUrl}}),e._v(" "),e.process.deprecated?t("DeprecationNotice",{attrs:{entity:"process"}}):e._e(),e._v(" "),e.process.experimental?t("ExperimentalNotice",{attrs:{entity:"process"}}):e._e(),e._v(" "),e.process["federation:backends"]?t("FederationNotice",{attrs:{backends:e.process["federation:backends"],federation:e.federation,entity:"process"}}):e._e()],1):e._e(),e._v(" "),t("section",{staticClass:"parameters"},[t("h3",[e._v("Parameters")]),e._v(" "),e._l(e.parameters,(function(r){return t("ProcessParameter",{key:r.name,attrs:{parameter:r,processUrl:e.processUrl,federation:e.federation}})})),e._v(" "),0===e.parameters.length?t("p",[e._v("This process has no parameters.")]):e._e()],2),e._v(" "),t("section",{staticClass:"returns"},[t("h3",[e._v("Return Value")]),e._v(" "),e.returns.description||e.returns.schema?[e.returns.description?t("Description",{attrs:{description:e.returns.description,processUrl:e.processUrl}}):e._e(),e._v(" "),e.returns.schema?t("div",{staticClass:"json-schema-container"},[t("JsonSchema",{attrs:{schema:e.returns.schema}})],1):e._e()]:t("p",[e._v("The return value has not been defined.")])],2),e._v(" "),e.hasElements(e.process.exceptions)?t("section",{staticClass:"exceptions"},[t("h3",[e._v("Errors/Exceptions")]),e._v(" "),t("ul",e._l(e.process.exceptions,(function(r,n){return t("li",{key:n,staticClass:"exception"},[t("code",[e._v(e._s(n))]),e._v(" "),r.http?t("span",{staticClass:"http-code"},[e._v(" — HTTP "+e._s(r.http))]):e._e(),e._v(" "),r.code?t("span",{staticClass:"error-code"},[e._v(" — "+e._s(r.code))]):e._e(),e._v(" "),r.description?t("Description",{attrs:{description:r.description,processUrl:e.processUrl,compact:!0}}):e._e(),e._v(" "),r.message?t("div",{staticClass:"message"},[e._v("Message: "),t("em",[e._v(e._s(r.message))])]):e._e()],1)})),0)]):e._e(),e._v(" "),e.hasElements(e.process.examples)?t("section",{staticClass:"examples"},[t("h3",[e._v("Examples")]),e._v(" "),e._l(e.process.examples,(function(r,n){return t("ProcessExample",{key:n,attrs:{id:n,example:r,processId:e.id,processParameters:e.parameters,processUrl:e.processUrl}})})),e._v(" "),t("LinkList",{attrs:{links:e.exampleLinks,heading:"Processes",headingTag:"h4"}})],2):e._e(),e._v(" "),t("section",{staticClass:"links"},[t("LinkList",{attrs:{links:e.process.links,heading:"See Also",headingTag:"h3",ignoreRel:["self","example"]}})],1),e._v(" "),e.showGraph&&e.process.process_graph?t("section",{staticClass:"process-graph"},[t("h3",[e._v("Processing Instructions")]),e._v(" "),t("div",{staticClass:"graph"},[e._t("process-graph",(function(){return[t("ModelBuilder",{attrs:{id:e.id,value:e.process,explicitZoom:!0}})]}),{vBind:e.$props})],2)]):e._e(),e._v(" "),e._t("end",null,{vBind:e.$props})],2)}),[],!1,null,null,null));t.default=c.exports},function(e,t,r){"use strict";r.r(t);var n=r(157),i=r(295),o={data:()=>({canCopy:!1}),mounted(){this.canCopy=navigator&&navigator.clipboard&&"function"==typeof navigator.clipboard.writeText},methods:{copyText(e,t=null,r=null){if(this.canCopy){const n=navigator.clipboard.writeText(e);t&&n.then(t),r&&n.catch(r)}},toggleIcon(e,t){if(e){let r=e.innerText;e.innerText=t,setTimeout(()=>e.innerText=r,2e3)}}}},s=r(0),a={name:"SearchableList",components:{Loading:i.a,SearchBox:()=>Promise.resolve().then(r.bind(null,469))},mixins:[o],props:{data:{type:[Array,Object],default:()=>[]},identifierKey:{type:String,default:"id"},summaryKey:{type:String,default:"summary"},keywordsKey:{type:String,default:null},showKeywords:{type:Boolean,default:!1},externalSearchTerm:{type:String,default:null},searchPlaceholder:{type:String,default:"Search"},sort:{type:Boolean,default:!0},offerDetails:{type:Boolean,default:!0},showSummaryOnExpand:{type:Boolean,default:!0},heading:{type:String,default:null},collapsed:{type:Boolean,default:null},searchMinLength:{type:Number,default:2},loadAdditionalData:{type:Function,default:null},allowCopy:{type:Boolean,default:!1},externalHideDeprecated:{type:Boolean,default:!1},deprecatedFilter:{type:Boolean,default:!1},externalHideExperimental:{type:Boolean,default:!1},experimentalFilter:{type:Boolean,default:!1}},data(){return{searchTerm:"",showDetails:{},showList:!this.collapsed||null,hideDeprecated:this.externalHideDeprecated,hideExperimental:this.externalHideExperimental,summaries:[]}},watch:{loadAdditionalData:{handler(){this.generateSummaries(this.summaries)}},data:{immediate:!0,handler(e,t){e!==t&&this.generateSummaries(e)}},externalSearchTerm:{immediate:!0,handler(e){this.searchTerm="string"==typeof e?e:""}},externalHideDeprecated:{immediate:!0,handler(e){this.hideDeprecated=e}},externalHideExperimental:{immediate:!0,handler(e){this.hideExperimental=e}},summaries:{immediate:!0,handler(){this.$emit("summaries",this.summaries)}},searchTerm(){this.filter()},hideDeprecated(){null!==this.hideDeprecatedByDefault&&this.filter()},hideExperimental(){null!==this.hideExperimentalByDefault&&this.filter()},collapsed(e){!1===e?this.showList=!0:null!==this.showList&&(this.showList=!1)}},computed:{totalCount(){return n.a.size(this.data)},filteredCount(){return this.hasActiveFilter()?this.summaries.filter(e=>!0===e.show).length:null}},created(){this.filter()},methods:{hasActiveFilter(){return this.searchTerm.length>=this.searchMinLength||null!==this.hideDeprecatedByDefault&&this.hideDeprecated||null!==this.hideExperimentalByDefault&&this.hideExperimental},filter(){const e=this.searchTerm.length>=this.searchMinLength;this.summaries.forEach(t=>{let r=!0;null!==this.hideDeprecatedByDefault&&this.hideDeprecated&&t.deprecated||null!==this.hideExperimentalByDefault&&this.hideExperimental&&t.experimental?r=!1:e&&(r=n.a.search(this.searchTerm,[t.identifier,t.summary].concat(t.keywords))),this.$set(t,"show",r)}),this.$emit("summaries",this.summaries)},copyIdentifier(e,t){if(this.allowCopy){const r=e.composedPath()[0];this.copyText(t.identifier,()=>this.toggleIcon(r,"✅"),()=>this.toggleIcon(r,"❌"))}},generateSummaries(){let e="function"==typeof this.loadAdditionalData,t=[];for(let r in this.data){let n=this.data[r],i={identifier:r,summary:"",show:!0,loaded:!e,index:r,experimental:n.experimental,deprecated:n.deprecated,data:null};"string"==typeof this.identifierKey&&"string"==typeof n[this.identifierKey]&&(i.identifier=n[this.identifierKey]),"string"==typeof this.summaryKey&&"string"==typeof n[this.summaryKey]&&(i.summary=n[this.summaryKey]),"string"==typeof this.keywordsKey&&Array.isArray(n[this.keywordsKey])?i.keywords=n[this.keywordsKey]:i.keywords=[];let o=s.a.observable(i);o.data=n,t.push(o)}this.sort&&t.sort((e,t)=>n.a.compareStringCaseInsensitive(e.identifier,t.identifier)),this.summaries=t},toggleHeading(e=null){null!==this.collapsed&&(this.showList=null===e?!this.showList:e,this.$emit("headingToggled",this.showList),this.$parent&&this.$parent.$emit("headingToggled",this.showList))},async toggleDetails(e,t){if(!this.offerDetails)return;if(void 0===t&&(t=!this.showDetails[e]),void 0===this.showDetails[e]&&!1===t)return;this.$set(this.showDetails,e,t);let r=this.summaries[e];if(t&&"function"==typeof this.loadAdditionalData&&!r.loaded)try{r.data=await this.loadAdditionalData(r.index,r.identifier,r.data),r.loaded=!0}catch(e){console.error(e)}this.$emit("detailsToggled",t,r.index,r.identifier,r.data)}}},l=(r(399),r(4)),c=Object(l.a)(a,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component searchable-list",class:{expandable:null!==e.collapsed,expanded:e.showList,noResults:0===e.filteredCount}},[e._t("heading",(function(){return[e.heading?t("h2",{staticClass:"heading",on:{click:function(t){return e.toggleHeading(null)}}},[e._v("\n\t\t\t"+e._s(e.heading)+"\n\t\t\t"),null!==e.filteredCount&&e.filteredCount!==e.totalCount?[e._v("("+e._s(e.filteredCount)+"/"+e._s(e.totalCount)+")")]:[e._v("("+e._s(e.totalCount)+")")]],2):e._e()]}),{filteredCount:e.filteredCount,totalCount:e.totalCount}),e._v(" "),null!==e.showList?t("div",{directives:[{name:"show",rawName:"v-show",value:!0===e.showList,expression:"showList === true"}],staticClass:"body"},[e._t("content-start"),e._v(" "),0===e.totalCount?[t("p",[e._v("No data available.")])]:[t("section",{staticClass:"action-bar"},[null===e.externalSearchTerm?t("SearchBox",{attrs:{placeholder:e.searchPlaceholder,minLength:e.searchMinLength},model:{value:e.searchTerm,callback:function(t){e.searchTerm=t},expression:"searchTerm"}}):e._e(),e._v(" "),e.deprecatedFilter?t("label",{staticClass:"deprecated",attrs:{title:"Show deprecated elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.hideDeprecated,expression:"hideDeprecated"}],attrs:{type:"checkbox","true-value":!1,"false-value":!0},domProps:{checked:Array.isArray(e.hideDeprecated)?e._i(e.hideDeprecated,null)>-1:e._q(e.hideDeprecated,!1)},on:{change:function(t){var r=e.hideDeprecated,n=t.target,i=!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.hideDeprecated=r.concat([null])):o>-1&&(e.hideDeprecated=r.slice(0,o).concat(r.slice(o+1)))}else e.hideDeprecated=i}}}),e._v("\n\t\t\t\t\tShow deprecated\n\t\t\t\t")]):e._e(),e._v(" "),e.experimentalFilter?t("label",{staticClass:"experimental",attrs:{title:"Show experimental elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.hideExperimental,expression:"hideExperimental"}],attrs:{type:"checkbox","true-value":!1,"false-value":!0},domProps:{checked:Array.isArray(e.hideExperimental)?e._i(e.hideExperimental,null)>-1:e._q(e.hideExperimental,!1)},on:{change:function(t){var r=e.hideExperimental,n=t.target,i=!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.hideExperimental=r.concat([null])):o>-1&&(e.hideExperimental=r.slice(0,o).concat(r.slice(o+1)))}else e.hideExperimental=i}}}),e._v("\n\t\t\t\t\tShow experimental\n\t\t\t\t")]):e._e()],1),e._v(" "),e._t("after-search-box",null,{filteredCount:e.filteredCount,summaries:e.summaries}),e._v(" "),0===e.filteredCount?t("p",[e._v("No search results found.")]):t("ul",{staticClass:"list",class:{expandable:e.offerDetails}},e._l(e.summaries,(function(r,n){return t("li",{directives:[{name:"show",rawName:"v-show",value:r.show,expression:"summary.show"}],key:r.identifier,class:{expanded:e.showDetails[n]}},[t("summary",{staticClass:"summary",class:{experimental:r.experimental,deprecated:r.deprecated},on:{click:function(t){return e.toggleDetails(n)}}},[e._t("summary",(function(){return[t("strong",[e._v("\n\t\t\t\t\t\t\t\t"+e._s(r.identifier)+"\n\t\t\t\t\t\t\t\t"),e.allowCopy&&e.canCopy?t("span",{staticClass:"copy",attrs:{title:"Copy identifier"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),e.copyIdentifier(t,r)}}},[e._v("📋")]):e._e()]),e._v(" "),r.summary?t("small",{class:{hideOnExpand:!e.showSummaryOnExpand}},[e._v(e._s(r.summary))]):e._e(),e._v(" "),e.showKeywords&&r.keywords.length>0?t("ul",{staticClass:"badges small block hideOnExpand"},e._l(r.keywords,(function(r){return t("li",{key:r,staticClass:"badge"},[e._v(e._s(r))])})),0):e._e()]}),{summary:r,item:r.data})],2),e._v(" "),"boolean"==typeof e.showDetails[n]?t("div",{directives:[{name:"show",rawName:"v-show",value:!0===e.showDetails[n],expression:"showDetails[i] === true"}],staticClass:"details"},[r.loaded?e._t("details",(function(){return[e._v("\n\t\t\t\t\t\t\tNo details available!\n\t\t\t\t\t\t")]}),{summary:r,item:r.data}):t("Loading")],2):e._e()])})),0)]],2):e._e()],2)}),[],!1,null,null,null);t.default=c.exports},function(e,t,r){"use strict";r.r(t);var n=r(157),i={name:"LinkList",props:{links:{type:Array,default:()=>[]},sort:{type:Boolean,default:!0},heading:{type:String,default:null},headingTag:{type:String,default:"strong"},ignoreRel:{type:Array,default:()=>["self"]},showRel:{type:Boolean,default:!1}},computed:{friendlyLinks(){return n.a.friendlyLinks(this.links,this.sort,this.ignoreRel)}},beforeCreate(){n.a.enableHtmlProps(this)}},o=(r(395),r(4)),s=Object(o.a)(i,(function(){var e=this,t=e._self._c;return e.friendlyLinks.length>0?t("div",{staticClass:"vue-component link-list"},[e.heading?t(e.headingTag,{tag:"component"},[e._v(e._s(e.heading))]):e._e(),e._v(" "),t("ul",e._l(e.friendlyLinks,(function(r,n){return t("li",{key:n},[t("a",{attrs:{href:r.href,target:"_blank",rel:r.rel}},[e._v(e._s(r.title))]),e._v(" "),e.showRel&&r.rel?t("span",{staticClass:"relation"},[e._v(" ("+e._s(r.rel)+")")]):e._e()])})),0)],1):e._e()}),[],!1,null,null,null);t.default=s.exports},function(e,t,r){"use strict";r.r(t);var n={name:"SearchBox",props:{value:{type:String,default:""},placeholder:{type:String,default:"Search"},minLength:{type:Number,default:1},compact:{type:Boolean,default:!1}},data(){return{searchTerm:this.value}},watch:{searchTerm(e,t){e.length1?`Searching requires at least ${this.minLength} characters.`:null}}},i=(r(400),r(4)),o=Object(i.a)(n,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component search-box",class:{compact:e.compact}},[t("span",{staticClass:"icon"},[e._v("🔎")]),e._v(" "),t("input",{directives:[{name:"model",rawName:"v-model",value:e.searchTerm,expression:"searchTerm"}],attrs:{type:"search",placeholder:e.placeholder,minlength:e.minLength,title:e.searchHint},domProps:{value:e.searchTerm},on:{input:function(t){t.target.composing||(e.searchTerm=t.target.value)}}})])}),[],!1,null,null,null);t.default=o.exports},,,,,,,function(e,t,r){"use strict";r.r(t);var n={};r.r(n),r.d(n,"hasBrowserEnv",(function(){return y})),r.d(n,"hasStandardBrowserWebWorkerEnv",(function(){return w})),r.d(n,"hasStandardBrowserEnv",(function(){return b})),r.d(n,"origin",(function(){return _}));var i=r(156),o=r(266),s=r(203);function a(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function l(e,t){this._pairs=[],e&&Object(s.a)(e,this,t)}const c=l.prototype;c.append=function(e,t){this._pairs.push([e,t])},c.toString=function(e){const t=e?function(t){return e.call(this,t,a)}:a;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var u=l;function p(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function f(e,t,r){if(!t)return e;const n=r&&r.encode||p,o=r&&r.serialize;let s;if(s=o?o(t,r):i.a.isURLSearchParams(t)?t.toString():new u(t,r).toString(n),s){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}var h=class{constructor(){this.handlers=[]}use(e,t,r){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!r&&r.synchronous,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){i.a.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},d=r(166),m={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},g={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:u,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const y="undefined"!=typeof window&&"undefined"!=typeof document,b=(v="undefined"!=typeof navigator&&navigator.product,y&&["ReactNative","NativeScript","NS"].indexOf(v)<0);var v;const w="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,_=y&&window.location.href||"http://localhost";var x={...n,...g};var A=function(e){function t(e,r,n,o){let s=e[o++];if("__proto__"===s)return!0;const a=Number.isFinite(+s),l=o>=e.length;if(s=!s&&i.a.isArray(n)?n.length:s,l)return i.a.hasOwnProp(n,s)?n[s]=[n[s],r]:n[s]=r,!a;n[s]&&i.a.isObject(n[s])||(n[s]=[]);return t(e,r,n[s],o)&&i.a.isArray(n[s])&&(n[s]=function(e){const t={},r=Object.keys(e);let n;const i=r.length;let o;for(n=0;n{t(function(e){return i.a.matchAll(/\w+|\[(\w*)]/g,e).map(e=>"[]"===e[0]?"":e[1]||e[0])}(e),n,r,0)}),r}return null};const S={transitional:m,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const r=t.getContentType()||"",n=r.indexOf("application/json")>-1,o=i.a.isObject(e);o&&i.a.isHTMLForm(e)&&(e=new FormData(e));if(i.a.isFormData(e))return n?JSON.stringify(A(e)):e;if(i.a.isArrayBuffer(e)||i.a.isBuffer(e)||i.a.isStream(e)||i.a.isFile(e)||i.a.isBlob(e)||i.a.isReadableStream(e))return e;if(i.a.isArrayBufferView(e))return e.buffer;if(i.a.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let a;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Object(s.a)(e,new x.classes.URLSearchParams,Object.assign({visitor:function(e,t,r,n){return x.isNode&&i.a.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((a=i.a.isFileList(e))||r.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return Object(s.a)(a?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||n?(t.setContentType("application/json",!1),function(e,t,r){if(i.a.isString(e))try{return(t||JSON.parse)(e),i.a.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(r||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||S.transitional,r=t&&t.forcedJSONParsing,n="json"===this.responseType;if(i.a.isResponse(e)||i.a.isReadableStream(e))return e;if(e&&i.a.isString(e)&&(r&&!this.responseType||n)){const r=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e)}catch(e){if(r){if("SyntaxError"===e.name)throw d.a.from(e,d.a.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:x.classes.FormData,Blob:x.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};i.a.forEach(["delete","get","head","post","put","patch"],e=>{S.headers[e]={}});var E=S;const C=i.a.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);const O=Symbol("internals");function T(e){return e&&String(e).trim().toLowerCase()}function k(e){return!1===e||null==e?e:i.a.isArray(e)?e.map(k):String(e)}function L(e,t,r,n,o){return i.a.isFunction(n)?n.call(this,t,r):(o&&(t=r),i.a.isString(t)?i.a.isString(n)?-1!==t.indexOf(n):i.a.isRegExp(n)?n.test(t):void 0:void 0)}class P{constructor(e){e&&this.set(e)}set(e,t,r){const n=this;function o(e,t,r){const o=T(t);if(!o)throw new Error("header name must be a non-empty string");const s=i.a.findKey(n,o);(!s||void 0===n[s]||!0===r||void 0===r&&!1!==n[s])&&(n[s||t]=k(e))}const s=(e,t)=>i.a.forEach(e,(e,r)=>o(e,r,t));if(i.a.isPlainObject(e)||e instanceof this.constructor)s(e,t);else if(i.a.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))s((e=>{const t={};let r,n,i;return e&&e.split("\n").forEach((function(e){i=e.indexOf(":"),r=e.substring(0,i).trim().toLowerCase(),n=e.substring(i+1).trim(),!r||t[r]&&C[r]||("set-cookie"===r?t[r]?t[r].push(n):t[r]=[n]:t[r]=t[r]?t[r]+", "+n:n)})),t})(e),t);else if(i.a.isHeaders(e))for(const[t,n]of e.entries())o(n,t,r);else null!=e&&o(t,e,r);return this}get(e,t){if(e=T(e)){const r=i.a.findKey(this,e);if(r){const e=this[r];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=r.exec(e);)t[n[1]]=n[2];return t}(e);if(i.a.isFunction(t))return t.call(this,e,r);if(i.a.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=T(e)){const r=i.a.findKey(this,e);return!(!r||void 0===this[r]||t&&!L(0,this[r],r,t))}return!1}delete(e,t){const r=this;let n=!1;function o(e){if(e=T(e)){const o=i.a.findKey(r,e);!o||t&&!L(0,r[o],o,t)||(delete r[o],n=!0)}}return i.a.isArray(e)?e.forEach(o):o(e),n}clear(e){const t=Object.keys(this);let r=t.length,n=!1;for(;r--;){const i=t[r];e&&!L(0,this[i],i,e,!0)||(delete this[i],n=!0)}return n}normalize(e){const t=this,r={};return i.a.forEach(this,(n,o)=>{const s=i.a.findKey(r,o);if(s)return t[s]=k(n),void delete t[o];const a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,r)=>t.toUpperCase()+r)}(o):String(o).trim();a!==o&&delete t[o],t[a]=k(n),r[a]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return i.a.forEach(this,(r,n)=>{null!=r&&!1!==r&&(t[n]=e&&i.a.isArray(r)?r.join(", "):r)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+": "+t).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const r=new this(e);return t.forEach(e=>r.set(e)),r}static accessor(e){const t=(this[O]=this[O]={accessors:{}}).accessors,r=this.prototype;function n(e){const n=T(e);t[n]||(!function(e,t){const r=i.a.toCamelCase(" "+t);["get","set","has"].forEach(n=>{Object.defineProperty(e,n+r,{value:function(e,r,i){return this[n].call(this,t,e,r,i)},configurable:!0})})}(r,e),t[n]=!0)}return i.a.isArray(e)?e.forEach(n):n(e),this}}P.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),i.a.reduceDescriptors(P.prototype,({value:e},t)=>{let r=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[r]=e}}}),i.a.freezeMethods(P);var j=P;function R(e,t){const r=this||E,n=t||r,o=j.from(n.headers);let s=n.data;return i.a.forEach(e,(function(e){s=e.call(r,s,o.normalize(),t?t.status:void 0)})),o.normalize(),s}function D(e){return!(!e||!e.__CANCEL__)}function N(e,t,r){d.a.call(this,null==e?"canceled":e,d.a.ERR_CANCELED,t,r),this.name="CanceledError"}i.a.inherits(N,d.a,{__CANCEL__:!0});var B=N,U=r(267);function q(e,t,r){const n=r.config.validateStatus;r.status&&n&&!n(r.status)?t(new d.a("Request failed with status code "+r.status,[d.a.ERR_BAD_REQUEST,d.a.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r)):e(r)}var M=function(e,t){e=e||10;const r=new Array(e),n=new Array(e);let i,o=0,s=0;return t=void 0!==t?t:1e3,function(a){const l=Date.now(),c=n[s];i||(i=l),r[o]=a,n[o]=l;let u=s,p=0;for(;u!==o;)p+=r[u++],u%=e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),l-in)return i&&(clearTimeout(i),i=null),r=o,e.apply(null,arguments);i||(i=setTimeout(()=>(i=null,r=Date.now(),e.apply(null,arguments)),n-(o-r)))}},I=(e,t,r=3)=>{let n=0;const i=M(50,250);return F(r=>{const o=r.loaded,s=r.lengthComputable?r.total:void 0,a=o-n,l=i(a);n=o;const c={loaded:o,total:s,progress:s?o/s:void 0,bytes:a,rate:l||void 0,estimated:l&&s&&o<=s?(s-o)/l:void 0,event:r,lengthComputable:null!=s};c[t?"download":"upload"]=!0,e(c)},r)},H=x.hasStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");let r;function n(r){let n=r;return e&&(t.setAttribute("href",n),n=t.href),t.setAttribute("href",n),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return r=n(window.location.href),function(e){const t=i.a.isString(e)?n(e):e;return t.protocol===r.protocol&&t.host===r.host}}():function(){return!0},z=x.hasStandardBrowserEnv?{write(e,t,r,n,o,s){const a=[e+"="+encodeURIComponent(t)];i.a.isNumber(r)&&a.push("expires="+new Date(r).toGMTString()),i.a.isString(n)&&a.push("path="+n),i.a.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function $(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const V=e=>e instanceof j?{...e}:e;function G(e,t){t=t||{};const r={};function n(e,t,r){return i.a.isPlainObject(e)&&i.a.isPlainObject(t)?i.a.merge.call({caseless:r},e,t):i.a.isPlainObject(t)?i.a.merge({},t):i.a.isArray(t)?t.slice():t}function o(e,t,r){return i.a.isUndefined(t)?i.a.isUndefined(e)?void 0:n(void 0,e,r):n(e,t,r)}function s(e,t){if(!i.a.isUndefined(t))return n(void 0,t)}function a(e,t){return i.a.isUndefined(t)?i.a.isUndefined(e)?void 0:n(void 0,e):n(void 0,t)}function l(r,i,o){return o in t?n(r,i):o in e?n(void 0,r):void 0}const c={url:s,method:s,data:s,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:l,headers:(e,t)=>o(V(e),V(t),!0)};return i.a.forEach(Object.keys(Object.assign({},e,t)),(function(n){const s=c[n]||o,a=s(e[n],t[n],n);i.a.isUndefined(a)&&s!==l||(r[n]=a)})),r}var J=e=>{const t=G({},e);let r,{data:n,withXSRFToken:o,xsrfHeaderName:s,xsrfCookieName:a,headers:l,auth:c}=t;if(t.headers=l=j.from(l),t.url=f($(t.baseURL,t.url),e.params,e.paramsSerializer),c&&l.set("Authorization","Basic "+btoa((c.username||"")+":"+(c.password?unescape(encodeURIComponent(c.password)):""))),i.a.isFormData(n))if(x.hasStandardBrowserEnv||x.hasStandardBrowserWebWorkerEnv)l.setContentType(void 0);else if(!1!==(r=l.getContentType())){const[e,...t]=r?r.split(";").map(e=>e.trim()).filter(Boolean):[];l.setContentType([e||"multipart/form-data",...t].join("; "))}if(x.hasStandardBrowserEnv&&(o&&i.a.isFunction(o)&&(o=o(t)),o||!1!==o&&H(t.url))){const e=s&&a&&z.read(a);e&&l.set(s,e)}return t};var Y="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,r){const n=J(e);let o=n.data;const s=j.from(n.headers).normalize();let a,{responseType:l}=n;function c(){n.cancelToken&&n.cancelToken.unsubscribe(a),n.signal&&n.signal.removeEventListener("abort",a)}let u=new XMLHttpRequest;function p(){if(!u)return;const n=j.from("getAllResponseHeaders"in u&&u.getAllResponseHeaders());q((function(e){t(e),c()}),(function(e){r(e),c()}),{data:l&&"text"!==l&&"json"!==l?u.response:u.responseText,status:u.status,statusText:u.statusText,headers:n,config:e,request:u}),u=null}u.open(n.method.toUpperCase(),n.url,!0),u.timeout=n.timeout,"onloadend"in u?u.onloadend=p:u.onreadystatechange=function(){u&&4===u.readyState&&(0!==u.status||u.responseURL&&0===u.responseURL.indexOf("file:"))&&setTimeout(p)},u.onabort=function(){u&&(r(new d.a("Request aborted",d.a.ECONNABORTED,n,u)),u=null)},u.onerror=function(){r(new d.a("Network Error",d.a.ERR_NETWORK,n,u)),u=null},u.ontimeout=function(){let e=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const t=n.transitional||m;n.timeoutErrorMessage&&(e=n.timeoutErrorMessage),r(new d.a(e,t.clarifyTimeoutError?d.a.ETIMEDOUT:d.a.ECONNABORTED,n,u)),u=null},void 0===o&&s.setContentType(null),"setRequestHeader"in u&&i.a.forEach(s.toJSON(),(function(e,t){u.setRequestHeader(t,e)})),i.a.isUndefined(n.withCredentials)||(u.withCredentials=!!n.withCredentials),l&&"json"!==l&&(u.responseType=n.responseType),"function"==typeof n.onDownloadProgress&&u.addEventListener("progress",I(n.onDownloadProgress,!0)),"function"==typeof n.onUploadProgress&&u.upload&&u.upload.addEventListener("progress",I(n.onUploadProgress)),(n.cancelToken||n.signal)&&(a=t=>{u&&(r(!t||t.type?new B(null,e,u):t),u.abort(),u=null)},n.cancelToken&&n.cancelToken.subscribe(a),n.signal&&(n.signal.aborted?a():n.signal.addEventListener("abort",a)));const f=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(n.url);f&&-1===x.protocols.indexOf(f)?r(new d.a("Unsupported protocol "+f+":",d.a.ERR_BAD_REQUEST,e)):u.send(o||null)}))};var Z=(e,t)=>{let r,n=new AbortController;const i=function(e){if(!r){r=!0,s();const t=e instanceof Error?e:this.reason;n.abort(t instanceof d.a?t:new B(t instanceof Error?t.message:t))}};let o=t&&setTimeout(()=>{i(new d.a(`timeout ${t} of ms exceeded`,d.a.ETIMEDOUT))},t);const s=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(e=>{e&&(e.removeEventListener?e.removeEventListener("abort",i):e.unsubscribe(i))}),e=null)};e.forEach(e=>e&&e.addEventListener&&e.addEventListener("abort",i));const{signal:a}=n;return a.unsubscribe=s,[a,()=>{o&&clearTimeout(o),o=null}]};const K=function*(e,t){let r=e.byteLength;if(!t||r{const o=async function*(e,t,r){for await(const n of e)yield*K(ArrayBuffer.isView(n)?n:await r(String(n)),t)}(e,t,i);let s=0;return new ReadableStream({type:"bytes",async pull(e){const{done:t,value:i}=await o.next();if(t)return e.close(),void n();let a=i.byteLength;r&&r(s+=a),e.enqueue(new Uint8Array(i))},cancel:e=>(n(e),o.return())},{highWaterMark:2})},X=(e,t)=>{const r=null!=e;return n=>setTimeout(()=>t({lengthComputable:r,total:e,loaded:n}))},Q="function"==typeof fetch&&"function"==typeof Request&&"function"==typeof Response,ee=Q&&"function"==typeof ReadableStream,te=Q&&("function"==typeof TextEncoder?(re=new TextEncoder,e=>re.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var re;const ne=ee&&(()=>{let e=!1;const t=new Request(x.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})(),ie=ee&&!!(()=>{try{return i.a.isReadableStream(new Response("").body)}catch(e){}})(),oe={stream:ie&&(e=>e.body)};var se;Q&&(se=new Response,["text","arrayBuffer","blob","formData","stream"].forEach(e=>{!oe[e]&&(oe[e]=i.a.isFunction(se[e])?t=>t[e]():(t,r)=>{throw new d.a(`Response type '${e}' is not supported`,d.a.ERR_NOT_SUPPORT,r)})}));const ae=async(e,t)=>{const r=i.a.toFiniteNumber(e.getContentLength());return null==r?(async e=>null==e?0:i.a.isBlob(e)?e.size:i.a.isSpecCompliantForm(e)?(await new Request(e).arrayBuffer()).byteLength:i.a.isArrayBufferView(e)?e.byteLength:(i.a.isURLSearchParams(e)&&(e+=""),i.a.isString(e)?(await te(e)).byteLength:void 0))(t):r};var le=Q&&(async e=>{let{url:t,method:r,data:n,signal:o,cancelToken:s,timeout:a,onDownloadProgress:l,onUploadProgress:c,responseType:u,headers:p,withCredentials:f="same-origin",fetchOptions:h}=J(e);u=u?(u+"").toLowerCase():"text";let m,g,[y,b]=o||s||a?Z([o,s],a):[];const v=()=>{!m&&setTimeout(()=>{y&&y.unsubscribe()}),m=!0};let w;try{if(c&&ne&&"get"!==r&&"head"!==r&&0!==(w=await ae(p,n))){let e,r=new Request(t,{method:"POST",body:n,duplex:"half"});i.a.isFormData(n)&&(e=r.headers.get("content-type"))&&p.setContentType(e),r.body&&(n=W(r.body,65536,X(w,I(c)),null,te))}i.a.isString(f)||(f=f?"cors":"omit"),g=new Request(t,{...h,signal:y,method:r.toUpperCase(),headers:p.normalize().toJSON(),body:n,duplex:"half",withCredentials:f});let o=await fetch(g);const s=ie&&("stream"===u||"response"===u);if(ie&&(l||s)){const e={};["status","statusText","headers"].forEach(t=>{e[t]=o[t]});const t=i.a.toFiniteNumber(o.headers.get("content-length"));o=new Response(W(o.body,65536,l&&X(t,I(l,!0)),s&&v,te),e)}u=u||"text";let a=await oe[i.a.findKey(oe,u)||"text"](o,e);return!s&&v(),b&&b(),await new Promise((t,r)=>{q(t,r,{data:a,headers:j.from(o.headers),status:o.status,statusText:o.statusText,config:e,request:g})})}catch(t){if(v(),t&&"TypeError"===t.name&&/fetch/i.test(t.message))throw Object.assign(new d.a("Network Error",d.a.ERR_NETWORK,e,g),{cause:t.cause||t});throw d.a.from(t,t&&t.code,e,g)}});const ce={http:U.a,xhr:Y,fetch:le};i.a.forEach(ce,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}});const ue=e=>"- "+e,pe=e=>i.a.isFunction(e)||null===e||!1===e;var fe=e=>{e=i.a.isArray(e)?e:[e];const{length:t}=e;let r,n;const o={};for(let i=0;i`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build"));let r=t?e.length>1?"since :\n"+e.map(ue).join("\n"):" "+ue(e[0]):"as no adapter specified";throw new d.a("There is no suitable adapter to dispatch the request "+r,"ERR_NOT_SUPPORT")}return n};function he(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new B(null,e)}function de(e){he(e),e.headers=j.from(e.headers),e.data=R.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return fe(e.adapter||E.adapter)(e).then((function(t){return he(e),t.data=R.call(e,e.transformResponse,t),t.headers=j.from(t.headers),t}),(function(t){return D(t)||(he(e),t&&t.response&&(t.response.data=R.call(e,e.transformResponse,t.response),t.response.headers=j.from(t.response.headers))),Promise.reject(t)}))}const me={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{me[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const ge={};me.transitional=function(e,t,r){function n(e,t){return"[Axios v1.7.2] Transitional option '"+e+"'"+t+(r?". "+r:"")}return(r,i,o)=>{if(!1===e)throw new d.a(n(i," has been removed"+(t?" in "+t:"")),d.a.ERR_DEPRECATED);return t&&!ge[i]&&(ge[i]=!0,console.warn(n(i," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(r,i,o)}};var ye={assertOptions:function(e,t,r){if("object"!=typeof e)throw new d.a("options must be an object",d.a.ERR_BAD_OPTION_VALUE);const n=Object.keys(e);let i=n.length;for(;i-- >0;){const o=n[i],s=t[o];if(s){const t=e[o],r=void 0===t||s(t,o,e);if(!0!==r)throw new d.a("option "+o+" must be "+r,d.a.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new d.a("Unknown option "+o,d.a.ERR_BAD_OPTION)}},validators:me};const be=ye.validators;class ve{constructor(e){this.defaults=e,this.interceptors={request:new h,response:new h}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t;Error.captureStackTrace?Error.captureStackTrace(t={}):t=new Error;const r=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?r&&!String(e.stack).endsWith(r.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+r):e.stack=r}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=G(this.defaults,t);const{transitional:r,paramsSerializer:n,headers:o}=t;void 0!==r&&ye.assertOptions(r,{silentJSONParsing:be.transitional(be.boolean),forcedJSONParsing:be.transitional(be.boolean),clarifyTimeoutError:be.transitional(be.boolean)},!1),null!=n&&(i.a.isFunction(n)?t.paramsSerializer={serialize:n}:ye.assertOptions(n,{encode:be.function,serialize:be.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();let s=o&&i.a.merge(o.common,o[t.method]);o&&i.a.forEach(["delete","get","head","post","put","patch","common"],e=>{delete o[e]}),t.headers=j.concat(s,o);const a=[];let l=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(l=l&&e.synchronous,a.unshift(e.fulfilled,e.rejected))}));const c=[];let u;this.interceptors.response.forEach((function(e){c.push(e.fulfilled,e.rejected)}));let p,f=0;if(!l){const e=[de.bind(this),void 0];for(e.unshift.apply(e,a),e.push.apply(e,c),p=e.length,u=Promise.resolve(t);f{if(!r._listeners)return;let t=r._listeners.length;for(;t-- >0;)r._listeners[t](e);r._listeners=null}),this.promise.then=e=>{let t;const n=new Promise(e=>{r.subscribe(e),t=e}).then(e);return n.cancel=function(){r.unsubscribe(t)},n},e((function(e,n,i){r.reason||(r.reason=new B(e,n,i),t(r.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}static source(){let e;return{token:new _e((function(t){e=t})),cancel:e}}}var xe=_e;const Ae={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ae).forEach(([e,t])=>{Ae[t]=e});var Se=Ae;const Ee=function e(t){const r=new we(t),n=Object(o.a)(we.prototype.request,r);return i.a.extend(n,we.prototype,r,{allOwnKeys:!0}),i.a.extend(n,r,null,{allOwnKeys:!0}),n.create=function(r){return e(G(t,r))},n}(E);Ee.Axios=we,Ee.CanceledError=B,Ee.CancelToken=xe,Ee.isCancel=D,Ee.VERSION="1.7.2",Ee.toFormData=s.a,Ee.AxiosError=d.a,Ee.Cancel=Ee.CanceledError,Ee.all=function(e){return Promise.all(e)},Ee.spread=function(e){return function(t){return e.apply(null,t)}},Ee.isAxiosError=function(e){return i.a.isObject(e)&&!0===e.isAxiosError},Ee.mergeConfig=G,Ee.AxiosHeaders=j,Ee.formToJSON=e=>A(i.a.isHTMLForm(e)?new FormData(e):e),Ee.getAdapter=fe,Ee.HttpStatusCode=Se,Ee.default=Ee;var Ce=Ee,Oe=r(157),Te="processes.json",ke="1.2.0",Le="Processes",Pe=!0,je=!0,Re="Uncategorized",De=!0,Ne=!0,Be="",Ue=!1,qe=!1,Me=r(464),Fe=r(468),Ie=r(466),He=r(177),ze={name:"Processes",components:{Process:()=>Oe.a.loadAsyncComponent(Promise.resolve().then(r.bind(null,466))),SearchableList:()=>Oe.a.loadAsyncComponent(Promise.resolve().then(r.bind(null,467)))},mixins:[He.a],props:{processes:{type:Array,default:()=>[]},provideDownload:{type:Boolean,default:!0},processUrl:String,searchTerm:{type:String,default:null},sort:{type:Boolean,default:!0},offerDetails:{type:Boolean,default:!0},heading:{type:String,default:"Processes"},collapsed:{type:Boolean,default:null},showCategories:{type:Boolean,default:!1},showGraph:{type:Boolean,default:!1},hideDeprecated:{type:Boolean,default:!1},deprecatedFilter:{type:Boolean,default:!1},hideExperimental:{type:Boolean,default:!1},experimentalFilter:{type:Boolean,default:!1},loadAdditionalData:{type:Function,default:null},missing:{type:Array,default:null},...He.a.props},beforeCreate(){Oe.a.enableHtmlProps(this)},methods:{detailsToggled(...e){this.$emit("detailsToggled",...e)}}},$e=(r(398),r(4)),Ve=Object($e.a)(ze,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component processes"},[t("SearchableList",{attrs:{data:e.processes,keywordsKey:"categories",showKeywords:e.showCategories,showSummaryOnExpand:!1,externalSearchTerm:e.searchTerm,externalHideDeprecated:e.hideDeprecated,deprecatedFilter:e.deprecatedFilter,externalHideExperimental:e.hideExperimental,experimentalFilter:e.experimentalFilter,sort:e.sort,offerDetails:e.offerDetails,heading:e.heading,collapsed:e.collapsed,loadAdditionalData:e.loadAdditionalData,allowCopy:""},on:{detailsToggled:e.detailsToggled},scopedSlots:e._u([{key:"heading",fn:function(t){return[e._t("heading",null,null,t)]}},e.missing?{key:"content-start",fn:function(){return[t("FederationMissingNotice",{attrs:{missing:e.missing,federation:e.federation}})]},proxy:!0}:null,{key:"summary",fn:function(t){return[e._t("summary",null,null,t)]}},{key:"details",fn:function(r){return[t("Process",{attrs:{process:r.item,provideDownload:e.provideDownload,processUrl:e.processUrl,showGraph:e.showGraph,federation:e.federation},scopedSlots:e._u([{key:"title",fn:function(){return[t("span",{staticClass:"hidden"})]},proxy:!0},{key:"before-description",fn:function(t){return[e._t("process-before-description",null,null,t)]}},{key:"end",fn:function(t){return[e._t("process-end",null,null,t)]}}],null,!0)})]}}],null,!0)})],1)}),[],!1,null,null,null).exports,Ge=r(467),Je=r(469),Ye=r(194),Ze={name:"DocGen",components:{Description:Me.default,LinkList:Fe.default,Process:Ie.default,Processes:Ve,SearchableList:Ge.default,SearchBox:Je.default},props:{title:{type:String,default:Le},document:{type:[String,Array,Object],default:Te},apiVersion:{type:String,default:ke},sortProcessesById:{type:Boolean,default:Pe},categorize:{type:Boolean,default:je},provideDownload:{type:Boolean,default:De},showTableOfContents:{type:Boolean,default:Ne},uncategorizedName:{type:String,default:Re},notice:{type:String,default:Be},showDeprecatedByDefault:{type:Boolean,default:qe},showExperimentalByDefault:{type:Boolean,default:Ue}},data(){return{hideNotice:!1,searchTerm:"",allCollapsedState:!0,hasResults:!0,showCategories:this.categorize,processes:[],categories:[],links:[],protocol:null,copied:null,canCopy:!1,showDeprecated:this.showDeprecatedByDefault,showExperimental:this.showExperimentalByDefault}},watch:{document(){this.changeDocument()},async processes(){await this.$nextTick(),this.moveToAnchor()},searchTerm(){this.updateCategoryView()},showCategories(){this.updateCategoryView()}},computed:{isLocalDocument(){return"file:"===this.protocol&&!this.document.match(/^https?:/i)}},mounted(){document.title=this.title,this.loadLink("https://use.fontawesome.com/releases/v5.13.0/webfonts/fa-solid-900.woff2",{rel:"preload",crossorigin:!0,as:"font",type:"font/woff2"}),this.loadLink("https://use.fontawesome.com/releases/v5.13.0/css/all.css",{rel:"stylesheet",media:"all",type:"text/css"}),this.protocol=window?window.location.protocol:null,this.changeDocument(),this.canCopy=navigator&&navigator.clipboard&&"function"==typeof navigator.clipboard.writeText},methods:{copyLink(e){if(this.canCopy){let t=new URL(window.location.href);t.hash=e,navigator.clipboard.writeText(t.toString()).then(()=>{this.copied=e,setTimeout(()=>this.copied=null,2e3)}).catch(()=>canCopy=!1)}},loadLink(e,t={}){t.href=e;let r=document.createElement("link");for(let e in t)r.setAttribute(e,t[e]);document.head.appendChild(r)},loadLocalFile(e){const t=new FileReader;t.onload=()=>{try{this.setProcesses(JSON.parse(t.result))}catch(e){alert(e.message),console.error(e)}},t.readAsText(e.target.files[0])},changeDocument(){"string"==typeof this.document&&this.document.length>0?this.isLocalDocument||Ce.get(this.document).then(e=>this.setProcesses(e.data)).catch(e=>console.error(e)):"object"==typeof this.document&&null!==this.document?this.setProcesses(this.document):console.error("Specified document is not a URL, array or object.")},setProcesses(e){Array.isArray(e)&&(e={processes:e}),Oe.a.isObject(e)&&Array.isArray(e.processes)||console.error("Invalid document specified, can't find processes."),e=Ye.MigrateProcesses.convertProcessesToLatestSpec(e,this.apiVersion),this.processes=e.processes,this.links=Array.isArray(e.links)?e.links:[],!0===this.sortProcessesById&&this.processes.sort((e,t)=>Oe.a.compareStringCaseInsensitive(e.id,t.id)),this.categories=[];for(let e of this.processes){let t=Array.isArray(e.categories)&&e.categories.length>0?e.categories:[this.uncategorizedName];for(let r of t){r=r.replace("_"," ");let t=this.categories.findIndex(e=>e.id===r);t>=0?this.categories[t].processes.push(e):this.categories.push({id:r,processes:[e]})}}this.categories.sort((e,t)=>Oe.a.compareStringCaseInsensitive(e.id,t.id))},moveToAnchor(){if("string"==typeof window.location.hash&&window.location.hash.length>1){var e=window.location.hash.substring(1),t=this.$el.querySelector("a[name="+e+"]");t&&t.scrollIntoView()}},switchCategoryView(){this.showCategories=!this.showCategories},expandAll(){this.toggleAll(!0)},collapseAll(){this.toggleAll(!1)},toggleAll(e){this.allCollapsedState=!e},async updateCategoryView(){await this.$nextTick(),this.hasResults=!0,this.toggleAll(this.searchTerm.length>=2),this.searchTerm.length>=2&&Array.isArray(this.$refs.categories)&&(this.hasResults=!!this.$refs.categories.find(e=>!e.$children[0].$el.classList.contains("noResults")))}}},Ke=(r(405),Object($e.a)(Ze,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"docgen"},[!e.isLocalDocument||e.processes.length||e.links.length?t("div",{staticClass:"page-container"},[e.showTableOfContents?t("aside",{staticClass:"menu-container"},[t("section",{staticClass:"toc"},[t("h2",[e._v(e._s(e.title))]),e._v(" "),t("SearchBox",{attrs:{placeholder:"Search in processes"},model:{value:e.searchTerm,callback:function(t){e.searchTerm=t},expression:"searchTerm"}}),e._v(" "),t("div",{staticClass:"filters"},[t("span",{staticClass:"label"},[e._v("\n\t\t\t\t\t\tShow\n\t\t\t\t\t")]),e._v(" "),t("label",{staticClass:"show-deprecated",attrs:{title:"Show deprecated elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.showDeprecated,expression:"showDeprecated"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.showDeprecated)?e._i(e.showDeprecated,null)>-1:e.showDeprecated},on:{change:function(t){var r=e.showDeprecated,n=t.target,i=!!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.showDeprecated=r.concat([null])):o>-1&&(e.showDeprecated=r.slice(0,o).concat(r.slice(o+1)))}else e.showDeprecated=i}}}),e._v("\n\t\t\t\t\t\tdeprecated\n\t\t\t\t\t")]),e._v(" "),t("label",{staticClass:"show-experimental",attrs:{title:"Show experimental elements?"}},[t("input",{directives:[{name:"model",rawName:"v-model",value:e.showExperimental,expression:"showExperimental"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.showExperimental)?e._i(e.showExperimental,null)>-1:e.showExperimental},on:{change:function(t){var r=e.showExperimental,n=t.target,i=!!n.checked;if(Array.isArray(r)){var o=e._i(r,null);n.checked?o<0&&(e.showExperimental=r.concat([null])):o>-1&&(e.showExperimental=r.slice(0,o).concat(r.slice(o+1)))}else e.showExperimental=i}}}),e._v("\n\t\t\t\t\t\texperimental\n\t\t\t\t\t")])]),e._v(" "),t("ul",{staticClass:"controls"},[e.showCategories?t("li",[t("a",{attrs:{title:"Expand all"},on:{click:e.expandAll}},[t("i",{staticClass:"fas fa-angle-double-down"})])]):e._e(),e._v(" "),e.showCategories?t("li",[t("a",{attrs:{title:"Collapse all"},on:{click:e.collapseAll}},[t("i",{staticClass:"fas fa-angle-double-up"})])]):e._e(),e._v(" "),e.showCategories?t("li",[t("a",{attrs:{title:"Hide Categories"},on:{click:e.switchCategoryView}},[t("i",{staticClass:"fas fa-list-ol"})])]):t("li",[t("a",{attrs:{title:"Show Categories"},on:{click:e.switchCategoryView}},[t("i",{staticClass:"fas fa-folder"})])])]),e._v(" "),e.showCategories?[e._l(e.categories,(function(r){return t("Processes",{key:r.id,ref:"categories",refInFor:!0,staticClass:"categories",attrs:{processes:r.processes,searchTerm:e.searchTerm,offerDetails:!1,heading:r.id,collapsed:e.allCollapsedState,hideDeprecated:!e.showDeprecated,hideExperimental:!e.showExperimental},scopedSlots:e._u([{key:"summary",fn:function({summary:r}){return[t("a",{attrs:{href:"#"+r.identifier}},[t("strong",[e._v(e._s(r.identifier))])]),e._v(" "),r.summary?t("small",[e._v(e._s(r.summary))]):e._e()]}}],null,!0)})})),e._v(" "),e.hasResults?e._e():t("p",[e._v("No search results found.")])]:t("Processes",{attrs:{processes:e.processes,searchTerm:e.searchTerm,offerDetails:!1,heading:null,hideDeprecated:!e.showDeprecated,hideExperimental:!e.showExperimental},scopedSlots:e._u([{key:"summary",fn:function({summary:r}){return[t("a",{attrs:{href:"#"+r.identifier}},[t("strong",[e._v(e._s(r.identifier))])]),e._v(" "),r.summary?t("small",[e._v(e._s(r.summary))]):e._e()]}}],null,!1,2378471087)})],2),e._v(" "),t("section",{staticClass:"related-links"},[t("LinkList",{attrs:{links:e.links,heading:"Related Links",headingTag:"h3"}})],1)]):e._e(),e._v(" "),t("main",{staticClass:"content-container",class:{toc:e.showTableOfContents}},[!e.hideNotice&&e.notice?t("div",{staticClass:"notice"},[t("Description",{attrs:{description:e.notice}}),e._v(" "),t("button",{staticClass:"close",attrs:{type:"button",title:"Close"},on:{click:function(t){e.hideNotice=!0}}},[e._v("×")])],1):e._e(),e._v(" "),e._l(e.processes,(function(r){return t("Process",{key:r.id,ref:"processes",refInFor:!0,attrs:{process:r,provideDownload:e.provideDownload,sort:!1,processUrl:"#${}"},scopedSlots:e._u([{key:"title",fn:function(n){return[t("a",{staticClass:"anchor",attrs:{name:r.id}}),e._v(" "),t("h2",[e._v("\n\t\t\t\t\t\t"+e._s(r.id)+"\n\t\t\t\t\t\t"),e.canCopy?[e.copied===r.id?t("span",{staticClass:"copy success",attrs:{title:"Copied to clipboard"}},[t("i",{staticClass:"fas fa-clipboard-check"})]):t("span",{staticClass:"copy",attrs:{title:"Copy link for this process"},on:{click:function(t){return e.copyLink(r.id)}}},[t("i",{staticClass:"fas fa-clipboard"})])]:e._e(),e._v(" "),n.displayableNamespace?t("span",{staticClass:"namespace"},[e._v(" — "+e._s(n.displayableNamespace))]):e._e()],2)]}}],null,!0)})}))],2)]):t("div",{staticClass:"fileChooser"},[t("p",[e._v("\n\t\t\tSorry, can't automatically read files from the local file system.\n\t\t\tPlease specify the file to load here:\n\t\t\t"),t("input",{attrs:{type:"file"},on:{change:e.loadLocalFile}})])])])}),[],!1,null,null,null));t.default=Ke.exports}])]); \ No newline at end of file diff --git a/assets/js/100.7280072b.js b/assets/js/100.d9a1c32c.js similarity index 95% rename from assets/js/100.7280072b.js rename to assets/js/100.d9a1c32c.js index 291bb0d3e..7729f568a 100644 --- a/assets/js/100.7280072b.js +++ b/assets/js/100.d9a1c32c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[100],{547:function(e,t,n){"use strict";n.r(t);var r=n(4),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Today, the newly established "),t("RouterLink",{attrs:{to:"/psc.html"}},[e._v("openEO Project Steering Committee")]),e._v("\nreleased a new version 1.0.1 of the openEO API. This doesn't include any new\nfunctionality, but clarifies ambiguous parts of the specification and changes\nthe API's recommendation regarding CORS headers to avoid potential security\nissues with credentials in web browsers. Back-ends are advised to check their\nimplementations against the new specification and update the CORS headers\naccordingly. The web clients have already been updated accordingly.")],1),e._v(" "),t("p",[e._v("More details about the release:")]),e._v(" "),t("ul",[t("li",[e._v("Details on the "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues/7",target:"_blank",rel:"noopener noreferrer"}},[e._v("CORS issue"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/tree/1.0.1/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Changelog"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://api.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API documentation"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[100],{549:function(e,t,n){"use strict";n.r(t);var r=n(4),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Today, the newly established "),t("RouterLink",{attrs:{to:"/psc.html"}},[e._v("openEO Project Steering Committee")]),e._v("\nreleased a new version 1.0.1 of the openEO API. This doesn't include any new\nfunctionality, but clarifies ambiguous parts of the specification and changes\nthe API's recommendation regarding CORS headers to avoid potential security\nissues with credentials in web browsers. Back-ends are advised to check their\nimplementations against the new specification and update the CORS headers\naccordingly. The web clients have already been updated accordingly.")],1),e._v(" "),t("p",[e._v("More details about the release:")]),e._v(" "),t("ul",[t("li",[e._v("Details on the "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues/7",target:"_blank",rel:"noopener noreferrer"}},[e._v("CORS issue"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/tree/1.0.1/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Changelog"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://api.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API documentation"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/101.e12b2307.js b/assets/js/101.e97b44c1.js similarity index 96% rename from assets/js/101.e12b2307.js rename to assets/js/101.e97b44c1.js index a6582a31a..36167d92d 100644 --- a/assets/js/101.e12b2307.js +++ b/assets/js/101.e97b44c1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{549:function(e,t,n){"use strict";n.r(t);var a=n(4),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Today, we released a new version 1.1.0 of the openEO API.")]),e._v(" "),t("p",[e._v("It features a number of relatively minor, but interesting new features.\nThe OpenID Connect authentication process has been made easier by providing negotiating client IDs automatically.\nJobs, Services, and Logs can provide detailed usage metrics to users\nso that they can monitor memory usage, CPU usage, data transfer, and other metrics.\nFor synchronous processing, a recommendation has been added on how to deliver multiple\nfiles (via TAR archives). Overall, we also aligned better with the STAC specification,\nwhich recently has been released in 1.0.0 release candidate state.\nFor several parts exposed by the API can now be declared to be experimental\nor deprecated.\nFinally, the API specification also clarifies several ambiguous parts of the specification.")]),e._v(" "),t("p",[e._v("Back-ends and clients are advised to check their implementations against the new specification and update accordingly.")]),e._v(" "),t("p",[e._v("More details about the release:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/tree/1.1.0/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Changelog"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://api.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API documentation"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{552:function(e,t,n){"use strict";n.r(t);var a=n(4),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Today, we released a new version 1.1.0 of the openEO API.")]),e._v(" "),t("p",[e._v("It features a number of relatively minor, but interesting new features.\nThe OpenID Connect authentication process has been made easier by providing negotiating client IDs automatically.\nJobs, Services, and Logs can provide detailed usage metrics to users\nso that they can monitor memory usage, CPU usage, data transfer, and other metrics.\nFor synchronous processing, a recommendation has been added on how to deliver multiple\nfiles (via TAR archives). Overall, we also aligned better with the STAC specification,\nwhich recently has been released in 1.0.0 release candidate state.\nFor several parts exposed by the API can now be declared to be experimental\nor deprecated.\nFinally, the API specification also clarifies several ambiguous parts of the specification.")]),e._v(" "),t("p",[e._v("Back-ends and clients are advised to check their implementations against the new specification and update accordingly.")]),e._v(" "),t("p",[e._v("More details about the release:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/tree/1.1.0/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("Changelog"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://api.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API documentation"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/102.207bd63f.js b/assets/js/102.0420b8ba.js similarity index 96% rename from assets/js/102.207bd63f.js rename to assets/js/102.0420b8ba.js index b5ae482f1..abe17dbff 100644 --- a/assets/js/102.207bd63f.js +++ b/assets/js/102.0420b8ba.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{550:function(e,t,n){"use strict";n.r(t);var r=n(4),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Today, we released a new version 1.1.0 of the openEO R Client, which features a couple of "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/blob/master/NEWS.md#version-110",target:"_blank",rel:"noopener noreferrer"}},[e._v("improvements and bug fixes"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("At the same time, the R client has been published on CRAN, too: "),t("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),t("OutboundLink")],1),e._v("\nThis means you can now install the R client more easily and directly through CRAN with the following command:")]),e._v(" "),t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("install.packages"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"openeo"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("If you have trouble installing or working with the package, feel free to leave an issue in the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue tracker"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{551:function(e,t,n){"use strict";n.r(t);var r=n(4),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Today, we released a new version 1.1.0 of the openEO R Client, which features a couple of "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/blob/master/NEWS.md#version-110",target:"_blank",rel:"noopener noreferrer"}},[e._v("improvements and bug fixes"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("At the same time, the R client has been published on CRAN, too: "),t("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),t("OutboundLink")],1),e._v("\nThis means you can now install the R client more easily and directly through CRAN with the following command:")]),e._v(" "),t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("install.packages"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"openeo"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("If you have trouble installing or working with the package, feel free to leave an issue in the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue tracker"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/103.5ed6d717.js b/assets/js/103.9dbeca29.js similarity index 93% rename from assets/js/103.5ed6d717.js rename to assets/js/103.9dbeca29.js index 86851a5e3..54775ea8a 100644 --- a/assets/js/103.5ed6d717.js +++ b/assets/js/103.9dbeca29.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{551:function(e,t,n){"use strict";n.r(t);var s=n(4),o=Object(s.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("Last wednesday, the first regular openEO PSC meeting took place.\nWe have now agreed to meet on a monthly basis, each "),e("strong",[this._v("first Wednesday of the month at 15:00 CET/CEST")]),this._v(".\nWe will always discuss the open issues in the "),e("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues",target:"_blank",rel:"noopener noreferrer"}},[this._v("PSC issue tracker"),e("OutboundLink")],1),this._v(" and talk through the future and strategic directions openEO is heading towards.\nThe meetings are open to the public and anyone can join as a guest.\nIf you'd like to join the next meeting, please contact "),e("code",[this._v("openeo.psc@uni-muenster.de")]),this._v(" and we'll send you an invite.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{553:function(e,t,n){"use strict";n.r(t);var s=n(4),o=Object(s.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("Last wednesday, the first regular openEO PSC meeting took place.\nWe have now agreed to meet on a monthly basis, each "),e("strong",[this._v("first Wednesday of the month at 15:00 CET/CEST")]),this._v(".\nWe will always discuss the open issues in the "),e("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues",target:"_blank",rel:"noopener noreferrer"}},[this._v("PSC issue tracker"),e("OutboundLink")],1),this._v(" and talk through the future and strategic directions openEO is heading towards.\nThe meetings are open to the public and anyone can join as a guest.\nIf you'd like to join the next meeting, please contact "),e("code",[this._v("openeo.psc@uni-muenster.de")]),this._v(" and we'll send you an invite.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/104.2a9358ef.js b/assets/js/104.0ed77922.js similarity index 94% rename from assets/js/104.2a9358ef.js rename to assets/js/104.0ed77922.js index 08e06d54e..29f96ffa8 100644 --- a/assets/js/104.2a9358ef.js +++ b/assets/js/104.0ed77922.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{553:function(e,n,t){"use strict";t.r(n);var o=t(4),s=Object(o.a)({},(function(){var e=this,n=e._self._c;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("p",[e._v("The openEO PSC is pleased to announce a new monthly openEO community meeting that\ntakes place "),n("strong",[e._v("every first Wednesday of a month at 14:00 CET")]),e._v(".")]),e._v(" "),n("p",[e._v("This is meant to be a "),n("em",[e._v("project-independant")]),e._v(" platform for developers to announce news,\ninform about recent or planned work, exchange ideas, discuss issues and get to\nknow each other. In the past there have been project-specific developer calls, but\nwe would like to build bridges between projects and coordinate the work better.")]),e._v(" "),n("p",[n("strong",[e._v("If you'd like to join these calls, please send an e-mail to "),n("a",{attrs:{href:"mailto:openeo.psc@uni-muenster.de"}},[e._v("openeo.psc@uni-muenster.de")]),e._v(".")]),e._v("\nEveryone is welcome!")])])}),[],!1,null,null,null);n.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{555:function(e,n,t){"use strict";t.r(n);var o=t(4),s=Object(o.a)({},(function(){var e=this,n=e._self._c;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("p",[e._v("The openEO PSC is pleased to announce a new monthly openEO community meeting that\ntakes place "),n("strong",[e._v("every first Wednesday of a month at 14:00 CET")]),e._v(".")]),e._v(" "),n("p",[e._v("This is meant to be a "),n("em",[e._v("project-independant")]),e._v(" platform for developers to announce news,\ninform about recent or planned work, exchange ideas, discuss issues and get to\nknow each other. In the past there have been project-specific developer calls, but\nwe would like to build bridges between projects and coordinate the work better.")]),e._v(" "),n("p",[n("strong",[e._v("If you'd like to join these calls, please send an e-mail to "),n("a",{attrs:{href:"mailto:openeo.psc@uni-muenster.de"}},[e._v("openeo.psc@uni-muenster.de")]),e._v(".")]),e._v("\nEveryone is welcome!")])])}),[],!1,null,null,null);n.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/105.445f82d8.js b/assets/js/105.8d1db589.js similarity index 99% rename from assets/js/105.445f82d8.js rename to assets/js/105.8d1db589.js index b91f49995..0e5b4b91f 100644 --- a/assets/js/105.445f82d8.js +++ b/assets/js/105.8d1db589.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{555:function(e,t,s){"use strict";s.r(t);var a=s(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("We released a new version of the R client (1.3.0) with new exciting improvements\nand a couple of new vignettes. To see the full list of changes, please consult the\n"),t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/news/index.html#version-130",target:"_blank",rel:"noopener noreferrer"}},[e._v("Changelog"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can get the new version through CRAN: "),t("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),t("OutboundLink")],1),e._v("\nThis means you can install or update the R client with the following command:")]),e._v(" "),t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("install.packages"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"openeo"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("If you have trouble installing or working with the package, feel free to leave an issue in the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue tracker"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"better-support-for-sf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#better-support-for-sf"}},[e._v("#")]),e._v(" Better support for "),t("code",[e._v("sf")])]),e._v(" "),t("p",[e._v("A new feature is that "),t("code",[e._v("sf")]),e._v(" objects can be used in processes as parameters.\nFor example, "),t("code",[e._v("st_bbox()")]),e._v(" can be used to pass bounding boxes more easily as spatial extent to the process "),t("code",[e._v("load_collection")]),e._v(".\nPlease see the following example for details:")]),e._v(" "),t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("library"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("sf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nbbox "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" st_bbox"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("xmin"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("16.1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n xmax"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("16.6")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ymax"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("48.6")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ymin"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("47.2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" crs "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("4326")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\ndata "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" p"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("$")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("id "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"SENTINEL-2"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n spatial_extent "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" bbox"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n temporal_extent "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" list"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2018-04-01"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2018-05-01"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("You can see a full example "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-05-process_graph_building_application.html#building-the-graph-for-data-manipulation",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"new-vignettes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-vignettes"}},[e._v("#")]),e._v(" New Vignettes")]),e._v(" "),t("p",[e._v("The new vignettes cover the following topics:")]),e._v(" "),t("ol",[t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-04-process_graph_concepts.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Process Graph Concepts")]),t("OutboundLink")],1),e._v("\nThis vignette shows the main concepts regarding the process graph building with the openeo package and explains aspects the openEO API and the openEO processes from a user perspective. It states the logical structure of an openEO process description and how process graphs are created from predefined processes. Also, the details about parameters and arguments of processes are explained, especially how this affects R, where function parameters are usually type free.")])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-05-process_graph_building_application.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Process Graph Building Application")]),t("OutboundLink")],1),e._v('\nWe describe the details on how to create process graphs and respectively "User Defined Processes" (UDP). Those processes can be seen as the analysis workflows that are run as jobs at a designated openEO back-end. They might be called later directly or some variables can be added to the UDP to customize the processes at runtime, e.g. set the temporal interval or the area of interest. This vignette focuses on the user point of view.')])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-03-package-software-architecture.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Package Software Architecture")]),t("OutboundLink")],1),e._v("\nThis is the first part of a contribution guide which ensures that developers can effectively contribute to the R-Client. Since a server-client based package is different from most other R packages some concepts are used that most R users and developers are not so familiar with. Therefore, this contribution guide eases the process of actively contributing to the packages development or bug fixing by explaining the underlying concepts.")])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-06-developer_implementation_details.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Developer Implementation Details")]),t("OutboundLink")],1),e._v("\nIn this guide selected core mechanisms of the openEO package are described. It is targeted towards interested developers and it is highly recommended to dive into the source code, while reading through this guide. The explanations here are abstracted from the code and shall guide new developers on the concepts and routines of this package.")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{556:function(e,t,s){"use strict";s.r(t);var a=s(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("We released a new version of the R client (1.3.0) with new exciting improvements\nand a couple of new vignettes. To see the full list of changes, please consult the\n"),t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/news/index.html#version-130",target:"_blank",rel:"noopener noreferrer"}},[e._v("Changelog"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can get the new version through CRAN: "),t("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),t("OutboundLink")],1),e._v("\nThis means you can install or update the R client with the following command:")]),e._v(" "),t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("install.packages"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"openeo"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("If you have trouble installing or working with the package, feel free to leave an issue in the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue tracker"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"better-support-for-sf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#better-support-for-sf"}},[e._v("#")]),e._v(" Better support for "),t("code",[e._v("sf")])]),e._v(" "),t("p",[e._v("A new feature is that "),t("code",[e._v("sf")]),e._v(" objects can be used in processes as parameters.\nFor example, "),t("code",[e._v("st_bbox()")]),e._v(" can be used to pass bounding boxes more easily as spatial extent to the process "),t("code",[e._v("load_collection")]),e._v(".\nPlease see the following example for details:")]),e._v(" "),t("div",{staticClass:"language-r extra-class"},[t("pre",{pre:!0,attrs:{class:"language-r"}},[t("code",[e._v("library"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("sf"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nbbox "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" st_bbox"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("xmin"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("16.1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n xmax"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("16.6")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ymax"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("48.6")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ymin"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("47.2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" crs "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("4326")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\ndata "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" p"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("$")]),e._v("load_collection"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("id "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"SENTINEL-2"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n spatial_extent "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" bbox"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n temporal_extent "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" list"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2018-04-01"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2018-05-01"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("You can see a full example "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-05-process_graph_building_application.html#building-the-graph-for-data-manipulation",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"new-vignettes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-vignettes"}},[e._v("#")]),e._v(" New Vignettes")]),e._v(" "),t("p",[e._v("The new vignettes cover the following topics:")]),e._v(" "),t("ol",[t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-04-process_graph_concepts.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Process Graph Concepts")]),t("OutboundLink")],1),e._v("\nThis vignette shows the main concepts regarding the process graph building with the openeo package and explains aspects the openEO API and the openEO processes from a user perspective. It states the logical structure of an openEO process description and how process graphs are created from predefined processes. Also, the details about parameters and arguments of processes are explained, especially how this affects R, where function parameters are usually type free.")])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-05-process_graph_building_application.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Process Graph Building Application")]),t("OutboundLink")],1),e._v('\nWe describe the details on how to create process graphs and respectively "User Defined Processes" (UDP). Those processes can be seen as the analysis workflows that are run as jobs at a designated openEO back-end. They might be called later directly or some variables can be added to the UDP to customize the processes at runtime, e.g. set the temporal interval or the area of interest. This vignette focuses on the user point of view.')])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-03-package-software-architecture.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Package Software Architecture")]),t("OutboundLink")],1),e._v("\nThis is the first part of a contribution guide which ensures that developers can effectively contribute to the R-Client. Since a server-client based package is different from most other R packages some concepts are used that most R users and developers are not so familiar with. Therefore, this contribution guide eases the process of actively contributing to the packages development or bug fixing by explaining the underlying concepts.")])]),e._v(" "),t("li",[t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/openeo-06-developer_implementation_details.html",target:"_blank",rel:"noopener noreferrer"}},[t("strong",[e._v("Developer Implementation Details")]),t("OutboundLink")],1),e._v("\nIn this guide selected core mechanisms of the openEO package are described. It is targeted towards interested developers and it is highly recommended to dive into the source code, while reading through this guide. The explanations here are abstracted from the code and shall guide new developers on the concepts and routines of this package.")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/106.bd225564.js b/assets/js/106.75cc6dff.js similarity index 99% rename from assets/js/106.bd225564.js rename to assets/js/106.75cc6dff.js index 80e1271ce..33c014198 100644 --- a/assets/js/106.bd225564.js +++ b/assets/js/106.75cc6dff.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{554:function(e,o,t){"use strict";t.r(o);var r=t(4),n=Object(r.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("Today, we have released the new version 1.2.0 of the openEO API. At the same time, we've also released a 2.0.0 release candidate for the openEO processes.")]),e._v(" "),o("p",[e._v("The focus of these releases is to implement vector data (cube) support in openEO so that the focus is not strongly on raster data any longer.")]),e._v(" "),o("p",[e._v("Back-ends and clients are advised to check their implementations against the new specifications and update accordingly.")]),e._v(" "),o("p",[e._v("Below you can find details about the individual releases:")]),e._v(" "),o("h2",{attrs:{id:"openeo-api-v1-2-0"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#openeo-api-v1-2-0"}},[e._v("#")]),e._v(" openEO API v1.2.0")]),e._v(" "),o("p",[e._v('We\'ve collected improvements and useful new features for two years. It contains clarifications, new extensions (for orders and federation), vector data cubes, STAC (API) updates, alignment with OGC APIs, more link relation types, improved batch job results and logs, and other minor improvements. This API release is required to be able to release openEO processes in version 2.0.0-rc.1 due to the changes from the "raster-cube" to "datacube" subtype and the related changes in the process schema.')]),e._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"https://api.openeo.org/1.2.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("API documentation"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("Please consult the "),o("strong",[o("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/tree/1.2.0/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("changelog"),o("OutboundLink")],1)]),e._v(" for the changes and additions that have been made to the API.")]),e._v(" "),o("h2",{attrs:{id:"openeo-processes-v2-0-0-rc-1"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#openeo-processes-v2-0-0-rc-1"}},[e._v("#")]),e._v(" openEO Processes v2.0.0-rc.1")]),e._v(" "),o("p",[e._v("AsWe've collected improvements and useful new processes for over a year. The processes incorporate the long-awaited changes for vector data cubes. Unfortunately, this involves some breaking changes (e.g., the new "),o("code",[e._v("datacube")]),e._v(" datatype) and thus we are moving from 1.x to 2.x. Due to the amount of (breaking) changes, we propose the changes to the community as a release candidate first so that we can evaluate whether it all works as expected. We'll then cut the final release once some implementations confirm that the changes work as planned. Feedback is more than welcome and we'll closely monitor the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue tracker"),o("OutboundLink")],1),e._v(" for your issues. Please feel encoruaged to post your feedback there.")]),e._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"https://processes.openeo.org/2.0.0-rc.1",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes documentation"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("This release includes (for the first time) a couple of breaking changes. Therefore, we'll highlight the breaking changes below.\nPlease consult the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/2.0.0-rc.1/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("changelog"),o("OutboundLink")],1),e._v(" for a full list of changes and additions.")]),e._v(" "),o("ul",[o("li",[e._v("Added better support for labeled arrays. Labels are not discarded in all cases anymore. Affected processes:\n"),o("ul",[o("li",[o("code",[e._v("array_append")])]),e._v(" "),o("li",[o("code",[e._v("array_concat")])]),e._v(" "),o("li",[o("code",[e._v("array_modify")])])])]),e._v(" "),o("li",[o("code",[e._v("array_modify")]),e._v(": Change the default value for "),o("code",[e._v("length")]),e._v(" from "),o("code",[e._v("1")]),e._v(" to "),o("code",[e._v("0")]),e._v(". "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/312",target:"_blank",rel:"noopener noreferrer"}},[e._v("#312"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("aggregate_temporal")]),e._v(", "),o("code",[e._v("filter_temporal")]),e._v(", "),o("code",[e._v("load_collection")]),e._v(" and "),o("code",[e._v("load_result")]),e._v("/"),o("code",[e._v("load_stac")]),e._v(":\n"),o("ul",[o("li",[e._v("The temporal intervals must always be non-empty, i.e. the second instance in time must be after the first instance in time. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("24")]),e._v(" as the hour is not allowed anymore.** "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)])])]),e._v(" "),o("li",[o("code",[e._v("inspect")]),e._v(": The parameter "),o("code",[e._v("message")]),e._v(" has been moved to be the second argument. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/369",target:"_blank",rel:"noopener noreferrer"}},[e._v("#369"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("New definition for "),o("code",[e._v("aggregate_spatial")]),e._v(":\n"),o("ul",[o("li",[e._v("Allows more than 3 input dimensions "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/126",target:"_blank",rel:"noopener noreferrer"}},[e._v("#126"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("Allow to not export statistics by changing the parameter "),o("code",[e._v("target_dimension")]),e._v(" "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/366",target:"_blank",rel:"noopener noreferrer"}},[e._v("#366"),o("OutboundLink")],1)])])]),e._v(" "),o("li",[e._v("Updated the processes based on the subtypes "),o("code",[e._v("raster-cube")]),e._v(" or "),o("code",[e._v("vector-cube")]),e._v(" to work with the subtype "),o("code",[e._v("datacube")]),e._v(" instead. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/68",target:"_blank",rel:"noopener noreferrer"}},[e._v("#68"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("sort")]),e._v(" and "),o("code",[e._v("order")]),e._v(": The ordering of ties is not defined anymore. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/409",target:"_blank",rel:"noopener noreferrer"}},[e._v("#409"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("quantiles")]),e._v(": Parameter "),o("code",[e._v("probabilities")]),e._v(" provided as array must be in ascending order. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/pull/297",target:"_blank",rel:"noopener noreferrer"}},[e._v("#297"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("fit_curve")]),e._v(" and "),o("code",[e._v("predict_curve")]),e._v(": Heavily modified specifications. "),o("code",[e._v("fit_curve")]),e._v(" works on arrays instead of data cubes, "),o("code",[e._v("predict_curve")]),e._v(" doesn't support gap filling anymore, clarify no-data handling, ... "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/425",target:"_blank",rel:"noopener noreferrer"}},[e._v("#425"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("climatological_normal")]),e._v(": The "),o("code",[e._v("climatology_period")]),e._v(" parameter accepts an array of integers instead of strings. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("between")]),e._v(": Support for temporal comparison. Use "),o("code",[e._v("date_between")]),e._v(" instead. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("Deprecated "),o("code",[e._v("GeometryCollections")]),e._v(" are not supported any longer. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/389",target:"_blank",rel:"noopener noreferrer"}},[e._v("#389"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("Deprecated PROJ definitions for the CRS are not supported any longer.")]),e._v(" "),o("li",[e._v("The comparison processes "),o("code",[e._v("eq")]),e._v(", "),o("code",[e._v("neq")]),e._v(", "),o("code",[e._v("lt")]),e._v(", "),o("code",[e._v("lte")]),e._v(", "),o("code",[e._v("gt")]),e._v(", "),o("code",[e._v("gte")]),e._v(" and "),o("code",[e._v("array_contains")]),e._v(":\n"),o("ul",[o("li",[e._v("Removed support for temporal comparison. Instead explicitly use "),o("code",[e._v("date_difference")]),e._v(".")]),e._v(" "),o("li",[e._v("Removed support for the input data types array and object. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/208",target:"_blank",rel:"noopener noreferrer"}},[e._v("#208"),o("OutboundLink")],1)])])]),e._v(" "),o("li",[o("code",[e._v("sort")]),e._v(" and "),o("code",[e._v("order")]),e._v(": Removed support for time-only values. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)])])])}),[],!1,null,null,null);o.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{557:function(e,o,t){"use strict";t.r(o);var r=t(4),n=Object(r.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("Today, we have released the new version 1.2.0 of the openEO API. At the same time, we've also released a 2.0.0 release candidate for the openEO processes.")]),e._v(" "),o("p",[e._v("The focus of these releases is to implement vector data (cube) support in openEO so that the focus is not strongly on raster data any longer.")]),e._v(" "),o("p",[e._v("Back-ends and clients are advised to check their implementations against the new specifications and update accordingly.")]),e._v(" "),o("p",[e._v("Below you can find details about the individual releases:")]),e._v(" "),o("h2",{attrs:{id:"openeo-api-v1-2-0"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#openeo-api-v1-2-0"}},[e._v("#")]),e._v(" openEO API v1.2.0")]),e._v(" "),o("p",[e._v('We\'ve collected improvements and useful new features for two years. It contains clarifications, new extensions (for orders and federation), vector data cubes, STAC (API) updates, alignment with OGC APIs, more link relation types, improved batch job results and logs, and other minor improvements. This API release is required to be able to release openEO processes in version 2.0.0-rc.1 due to the changes from the "raster-cube" to "datacube" subtype and the related changes in the process schema.')]),e._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"https://api.openeo.org/1.2.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("API documentation"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("Please consult the "),o("strong",[o("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/tree/1.2.0/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("changelog"),o("OutboundLink")],1)]),e._v(" for the changes and additions that have been made to the API.")]),e._v(" "),o("h2",{attrs:{id:"openeo-processes-v2-0-0-rc-1"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#openeo-processes-v2-0-0-rc-1"}},[e._v("#")]),e._v(" openEO Processes v2.0.0-rc.1")]),e._v(" "),o("p",[e._v("AsWe've collected improvements and useful new processes for over a year. The processes incorporate the long-awaited changes for vector data cubes. Unfortunately, this involves some breaking changes (e.g., the new "),o("code",[e._v("datacube")]),e._v(" datatype) and thus we are moving from 1.x to 2.x. Due to the amount of (breaking) changes, we propose the changes to the community as a release candidate first so that we can evaluate whether it all works as expected. We'll then cut the final release once some implementations confirm that the changes work as planned. Feedback is more than welcome and we'll closely monitor the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue tracker"),o("OutboundLink")],1),e._v(" for your issues. Please feel encoruaged to post your feedback there.")]),e._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"https://processes.openeo.org/2.0.0-rc.1",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes documentation"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("This release includes (for the first time) a couple of breaking changes. Therefore, we'll highlight the breaking changes below.\nPlease consult the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/2.0.0-rc.1/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("changelog"),o("OutboundLink")],1),e._v(" for a full list of changes and additions.")]),e._v(" "),o("ul",[o("li",[e._v("Added better support for labeled arrays. Labels are not discarded in all cases anymore. Affected processes:\n"),o("ul",[o("li",[o("code",[e._v("array_append")])]),e._v(" "),o("li",[o("code",[e._v("array_concat")])]),e._v(" "),o("li",[o("code",[e._v("array_modify")])])])]),e._v(" "),o("li",[o("code",[e._v("array_modify")]),e._v(": Change the default value for "),o("code",[e._v("length")]),e._v(" from "),o("code",[e._v("1")]),e._v(" to "),o("code",[e._v("0")]),e._v(". "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/312",target:"_blank",rel:"noopener noreferrer"}},[e._v("#312"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("aggregate_temporal")]),e._v(", "),o("code",[e._v("filter_temporal")]),e._v(", "),o("code",[e._v("load_collection")]),e._v(" and "),o("code",[e._v("load_result")]),e._v("/"),o("code",[e._v("load_stac")]),e._v(":\n"),o("ul",[o("li",[e._v("The temporal intervals must always be non-empty, i.e. the second instance in time must be after the first instance in time. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("24")]),e._v(" as the hour is not allowed anymore.** "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)])])]),e._v(" "),o("li",[o("code",[e._v("inspect")]),e._v(": The parameter "),o("code",[e._v("message")]),e._v(" has been moved to be the second argument. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/369",target:"_blank",rel:"noopener noreferrer"}},[e._v("#369"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("New definition for "),o("code",[e._v("aggregate_spatial")]),e._v(":\n"),o("ul",[o("li",[e._v("Allows more than 3 input dimensions "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/126",target:"_blank",rel:"noopener noreferrer"}},[e._v("#126"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("Allow to not export statistics by changing the parameter "),o("code",[e._v("target_dimension")]),e._v(" "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/366",target:"_blank",rel:"noopener noreferrer"}},[e._v("#366"),o("OutboundLink")],1)])])]),e._v(" "),o("li",[e._v("Updated the processes based on the subtypes "),o("code",[e._v("raster-cube")]),e._v(" or "),o("code",[e._v("vector-cube")]),e._v(" to work with the subtype "),o("code",[e._v("datacube")]),e._v(" instead. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/68",target:"_blank",rel:"noopener noreferrer"}},[e._v("#68"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("sort")]),e._v(" and "),o("code",[e._v("order")]),e._v(": The ordering of ties is not defined anymore. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/409",target:"_blank",rel:"noopener noreferrer"}},[e._v("#409"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("quantiles")]),e._v(": Parameter "),o("code",[e._v("probabilities")]),e._v(" provided as array must be in ascending order. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/pull/297",target:"_blank",rel:"noopener noreferrer"}},[e._v("#297"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("fit_curve")]),e._v(" and "),o("code",[e._v("predict_curve")]),e._v(": Heavily modified specifications. "),o("code",[e._v("fit_curve")]),e._v(" works on arrays instead of data cubes, "),o("code",[e._v("predict_curve")]),e._v(" doesn't support gap filling anymore, clarify no-data handling, ... "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/425",target:"_blank",rel:"noopener noreferrer"}},[e._v("#425"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("climatological_normal")]),e._v(": The "),o("code",[e._v("climatology_period")]),e._v(" parameter accepts an array of integers instead of strings. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("code",[e._v("between")]),e._v(": Support for temporal comparison. Use "),o("code",[e._v("date_between")]),e._v(" instead. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("Deprecated "),o("code",[e._v("GeometryCollections")]),e._v(" are not supported any longer. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/389",target:"_blank",rel:"noopener noreferrer"}},[e._v("#389"),o("OutboundLink")],1)]),e._v(" "),o("li",[e._v("Deprecated PROJ definitions for the CRS are not supported any longer.")]),e._v(" "),o("li",[e._v("The comparison processes "),o("code",[e._v("eq")]),e._v(", "),o("code",[e._v("neq")]),e._v(", "),o("code",[e._v("lt")]),e._v(", "),o("code",[e._v("lte")]),e._v(", "),o("code",[e._v("gt")]),e._v(", "),o("code",[e._v("gte")]),e._v(" and "),o("code",[e._v("array_contains")]),e._v(":\n"),o("ul",[o("li",[e._v("Removed support for temporal comparison. Instead explicitly use "),o("code",[e._v("date_difference")]),e._v(".")]),e._v(" "),o("li",[e._v("Removed support for the input data types array and object. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/208",target:"_blank",rel:"noopener noreferrer"}},[e._v("#208"),o("OutboundLink")],1)])])]),e._v(" "),o("li",[o("code",[e._v("sort")]),e._v(" and "),o("code",[e._v("order")]),e._v(": Removed support for time-only values. "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues/331",target:"_blank",rel:"noopener noreferrer"}},[e._v("#331"),o("OutboundLink")],1)])])])}),[],!1,null,null,null);o.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/107.cf784221.js b/assets/js/107.80c93013.js similarity index 96% rename from assets/js/107.cf784221.js rename to assets/js/107.80c93013.js index 9610b0d61..c5558cfcb 100644 --- a/assets/js/107.cf784221.js +++ b/assets/js/107.80c93013.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{556:function(e,o,t){"use strict";t.r(o);var n=t(4),s=Object(n.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("The openEO PSC is happy to share that we have submitted openEO to OGC for consideration as an OGC community standard.\nMore specifically, the "),o("a",{attrs:{href:"https://github.com/Open-EO/PSC/blob/main/documents/ogc-submission.adoc",target:"_blank",rel:"noopener noreferrer"}},[e._v("submission document"),o("OutboundLink")],1),e._v(" justifies why the openEO API specification (version 1.2.0) and the openEO process specification (version 1.2.0) are - from our point of view - a good candidate for an OGC community standard.\nWe hope OGC accepts our documents and establishes the corresponding procedures soon.")]),e._v(" "),o("p",[e._v("The members of the openEO PSC voted to submit the justification document to OGC by unanimous consent.\nWe are glad that the following OGC members confirmed to support the OCG submmissin of openEO:")]),e._v(" "),o("ul",[o("li",[e._v("University of Münster - Institute for Geoinformatics")]),e._v(" "),o("li",[e._v("Eurac Research")]),e._v(" "),o("li",[e._v("VITO (Flemish Institute for Technological Research)")]),e._v(" "),o("li",[e._v("GeoConnections - Natural Resources Canada")]),e._v(" "),o("li",[e._v("EUMETSAT")]),e._v(" "),o("li",[e._v("European Space Agency (ESA)")]),e._v(" "),o("li",[e._v("EOX IT Services GmbH")]),e._v(" "),o("li",[e._v("Telespazio VEGA UK Ltd")]),e._v(" "),o("li",[e._v("Planet Labs PBC")]),e._v(" "),o("li",[e._v("German Aerospace Center – DLR")]),e._v(" "),o("li",[e._v("Matthias Mohr - Softwareentwicklung")])]),e._v(" "),o("p",[e._v("We'll keep you updated about the progress. The next step is likely a public request for comments.")])])}),[],!1,null,null,null);o.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{559:function(e,o,t){"use strict";t.r(o);var n=t(4),s=Object(n.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("The openEO PSC is happy to share that we have submitted openEO to OGC for consideration as an OGC community standard.\nMore specifically, the "),o("a",{attrs:{href:"https://github.com/Open-EO/PSC/blob/main/documents/ogc-submission.adoc",target:"_blank",rel:"noopener noreferrer"}},[e._v("submission document"),o("OutboundLink")],1),e._v(" justifies why the openEO API specification (version 1.2.0) and the openEO process specification (version 1.2.0) are - from our point of view - a good candidate for an OGC community standard.\nWe hope OGC accepts our documents and establishes the corresponding procedures soon.")]),e._v(" "),o("p",[e._v("The members of the openEO PSC voted to submit the justification document to OGC by unanimous consent.\nWe are glad that the following OGC members confirmed to support the OCG submmissin of openEO:")]),e._v(" "),o("ul",[o("li",[e._v("University of Münster - Institute for Geoinformatics")]),e._v(" "),o("li",[e._v("Eurac Research")]),e._v(" "),o("li",[e._v("VITO (Flemish Institute for Technological Research)")]),e._v(" "),o("li",[e._v("GeoConnections - Natural Resources Canada")]),e._v(" "),o("li",[e._v("EUMETSAT")]),e._v(" "),o("li",[e._v("European Space Agency (ESA)")]),e._v(" "),o("li",[e._v("EOX IT Services GmbH")]),e._v(" "),o("li",[e._v("Telespazio VEGA UK Ltd")]),e._v(" "),o("li",[e._v("Planet Labs PBC")]),e._v(" "),o("li",[e._v("German Aerospace Center – DLR")]),e._v(" "),o("li",[e._v("Matthias Mohr - Softwareentwicklung")])]),e._v(" "),o("p",[e._v("We'll keep you updated about the progress. The next step is likely a public request for comments.")])])}),[],!1,null,null,null);o.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/108.5a4068f0.js b/assets/js/108.4ab828dd.js similarity index 94% rename from assets/js/108.5a4068f0.js rename to assets/js/108.4ab828dd.js index 3df88a315..632ccd9a8 100644 --- a/assets/js/108.5a4068f0.js +++ b/assets/js/108.4ab828dd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{557:function(e,t,n){"use strict";n.r(t);var o=n(4),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("After submitting openEO to OGC for consideration as an OGC community standard two months ago,\nOGC now seeks public comment on the potential adoption of openEO as an OGC Community Standard.\nComments are due by February 27, 2024.")]),e._v(" "),t("p",[e._v("For more details, please read the press release that was published today by OGC:\n"),t("strong",[t("a",{attrs:{href:"https://www.ogc.org/requests/ogc-considering-openeo-as-a-community-standard-comment-sought-on-its-adoption/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Request for Comments: OGC considering openEO as a Community Standard; comment sought on its adoption"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("openEO will also be presented at the next OGC member meeting in Delft on Thu, 28 Mar 2024 during the closing planery.")]),e._v(" "),t("p",[e._v("We'll keep you updated about the progress.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{560:function(e,t,n){"use strict";n.r(t);var o=n(4),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("After submitting openEO to OGC for consideration as an OGC community standard two months ago,\nOGC now seeks public comment on the potential adoption of openEO as an OGC Community Standard.\nComments are due by February 27, 2024.")]),e._v(" "),t("p",[e._v("For more details, please read the press release that was published today by OGC:\n"),t("strong",[t("a",{attrs:{href:"https://www.ogc.org/requests/ogc-considering-openeo-as-a-community-standard-comment-sought-on-its-adoption/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Request for Comments: OGC considering openEO as a Community Standard; comment sought on its adoption"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("openEO will also be presented at the next OGC member meeting in Delft on Thu, 28 Mar 2024 during the closing planery.")]),e._v(" "),t("p",[e._v("We'll keep you updated about the progress.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/11.02e948a7.js b/assets/js/11.09ba35ea.js similarity index 97% rename from assets/js/11.02e948a7.js rename to assets/js/11.09ba35ea.js index f9b731118..64a53f42d 100644 --- a/assets/js/11.02e948a7.js +++ b/assets/js/11.09ba35ea.js @@ -1,3 +1,3 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{178:function(e,t,r){"use strict";function s(e,t,r,s){var a=s?" !== ":" === ",i=s?" || ":" && ",o=s?"!":"",n=s?"":"!";switch(e){case"null":return t+a+"null";case"array":return o+"Array.isArray("+t+")";case"object":return"("+o+t+i+"typeof "+t+a+'"object"'+i+n+"Array.isArray("+t+"))";case"integer":return"(typeof "+t+a+'"number"'+i+n+"("+t+" % 1)"+i+t+a+t+(r?i+o+"isFinite("+t+")":"")+")";case"number":return"(typeof "+t+a+'"'+e+'"'+(r?i+o+"isFinite("+t+")":"")+")";default:return"typeof "+t+a+'"'+e+'"'}}e.exports={copy:function(e,t){for(var r in t=t||{},e)t[r]=e[r];return t},checkDataType:s,checkDataTypes:function(e,t,r){switch(e.length){case 1:return s(e[0],t,r,!0);default:var a="",o=i(e);for(var n in o.array&&o.object&&(a=o.null?"(":"(!"+t+" || ",a+="typeof "+t+' !== "object")',delete o.null,delete o.array,delete o.object),o.number&&delete o.integer,o)a+=(a?" && ":"")+s(n,t,r,!0);return a}},coerceToTypes:function(e,t){if(Array.isArray(t)){for(var r=[],s=0;s=t)throw new Error("Cannot access property/index "+s+" levels up, current level is "+t);return r[t-s]}if(s>t)throw new Error("Cannot access data "+s+" levels up, current level is "+t);if(i="data"+(t-s||""),!a)return i}for(var n=i,c=a.split("/"),p=0;pawait this.validateSubtype(e,t,r),async:!0,errors:!0})),this.collections=null,this.epsgCodes=null,this.fileFormats={input:null,output:null},this.processRegistry=null,this.udfRuntimes=null}getFunctionName(e){return"validate"+e.replace(/(^|\-)(\w)/g,(e,t,r)=>r.toUpperCase())}makeSchema(e,t=!1){if(e=a.deepClone(e),Array.isArray(e)&&(e={anyOf:e}),void 0===e.$schema&&(e.$schema="http://json-schema.org/draft-07/schema#"),t&&(e.$async=!0,a.isObject(e.definitions)))for(let t in e.definitions)e.definitions[t].$async=!0;return e}async validateValue(e,t){t=this.makeSchema(t,!0);try{return await this.ajv.validate(t,e),[]}catch(e){if(Array.isArray(e.errors))return e.errors.map(e=>e.message);throw e}}async validateSubtype(e,t,r){void 0!==l.definitions[e]?(r=this.makeSchema(l,!0),r=Object.assign({},l.definitions[e],r),"process-graph"===e&&(delete r.required,delete r.properties)):r=this.makeSchema(r,!0),delete r.subtype;let s=await this.ajv.validate(r,t),a=this.getFunctionName(e);return s&&"function"==typeof this[a]?await this[a](t):s}setUdfRuntimes(e){a.isObject(e)&&(this.udfRuntimes=e)}setCollections(e){if(Array.isArray(e)){this.collections=[];for(let t of e)a.isObject(t)&&"string"==typeof t.id?this.collections.push(t.id):"string"==typeof t&&this.collections.push(t)}}setFileFormats(e){if(a.isObject(e))for(let t of["input","output"])if(this.fileFormats[t]={},a.isObject(e[t]))for(let r in e[t])this.fileFormats[t][r.toUpperCase()]=e[t][r]}setEpsgCodes(e){Array.isArray(e)&&(this.epsgCodes=e.map(e=>parseInt(e,10)))}async validateCollectionId(e){if(Array.isArray(this.collections)&&!this.collections.find(t=>t===e))throw new s.ValidationError([{message:"Collection with id '"+e+"' doesn't exist."}]);return!0}async validateUdfRuntime(e){if(a.isObject(this.udfRuntimes)&&!(e in this.udfRuntimes))throw new s.ValidationError([{message:"UDF runtime '"+e+"' is not supported."}]);return!0}async validateEpsgCode(e){if(Array.isArray(this.epsgCodes)){if(this.epsgCodes.includes(e))return!0}else if(e>=2e3)return!0;throw new s.ValidationError([{message:"Invalid EPSG code '"+e+"' specified."}])}async validateInputFormat(e){if(a.isObject(this.fileFormats.input)&&!(e.toUpperCase()in this.fileFormats.input))throw new s.ValidationError([{message:"Input format '"+e+"' not supported."}]);return!0}async validateOutputFormat(e){if(a.isObject(this.fileFormats.output)&&!(e.toUpperCase()in this.fileFormats.output))throw new s.ValidationError([{message:"Output format '"+e+"' not supported."}]);return!0}async validateProjDefinition(e){if(!e.toLowerCase().includes("+proj"))throw new s.ValidationError([{message:"Invalid PROJ string specified (doesn't contain '+proj')."}]);return!0}async validateWkt2Definition(e){if(e=e.toUpperCase(),!["BOUNDCRS","COMPOUNDCRS","ENGCRS","ENGINEERINGCRS","GEODCRS","GEODETICCRS","GEOGCRS","GEOGRAPHICCRS","PARAMETRICCRS","PROJCRS","PROJECTEDCRS","TIMECRS","VERTCRS","VERTICALCRS"].some(t=>-1!==e.indexOf(t)))throw new s.ValidationError([{message:"Invalid WKT2 string specified."}]);return!0}async validateTemporalInterval(e){if(null===e[0]&&null===e[1])throw new s.ValidationError([{message:"Temporal interval must not be open on both ends."}]);if(null!==e[0]&&null!==e[1]){let t=new Date(e[0]);if(new Date(e[1]).getTime(){for(var t in n){var i=n[t];if("string"!=typeof e.type||!r&&"string"!=typeof i.type)return!0;if(e.type===i.type||s&&("array"===e.type||"object"===e.type)||"number"===e.type&&"integer"===i.type||!r&&"integer"===e.type&&"number"===i.type)if("array"===e.type&&a.isObject(e.items)&&a.isObject(i.items)){if(s&&c.isSchemaCompatible(e.items,i,r))return!0;if(c.isSchemaCompatible(e.items,i.items,r))return!0}else{if("object"===e.type&&a.isObject(e.properties)&&a.isObject(i.properties))return!0;if(!(r||"string"==typeof e.subtype&&"string"==typeof i.subtype))return!0;if("string"!=typeof e.subtype)return!0;if(e.subtype===i.subtype)return!0}}return!1})}}e.exports=c},223:function(e,t,r){"use strict";var s=r(408),a=r(224),i=r(178),o=r(271),n=r(410);function l(e,t,r){var s=this._refs[r];if("string"==typeof s){if(!this._refs[s])return l.call(this,e,t,s);s=this._refs[s]}if((s=s||this._schemas[r])instanceof o)return m(s.schema,this._opts.inlineRefs)?s.schema:s.validate||this._compile(s);var a,i,n,p=c.call(this,t,r);return p&&(a=p.schema,t=p.root,n=p.baseId),a instanceof o?i=a.validate||e.call(this,a.schema,t,void 0,n):void 0!==a&&(i=m(a,this._opts.inlineRefs)?a:e.call(this,a,t,void 0,n)),i}function c(e,t){var r=s.parse(t),a=y(r),i=f(this._getId(e.schema));if(0===Object.keys(e.schema).length||a!==i){var n=g(a),l=this._refs[n];if("string"==typeof l)return p.call(this,e,l,r);if(l instanceof o)l.validate||this._compile(l),e=l;else{if(!((l=this._schemas[n])instanceof o))return;if(l.validate||this._compile(l),n==g(t))return{schema:l,root:e,baseId:i};e=l}if(!e.schema)return;i=f(this._getId(e.schema))}return u.call(this,r,i,e.schema,e)}function p(e,t,r){var s=c.call(this,e,t);if(s){var a=s.schema,i=s.baseId;e=s.root;var o=this._getId(a);return o&&(i=b(i,o)),u.call(this,r,i,a,e)}}e.exports=l,l.normalizeId=g,l.fullPath=f,l.url=b,l.ids=function(e){var t=g(this._getId(e)),r={"":t},o={"":f(t,!1)},l={},c=this;return n(e,{allKeys:!0},(function(e,t,n,p,h,u,d){if(""!==t){var m=c._getId(e),f=r[p],y=o[p]+"/"+h;if(void 0!==d&&(y+="/"+("number"==typeof d?d:i.escapeFragment(d))),"string"==typeof m){m=f=g(f?s.resolve(f,m):m);var v=c._refs[m];if("string"==typeof v&&(v=c._refs[v]),v&&v.schema){if(!a(e,v.schema))throw new Error('id "'+m+'" resolves to more than one schema')}else if(m!=g(y))if("#"==m[0]){if(l[m]&&!a(e,l[m]))throw new Error('id "'+m+'" resolves to more than one schema');l[m]=e}else c._refs[m]=y}r[t]=f,o[t]=y}})),l},l.inlineRef=m,l.schema=c;var h=i.toHash(["properties","patternProperties","enum","dependencies","definitions"]);function u(e,t,r,s){if(e.fragment=e.fragment||"","/"==e.fragment.slice(0,1)){for(var a=e.fragment.split("/"),o=1;o0){let e=r.shift();s.setCallbackParameters(c.getCallbackParametersForProcess(s.getParentProcess(),e,r))}return s.parse(),this.children.push(s),s}getParentNode(){return this.parentNode}getParent(){return this.parentNode?this.parentNode.getProcessGraph():null}setParentNode(e){this.parentNode=e instanceof n?e:null}isValid(){return this.validated&&0===this.errors.count()}addError(e){this.errors.add(e)}allowUndefinedParameters(e=!0){e||(this.fillProcessParameters=!1),this.allowUndefinedParameterRefs=e}fillUndefinedParameters(e=!0){e&&(this.allowUndefinedParameterRefs=!0),this.fillProcessParameters=e}allowEmpty(e=!0){this.allowEmptyGraph=e}parse(){if(this.parsed)return;const e=e=>this.getParentProcessId()?new o(e+"Callback",{process_id:this.getParentProcessId(),node_id:this.parentNode?this.parentNode.id:"N/A"}):new o(e);if(!l.isObject(this.process))throw e("ProcessMissing");if(0===l.size(this.process.process_graph)){if(this.allowEmptyGraph){let e=Object.keys(this.process).find(e=>p.includes(e));if(0===l.size(this.process)||e)return void(this.parsed=!0)}throw e("ProcessGraphMissing")}this.nodes=l.mapObjectValues(this.process.process_graph,(e,t)=>this.createNodeInstance(e,t,this));for(let r in this.nodes){var t=this.nodes[r];if(t.isResultNode){if(null!==this.resultNode)throw e("MultipleResultNodes");this.resultNode=t}this.parseNodeArguments(r,t)}if(null===this.resultNode)throw e("ResultNodeMissing");if(this.startNodes=Object.values(this.nodes).filter(e=>e.isStartNode()).sort((e,t)=>e.id.localeCompare(t.id)),0===this.startNodes.length)throw e("StartNodeMissing");this.parsed=!0}async validate(e=!0){if(this.validated){if(e&&this.errors.count()>0)throw this.errors.first();return this.errors}this.validated=!0;try{this.parse()}catch(t){if(this.addError(t),e)throw t}return await this.validateNodes(this.getStartNodes(),e),this.errors}async execute(e=null){return this.allowUndefinedParameters(!1),this.setArguments(e),await this.validate(),this.reset(),await this.executeNodes(this.getStartNodes()),this.getResultNode()}async validateNodes(e,t,r=null){if(0!==e.length){var s=e.map(async e=>{if(e.solveDependency(r)){try{await this.validateNode(e)}catch(e){if(e instanceof a){if(this.errors.merge(e),t)throw e.first()}else if(this.addError(e),t)throw e}await this.validateNodes(e.getNextNodes(),t,e)}});await Promise.all(s)}}async validateNode(e){var t=this.getProcess(e);if(t)return await t.validate(e)}async executeNodes(e,t=null){if(0!==e.length){var r=e.map(async e=>{if(e.solveDependency(t)){var r=await this.executeNode(e);e.setResult(r),await this.executeNodes(e.getNextNodes(),e)}});return await Promise.all(r)}}async executeNode(e){var t=this.getProcess(e);return await t.execute(e)}parseNodeArguments(e,t,r=[],s){void 0===s&&(s=t.arguments);for(let i in s){let n=s[i],c=r.concat([i]);switch(l.getType(n)){case"result":var a=this.nodes[n.from_node];if(void 0===a)throw new o("ReferencedNodeMissing",{node_id:n.from_node});t.addPreviousNode(a),a.addNextNode(t);break;case"callback":s[i]=this.createChildProcessGraph(n,t,c);break;case"parameter":this.fillProcessParameters&&!this.hasParameter(n.from_parameter)&&this.addProcessParameter(n.from_parameter);break;case"array":case"object":this.parseNodeArguments(e,t,c,n)}}}setCallbackParameters(e){this.callbackParameters=e}getCallbackParameter(e){return this.getCallbackParameters().find(t=>t.name===e)||null}getCallbackParameters(){return this.callbackParameters}addProcessParameter(e,t="",r={}){Array.isArray(this.process.parameters)||(this.process.parameters=[]),this.process.parameters.push({name:e,description:t,schema:r})}hasParameterDefault(e){return void 0!==this.getParameterDefault(e)}getParameterDefault(e){let t=this.getParameter(e);if(null!==t)return t.default}hasParameter(e){return null!==this.getParameter(e)}getProcessParameters(e=!1){let t=Array.isArray(this.process.parameters)?this.process.parameters.slice(0):[];if(e&&!this.fillProcessParameters)for(let e in this.nodes){let r=this.nodes[e].getRefs();for(let e of r)e.from_parameter&&!t.find(t=>t.name===e.from_parameter)&&t.push({name:e.from_parameter,description:"",schema:{}})}return t}getProcessParameter(e,t=!1){return this.getProcessParameters(t).find(t=>t.name===e)||null}getParameter(e){let t=this.getCallbackParameter(e),r=this.getProcessParameter(e);return t&&r?Object.assign({},t,r):t||(r||null)}setArguments(e){l.isObject(e)&&Object.assign(this.arguments,e)}hasArgument(e){return void 0!==this.arguments[e]}getArgument(e){return this.arguments[e]}reset(){for(var e in this.nodes)this.nodes[e].reset();this.children.forEach(e=>e.reset())}getResultNode(){return this.resultNode}getStartNodes(){return this.startNodes}getStartNodeIds(){return this.startNodes.map(e=>e.id)}getNode(e){return e in this.nodes?this.nodes[e]:null}getNodeCount(){return l.size(this.nodes)}getNodes(){return this.nodes}getErrors(){return this.errors}getProcess(e,t=null){if(null===this.processRegistry)return null;let r;e instanceof n?(r=e.process_id,t=e.namespace):r=e;let s=this.processRegistry.get(r,t);if(null===s)throw new o("ProcessUnsupported",{process:r,namespace:t||"n/a"});return this.createProcessInstance(s)}getParentProcessId(){return this.getParentNode()?this.getParentNode().process_id:null}getParentProcess(){return null===this.processRegistry?null:this.processRegistry.get(this.getParentProcessId())}}e.exports=h},270:function(e,t,r){const s=r(222),a=r(204),i=r(196),o=r(179);e.exports=class{constructor(e){if(Object.assign(this,e),"string"!=typeof this.id)throw new Error("Invalid process specified, no id given.");Array.isArray(this.parameters)||(this.parameters=[])}toJSON(){return o.omitFromObject(this,["validate","validateArgument","execute","test"])}async validate(e){let t=e.getArgumentNames().filter(e=>-1===this.parameters.findIndex(t=>t.name===e));if(t.length>0)throw new a("ProcessArgumentUnsupported",{process:this.id,namespace:this.namespace||"n/a",arguments:t});for(let t in this.parameters){let r=this.parameters[t];if(!e.hasArgument(r.name)){if(r.optional)continue;throw new a("ProcessArgumentRequired",{process:this.id,namespace:this.namespace||"n/a",argument:r.name})}let s=e.getParsedArgument(r.name),i=e.getRawArgument(r.name);await this.validateArgument(s,i,e,r)}}async validateArgument(e,t,r,n,l=null){l||(l=n.name);let c=o.getType(e),p=r.getProcessGraph();switch(c){case"parameter":let c=p.getCallbackParameter(e.from_parameter);if(c){if(!s.isSchemaCompatible(n.schema,c.schema))throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:"Schema for parameter '"+e.from_parameter+"' not compatible with reference"});return}let u=r.getProcessGraphParameterValue(e.from_parameter);if(void 0===u&&!p.allowUndefinedParameterRefs)throw new a("ProcessGraphParameterMissing",{argument:e.from_parameter,node_id:r.id,process_id:r.process_id,namespace:r.namespace||"n/a"});let d=p.getProcessParameter(e.from_parameter);if(o.isObject(d)&&d.schema&&(void 0!==u&&await this.validateArgument(u,t,r,d,l),!s.isSchemaCompatible(n.schema,d.schema)))throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:"Schema for parameter '"+e.from_parameter+"' not compatible"});break;case"result":let m=p.getNode(e.from_node),f=p.getProcess(m);if(!s.isSchemaCompatible(n.schema,f.returns.schema))throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:"Schema for result '"+e.from_node+"' not compatible"});break;case"array":case"object":let y=i.normalizeJsonSchema(n.schema).filter(e=>["array","object"].includes(e.type)),v=1===y.length&&"process-graph"===y[0].subtype;if(o.containsRef(t)&&!v){for(var h in e){let s=y.map(e=>i.getElementJsonSchema(e,h)).filter(e=>Object.keys(e).length);if(s.length>0){let a=0,i=null;for(let o of s)try{await this.validateArgument(e[h],t[h],r,{schema:o},l+"/"+h),a++}catch(e){i=e}if(0===a&&i)throw i}}return}default:let g=r.getProcessGraph().getJsonSchemaValidator(),b=await g.validateValue(e,n.schema);if(b.length>0)throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:b})}}async execute(){throw new Error(`execute not implemented yet for process '${this.id}' (namespace: ${this.namespace||"n/a"})`)}test(){throw new Error(`test not implemented yet for process '${this.id}' (namespace: ${this.namespace||"n/a"})`)}}},271:function(e,t,r){"use strict";var s=r(178);e.exports=function(e){s.copy(e,this)}},272:function(e,t,r){"use strict";e.exports=function(e,t){t||(t={}),"function"==typeof t&&(t={cmp:t});var r,s="boolean"==typeof t.cycles&&t.cycles,a=t.cmp&&(r=t.cmp,function(e){return function(t,s){var a={key:t,value:e[t]},i={key:s,value:e[s]};return r(a,i)}}),i=[];return function e(t){if(t&&t.toJSON&&"function"==typeof t.toJSON&&(t=t.toJSON()),void 0!==t){if("number"==typeof t)return isFinite(t)?""+t:"null";if("object"!=typeof t)return JSON.stringify(t);var r,o;if(Array.isArray(t)){for(o="[",r=0;r",g=d?">":"<",b=void 0;if(!u&&"number"!=typeof n&&void 0!==n)throw new Error(t+" must be number");if(!y&&void 0!==f&&"number"!=typeof f&&"boolean"!=typeof f)throw new Error(m+" must be number or boolean");if(y){var P=e.util.getData(f.$data,o,e.dataPathArr),w="exclusive"+i,E="exclType"+i,S="exclIsNumber"+i,x="' + "+(O="op"+i)+" + '";a+=" var schemaExcl"+i+" = "+P+"; ",a+=" var "+w+"; var "+E+" = typeof "+(P="schemaExcl"+i)+"; if ("+E+" != 'boolean' && "+E+" != 'undefined' && "+E+" != 'number') { ";var k;b=m;(k=k||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: {} ",!1!==e.opts.messages&&(a+=" , message: '"+m+" should be boolean' "),e.opts.verbose&&(a+=" , schema: validate.schema"+l+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var _=a;a=k.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+_+"]); ":a+=" validate.errors = ["+_+"]; return false; ":a+=" var err = "+_+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" "+E+" == 'number' ? ( ("+w+" = "+s+" === undefined || "+P+" "+v+"= "+s+") ? "+h+" "+g+"= "+P+" : "+h+" "+g+" "+s+" ) : ( ("+w+" = "+P+" === true) ? "+h+" "+g+"= "+s+" : "+h+" "+g+" "+s+" ) || "+h+" !== "+h+") { var op"+i+" = "+w+" ? '"+v+"' : '"+v+"='; ",void 0===n&&(b=m,c=e.errSchemaPath+"/"+m,s=P,u=y)}else{x=v;if((S="number"==typeof f)&&u){var O="'"+x+"'";a+=" if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" ( "+s+" === undefined || "+f+" "+v+"= "+s+" ? "+h+" "+g+"= "+f+" : "+h+" "+g+" "+s+" ) || "+h+" !== "+h+") { "}else{S&&void 0===n?(w=!0,b=m,c=e.errSchemaPath+"/"+m,s=f,g+="="):(S&&(s=Math[d?"min":"max"](f,n)),f===(!S||s)?(w=!0,b=m,c=e.errSchemaPath+"/"+m,g+="="):(w=!1,x+="="));O="'"+x+"'";a+=" if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" "+h+" "+g+" "+s+" || "+h+" !== "+h+") { "}}b=b||t,(k=k||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { comparison: "+O+", limit: "+s+", exclusive: "+w+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be "+x+" ",a+=u?"' + "+s:s+"'"),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";_=a;return a=k.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+_+"]); ":a+=" validate.errors = ["+_+"]; return false; ":a+=" var err = "+_+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",p&&(a+=" else { "),a}},275:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" "+h+".length "+("maxItems"==t?">":"<")+" "+s+") { ";var d=t,m=m||[];m.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxItems"==t?"more":"fewer",a+=" than ",a+=u?"' + "+s+" + '":""+n,a+=" items' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var f=a;return a=m.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+f+"]); ":a+=" validate.errors = ["+f+"]; return false; ":a+=" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},276:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");var d="maxLength"==t?">":"<";a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),!1===e.opts.unicode?a+=" "+h+".length ":a+=" ucs2length("+h+") ",a+=" "+d+" "+s+") { ";var m=t,f=f||[];f.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(m||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT be ",a+="maxLength"==t?"longer":"shorter",a+=" than ",a+=u?"' + "+s+" + '":""+n,a+=" characters' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var y=a;return a=f.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+y+"]); ":a+=" validate.errors = ["+y+"]; return false; ":a+=" var err = "+y+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},277:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" Object.keys("+h+").length "+("maxProperties"==t?">":"<")+" "+s+") { ";var d=t,m=m||[];m.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxProperties"==t?"more":"fewer",a+=" than ",a+=u?"' + "+s+" + '":""+n,a+=" properties' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var f=a;return a=m.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+f+"]); ":a+=" validate.errors = ["+f+"]; return false; ":a+=" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},278:function(e){e.exports=JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}')},279:function(e,t){e.exports=class{constructor(){this.errors=[]}first(){return this.errors[0]||null}last(){return this.errors[this.errors.length-1]||null}merge(e){this.errors=this.errors.concat(e.getAll())}add(e){this.errors.push(e)}count(){return this.errors.length}toJSON(){return this.errors.map(e=>"function"==typeof e.toJSON?e.toJSON():{code:"InternalError",message:e.message})}getMessage(){var e="";for(var t in this.errors)e+=parseInt(t,10)+1+". "+this.errors[t].message+"\r\n";return e.trim()}getAll(){return this.errors}}},280:function(e,t,r){const s=r(204),a=r(179);e.exports=class{constructor(e,t,r=null){if("string"!=typeof t||0===t.length)throw new s("NodeIdInvalid");if(!a.isObject(e))throw new s("NodeInvalid",{node_id:t});if("string"!=typeof e.process_id)throw new s("ProcessIdMissing",{node_id:t});this.id=t,this.processGraph=r,this.source=e,this.process_id=e.process_id,this.namespace=e.namespace||null,this.arguments=a.isObject(e.arguments)?a.deepClone(e.arguments):{},this.description=e.description||null,this.isResultNode=e.result||!1,this.expectsFrom=[],this.receivedFrom=[],this.passesTo=[],this.computedResult=void 0}toJSON(){let e=a.mapObjectValues(this.arguments,e=>a.isObject(e)&&"function"==typeof e.toJSON?e.toJSON():e);return Object.assign({},this.source,{process_id:this.process_id,namespace:this.namespace,description:this.description,arguments:e,result:this.isResultNode})}getProcessGraph(){return this.processGraph}getParent(){return null!==this.processGraph?this.processGraph.getParentNode():null}getArgumentNames(){return Object.keys(this.arguments)}hasArgument(e){return void 0!==this.arguments[e]}getArgumentType(e){return a.getType(this.getRawArgument(e))}getRawArgument(e){return a.isObject(this.source.arguments)?this.source.arguments[e]:void 0}getParsedArgument(e){return this.arguments[e]}getArgument(e,t){return void 0===this.arguments[e]?t:this.evaluateArgument(this.arguments[e])}getArgumentRefs(e){return a.getRefs(this.getRawArgument(e),!1)}getRefs(){return a.getRefs(this.source.arguments,!1)}getProcessGraphParameterValue(e){let t,r=this.processGraph;do{if(r.hasArgument(e))return r.getArgument(e);r.hasParameterDefault(e)&&(t=r.getParameterDefault(e)),r=r.getParent()}while(null!==r);if(void 0!==t)return t;if(!this.processGraph.allowUndefinedParameterRefs)throw new s("ProcessGraphParameterMissing",{argument:e,node_id:this.id,process_id:this.process_id,namespace:this.namespace||"n/a"})}evaluateArgument(e){var t=a.getType(e);switch(t){case"result":return this.processGraph.getNode(e.from_node).getResult();case"callback":return e;case"parameter":return this.getProcessGraphParameterValue(e.from_parameter);case"array":case"object":let s="array"===t?[]:{};for(var r in e)s[r]=this.evaluateArgument(e[r]);return s;default:return e}}isStartNode(){return 0===this.expectsFrom.length}addPreviousNode(e){this.expectsFrom.find(t=>t.id===e.id)||this.expectsFrom.push(e)}getPreviousNodes(){return this.expectsFrom.sort((e,t)=>e.id.localeCompare(t.id))}addNextNode(e){this.passesTo.find(t=>t.id===e.id)||this.passesTo.push(e)}getNextNodes(){return this.passesTo.sort((e,t)=>e.id.localeCompare(t.id))}reset(){this.computedResult=void 0,this.receivedFrom=[]}getDescription(){return this.description}setDescription(e){this.description="string"==typeof e?e:null}setResult(e){this.computedResult=e}getResult(){return this.computedResult}solveDependency(e){return null!==e&&this.expectsFrom.includes(e)&&this.receivedFrom.push(e),this.expectsFrom.length===this.receivedFrom.length}}},281:function(e,t,r){},282:function(e,t,r){},283:function(e,t,r){"use strict";e.exports=function(e,t,r,s,a,i,o,n){var l=r-e,c=s-t,p=o-a,h=n-i,u=(-c*(e-a)+l*(t-i))/(-p*c+l*h),d=(p*(t-i)-h*(e-a))/(-p*c+l*h);return u>=0&&u<=1&&d>=0&&d<=1}},284:function(e,t,r){},406:function(e,t,r){"use strict";var s=r(407),a=r(223),i=r(411),o=r(271),n=r(272),l=r(412),c=r(413),p=r(434),h=r(178);e.exports=v,v.prototype.validate=function(e,t){var r;if("string"==typeof e){if(!(r=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var s=this._addSchema(e);r=s.validate||this._compile(s)}var a=r(t);!0!==r.$async&&(this.errors=r.errors);return a},v.prototype.compile=function(e,t){var r=this._addSchema(e,void 0,t);return r.validate||this._compile(r)},v.prototype.addSchema=function(e,t,r,s){if(Array.isArray(e)){for(var i=0;i=0?{index:s,compiling:!0}:(s=this._compilations.length,this._compilations[s]={schema:e,root:t,baseId:r},{index:s,compiling:!1})}function u(e,t,r){var s=d.call(this,e,t,r);s>=0&&this._compilations.splice(s,1)}function d(e,t,r){for(var s=0;s=t)throw new Error("Cannot access property/index "+s+" levels up, current level is "+t);return r[t-s]}if(s>t)throw new Error("Cannot access data "+s+" levels up, current level is "+t);if(i="data"+(t-s||""),!a)return i}for(var n=i,c=a.split("/"),p=0;pawait this.validateSubtype(e,t,r),async:!0,errors:!0})),this.collections=null,this.epsgCodes=null,this.fileFormats={input:null,output:null},this.processRegistry=null,this.udfRuntimes=null}getFunctionName(e){return"validate"+e.replace(/(^|\-)(\w)/g,(e,t,r)=>r.toUpperCase())}makeSchema(e,t=!1){if(e=a.deepClone(e),Array.isArray(e)&&(e={anyOf:e}),void 0===e.$schema&&(e.$schema="http://json-schema.org/draft-07/schema#"),t&&(e.$async=!0,a.isObject(e.definitions)))for(let t in e.definitions)e.definitions[t].$async=!0;return e}async validateValue(e,t){t=this.makeSchema(t,!0);try{return await this.ajv.validate(t,e),[]}catch(e){if(Array.isArray(e.errors))return e.errors.map(e=>e.message);throw e}}async validateSubtype(e,t,r){void 0!==l.definitions[e]?(r=this.makeSchema(l,!0),r=Object.assign({},l.definitions[e],r),"process-graph"===e&&(delete r.required,delete r.properties)):r=this.makeSchema(r,!0),delete r.subtype;let s=await this.ajv.validate(r,t),a=this.getFunctionName(e);return s&&"function"==typeof this[a]?await this[a](t):s}setUdfRuntimes(e){a.isObject(e)&&(this.udfRuntimes=e)}setCollections(e){if(Array.isArray(e)){this.collections=[];for(let t of e)a.isObject(t)&&"string"==typeof t.id?this.collections.push(t.id):"string"==typeof t&&this.collections.push(t)}}setFileFormats(e){if(a.isObject(e))for(let t of["input","output"])if(this.fileFormats[t]={},a.isObject(e[t]))for(let r in e[t])this.fileFormats[t][r.toUpperCase()]=e[t][r]}setEpsgCodes(e){Array.isArray(e)&&(this.epsgCodes=e.map(e=>parseInt(e,10)))}async validateCollectionId(e){if(Array.isArray(this.collections)&&!this.collections.find(t=>t===e))throw new s.ValidationError([{message:"Collection with id '"+e+"' doesn't exist."}]);return!0}async validateUdfRuntime(e){if(a.isObject(this.udfRuntimes)&&!(e in this.udfRuntimes))throw new s.ValidationError([{message:"UDF runtime '"+e+"' is not supported."}]);return!0}async validateEpsgCode(e){if(Array.isArray(this.epsgCodes)){if(this.epsgCodes.includes(e))return!0}else if(e>=2e3)return!0;throw new s.ValidationError([{message:"Invalid EPSG code '"+e+"' specified."}])}async validateInputFormat(e){if(a.isObject(this.fileFormats.input)&&!(e.toUpperCase()in this.fileFormats.input))throw new s.ValidationError([{message:"Input format '"+e+"' not supported."}]);return!0}async validateOutputFormat(e){if(a.isObject(this.fileFormats.output)&&!(e.toUpperCase()in this.fileFormats.output))throw new s.ValidationError([{message:"Output format '"+e+"' not supported."}]);return!0}async validateProjDefinition(e){if(!e.toLowerCase().includes("+proj"))throw new s.ValidationError([{message:"Invalid PROJ string specified (doesn't contain '+proj')."}]);return!0}async validateWkt2Definition(e){if(e=e.toUpperCase(),!["BOUNDCRS","COMPOUNDCRS","ENGCRS","ENGINEERINGCRS","GEODCRS","GEODETICCRS","GEOGCRS","GEOGRAPHICCRS","PARAMETRICCRS","PROJCRS","PROJECTEDCRS","TIMECRS","VERTCRS","VERTICALCRS"].some(t=>-1!==e.indexOf(t)))throw new s.ValidationError([{message:"Invalid WKT2 string specified."}]);return!0}async validateTemporalInterval(e){if(null===e[0]&&null===e[1])throw new s.ValidationError([{message:"Temporal interval must not be open on both ends."}]);if(null!==e[0]&&null!==e[1]){let t=new Date(e[0]);if(new Date(e[1]).getTime(){for(var t in n){var i=n[t];if("string"!=typeof e.type||!r&&"string"!=typeof i.type)return!0;if(e.type===i.type||s&&("array"===e.type||"object"===e.type)||"number"===e.type&&"integer"===i.type||!r&&"integer"===e.type&&"number"===i.type)if("array"===e.type&&a.isObject(e.items)&&a.isObject(i.items)){if(s&&c.isSchemaCompatible(e.items,i,r))return!0;if(c.isSchemaCompatible(e.items,i.items,r))return!0}else{if("object"===e.type&&a.isObject(e.properties)&&a.isObject(i.properties))return!0;if(!(r||"string"==typeof e.subtype&&"string"==typeof i.subtype))return!0;if("string"!=typeof e.subtype)return!0;if(e.subtype===i.subtype)return!0}}return!1})}}e.exports=c},223:function(e,t,r){"use strict";var s=r(410),a=r(224),i=r(178),o=r(272),n=r(412);function l(e,t,r){var s=this._refs[r];if("string"==typeof s){if(!this._refs[s])return l.call(this,e,t,s);s=this._refs[s]}if((s=s||this._schemas[r])instanceof o)return m(s.schema,this._opts.inlineRefs)?s.schema:s.validate||this._compile(s);var a,i,n,p=c.call(this,t,r);return p&&(a=p.schema,t=p.root,n=p.baseId),a instanceof o?i=a.validate||e.call(this,a.schema,t,void 0,n):void 0!==a&&(i=m(a,this._opts.inlineRefs)?a:e.call(this,a,t,void 0,n)),i}function c(e,t){var r=s.parse(t),a=y(r),i=f(this._getId(e.schema));if(0===Object.keys(e.schema).length||a!==i){var n=g(a),l=this._refs[n];if("string"==typeof l)return p.call(this,e,l,r);if(l instanceof o)l.validate||this._compile(l),e=l;else{if(!((l=this._schemas[n])instanceof o))return;if(l.validate||this._compile(l),n==g(t))return{schema:l,root:e,baseId:i};e=l}if(!e.schema)return;i=f(this._getId(e.schema))}return u.call(this,r,i,e.schema,e)}function p(e,t,r){var s=c.call(this,e,t);if(s){var a=s.schema,i=s.baseId;e=s.root;var o=this._getId(a);return o&&(i=b(i,o)),u.call(this,r,i,a,e)}}e.exports=l,l.normalizeId=g,l.fullPath=f,l.url=b,l.ids=function(e){var t=g(this._getId(e)),r={"":t},o={"":f(t,!1)},l={},c=this;return n(e,{allKeys:!0},(function(e,t,n,p,h,u,d){if(""!==t){var m=c._getId(e),f=r[p],y=o[p]+"/"+h;if(void 0!==d&&(y+="/"+("number"==typeof d?d:i.escapeFragment(d))),"string"==typeof m){m=f=g(f?s.resolve(f,m):m);var v=c._refs[m];if("string"==typeof v&&(v=c._refs[v]),v&&v.schema){if(!a(e,v.schema))throw new Error('id "'+m+'" resolves to more than one schema')}else if(m!=g(y))if("#"==m[0]){if(l[m]&&!a(e,l[m]))throw new Error('id "'+m+'" resolves to more than one schema');l[m]=e}else c._refs[m]=y}r[t]=f,o[t]=y}})),l},l.inlineRef=m,l.schema=c;var h=i.toHash(["properties","patternProperties","enum","dependencies","definitions"]);function u(e,t,r,s){if(e.fragment=e.fragment||"","/"==e.fragment.slice(0,1)){for(var a=e.fragment.split("/"),o=1;o0){let e=r.shift();s.setCallbackParameters(c.getCallbackParametersForProcess(s.getParentProcess(),e,r))}return s.parse(),this.children.push(s),s}getParentNode(){return this.parentNode}getParent(){return this.parentNode?this.parentNode.getProcessGraph():null}setParentNode(e){this.parentNode=e instanceof n?e:null}isValid(){return this.validated&&0===this.errors.count()}addError(e){this.errors.add(e)}allowUndefinedParameters(e=!0){e||(this.fillProcessParameters=!1),this.allowUndefinedParameterRefs=e}fillUndefinedParameters(e=!0){e&&(this.allowUndefinedParameterRefs=!0),this.fillProcessParameters=e}allowEmpty(e=!0){this.allowEmptyGraph=e}parse(){if(this.parsed)return;const e=e=>this.getParentProcessId()?new o(e+"Callback",{process_id:this.getParentProcessId(),node_id:this.parentNode?this.parentNode.id:"N/A"}):new o(e);if(!l.isObject(this.process))throw e("ProcessMissing");if(0===l.size(this.process.process_graph)){if(this.allowEmptyGraph){let e=Object.keys(this.process).find(e=>p.includes(e));if(0===l.size(this.process)||e)return void(this.parsed=!0)}throw e("ProcessGraphMissing")}this.nodes=l.mapObjectValues(this.process.process_graph,(e,t)=>this.createNodeInstance(e,t,this));for(let r in this.nodes){var t=this.nodes[r];if(t.isResultNode){if(null!==this.resultNode)throw e("MultipleResultNodes");this.resultNode=t}this.parseNodeArguments(r,t)}if(null===this.resultNode)throw e("ResultNodeMissing");if(this.startNodes=Object.values(this.nodes).filter(e=>e.isStartNode()).sort((e,t)=>e.id.localeCompare(t.id)),0===this.startNodes.length)throw e("StartNodeMissing");this.parsed=!0}async validate(e=!0){if(this.validated){if(e&&this.errors.count()>0)throw this.errors.first();return this.errors}this.validated=!0;try{this.parse()}catch(t){if(this.addError(t),e)throw t}return await this.validateNodes(this.getStartNodes(),e),this.errors}async execute(e=null){return this.allowUndefinedParameters(!1),this.setArguments(e),await this.validate(),this.reset(),await this.executeNodes(this.getStartNodes()),this.getResultNode()}async validateNodes(e,t,r=null){if(0!==e.length){var s=e.map(async e=>{if(e.solveDependency(r)){try{await this.validateNode(e)}catch(e){if(e instanceof a){if(this.errors.merge(e),t)throw e.first()}else if(this.addError(e),t)throw e}await this.validateNodes(e.getNextNodes(),t,e)}});await Promise.all(s)}}async validateNode(e){var t=this.getProcess(e);if(t)return await t.validate(e)}async executeNodes(e,t=null){if(0!==e.length){var r=e.map(async e=>{if(e.solveDependency(t)){var r=await this.executeNode(e);e.setResult(r),await this.executeNodes(e.getNextNodes(),e)}});return await Promise.all(r)}}async executeNode(e){var t=this.getProcess(e);return await t.execute(e)}parseNodeArguments(e,t,r=[],s){void 0===s&&(s=t.arguments);for(let i in s){let n=s[i],c=r.concat([i]);switch(l.getType(n)){case"result":var a=this.nodes[n.from_node];if(void 0===a)throw new o("ReferencedNodeMissing",{node_id:n.from_node});t.addPreviousNode(a),a.addNextNode(t);break;case"callback":s[i]=this.createChildProcessGraph(n,t,c);break;case"parameter":this.fillProcessParameters&&!this.hasParameter(n.from_parameter)&&this.addProcessParameter(n.from_parameter);break;case"array":case"object":this.parseNodeArguments(e,t,c,n)}}}setCallbackParameters(e){this.callbackParameters=e}getCallbackParameter(e){return this.getCallbackParameters().find(t=>t.name===e)||null}getCallbackParameters(){return this.callbackParameters}addProcessParameter(e,t="",r={}){Array.isArray(this.process.parameters)||(this.process.parameters=[]),this.process.parameters.push({name:e,description:t,schema:r})}hasParameterDefault(e){return void 0!==this.getParameterDefault(e)}getParameterDefault(e){let t=this.getParameter(e);if(null!==t)return t.default}hasParameter(e){return null!==this.getParameter(e)}getProcessParameters(e=!1){let t=Array.isArray(this.process.parameters)?this.process.parameters.slice(0):[];if(e&&!this.fillProcessParameters)for(let e in this.nodes){let r=this.nodes[e].getRefs();for(let e of r)e.from_parameter&&!t.find(t=>t.name===e.from_parameter)&&t.push({name:e.from_parameter,description:"",schema:{}})}return t}getProcessParameter(e,t=!1){return this.getProcessParameters(t).find(t=>t.name===e)||null}getParameter(e){let t=this.getCallbackParameter(e),r=this.getProcessParameter(e);return t&&r?Object.assign({},t,r):t||(r||null)}setArguments(e){l.isObject(e)&&Object.assign(this.arguments,e)}hasArgument(e){return void 0!==this.arguments[e]}getArgument(e){return this.arguments[e]}reset(){for(var e in this.nodes)this.nodes[e].reset();this.children.forEach(e=>e.reset())}getResultNode(){return this.resultNode}getStartNodes(){return this.startNodes}getStartNodeIds(){return this.startNodes.map(e=>e.id)}getNode(e){return e in this.nodes?this.nodes[e]:null}getNodeCount(){return l.size(this.nodes)}getNodes(){return this.nodes}getErrors(){return this.errors}getProcess(e,t=null){if(null===this.processRegistry)return null;let r;e instanceof n?(r=e.process_id,t=e.namespace):r=e;let s=this.processRegistry.get(r,t);if(null===s)throw new o("ProcessUnsupported",{process:r,namespace:t||"n/a"});return this.createProcessInstance(s)}getParentProcessId(){return this.getParentNode()?this.getParentNode().process_id:null}getParentProcess(){return null===this.processRegistry?null:this.processRegistry.get(this.getParentProcessId())}}e.exports=h},271:function(e,t,r){const s=r(222),a=r(204),i=r(196),o=r(179);e.exports=class{constructor(e){if(Object.assign(this,e),"string"!=typeof this.id)throw new Error("Invalid process specified, no id given.");Array.isArray(this.parameters)||(this.parameters=[])}toJSON(){return o.omitFromObject(this,["validate","validateArgument","execute","test"])}async validate(e){let t=e.getArgumentNames().filter(e=>-1===this.parameters.findIndex(t=>t.name===e));if(t.length>0)throw new a("ProcessArgumentUnsupported",{process:this.id,namespace:this.namespace||"n/a",arguments:t});for(let t in this.parameters){let r=this.parameters[t];if(!e.hasArgument(r.name)){if(r.optional)continue;throw new a("ProcessArgumentRequired",{process:this.id,namespace:this.namespace||"n/a",argument:r.name})}let s=e.getParsedArgument(r.name),i=e.getRawArgument(r.name);await this.validateArgument(s,i,e,r)}}async validateArgument(e,t,r,n,l=null){l||(l=n.name);let c=o.getType(e),p=r.getProcessGraph();switch(c){case"parameter":let c=p.getCallbackParameter(e.from_parameter);if(c){if(!s.isSchemaCompatible(n.schema,c.schema))throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:"Schema for parameter '"+e.from_parameter+"' not compatible with reference"});return}let u=r.getProcessGraphParameterValue(e.from_parameter);if(void 0===u&&!p.allowUndefinedParameterRefs)throw new a("ProcessGraphParameterMissing",{argument:e.from_parameter,node_id:r.id,process_id:r.process_id,namespace:r.namespace||"n/a"});let d=p.getProcessParameter(e.from_parameter);if(o.isObject(d)&&d.schema&&(void 0!==u&&await this.validateArgument(u,t,r,d,l),!s.isSchemaCompatible(n.schema,d.schema)))throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:"Schema for parameter '"+e.from_parameter+"' not compatible"});break;case"result":let m=p.getNode(e.from_node),f=p.getProcess(m);if(!s.isSchemaCompatible(n.schema,f.returns.schema))throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:"Schema for result '"+e.from_node+"' not compatible"});break;case"array":case"object":let y=i.normalizeJsonSchema(n.schema).filter(e=>["array","object"].includes(e.type)),v=1===y.length&&"process-graph"===y[0].subtype;if(o.containsRef(t)&&!v){for(var h in e){let s=y.map(e=>i.getElementJsonSchema(e,h)).filter(e=>Object.keys(e).length);if(s.length>0){let a=0,i=null;for(let o of s)try{await this.validateArgument(e[h],t[h],r,{schema:o},l+"/"+h),a++}catch(e){i=e}if(0===a&&i)throw i}}return}default:let g=r.getProcessGraph().getJsonSchemaValidator(),b=await g.validateValue(e,n.schema);if(b.length>0)throw new a("ProcessArgumentInvalid",{process:this.id,namespace:this.namespace||"n/a",argument:l,reason:b})}}async execute(){throw new Error(`execute not implemented yet for process '${this.id}' (namespace: ${this.namespace||"n/a"})`)}test(){throw new Error(`test not implemented yet for process '${this.id}' (namespace: ${this.namespace||"n/a"})`)}}},272:function(e,t,r){"use strict";var s=r(178);e.exports=function(e){s.copy(e,this)}},273:function(e,t,r){"use strict";e.exports=function(e,t){t||(t={}),"function"==typeof t&&(t={cmp:t});var r,s="boolean"==typeof t.cycles&&t.cycles,a=t.cmp&&(r=t.cmp,function(e){return function(t,s){var a={key:t,value:e[t]},i={key:s,value:e[s]};return r(a,i)}}),i=[];return function e(t){if(t&&t.toJSON&&"function"==typeof t.toJSON&&(t=t.toJSON()),void 0!==t){if("number"==typeof t)return isFinite(t)?""+t:"null";if("object"!=typeof t)return JSON.stringify(t);var r,o;if(Array.isArray(t)){for(o="[",r=0;r",g=d?">":"<",b=void 0;if(!u&&"number"!=typeof n&&void 0!==n)throw new Error(t+" must be number");if(!y&&void 0!==f&&"number"!=typeof f&&"boolean"!=typeof f)throw new Error(m+" must be number or boolean");if(y){var P=e.util.getData(f.$data,o,e.dataPathArr),w="exclusive"+i,E="exclType"+i,S="exclIsNumber"+i,x="' + "+(O="op"+i)+" + '";a+=" var schemaExcl"+i+" = "+P+"; ",a+=" var "+w+"; var "+E+" = typeof "+(P="schemaExcl"+i)+"; if ("+E+" != 'boolean' && "+E+" != 'undefined' && "+E+" != 'number') { ";var k;b=m;(k=k||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: {} ",!1!==e.opts.messages&&(a+=" , message: '"+m+" should be boolean' "),e.opts.verbose&&(a+=" , schema: validate.schema"+l+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var _=a;a=k.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+_+"]); ":a+=" validate.errors = ["+_+"]; return false; ":a+=" var err = "+_+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" "+E+" == 'number' ? ( ("+w+" = "+s+" === undefined || "+P+" "+v+"= "+s+") ? "+h+" "+g+"= "+P+" : "+h+" "+g+" "+s+" ) : ( ("+w+" = "+P+" === true) ? "+h+" "+g+"= "+s+" : "+h+" "+g+" "+s+" ) || "+h+" !== "+h+") { var op"+i+" = "+w+" ? '"+v+"' : '"+v+"='; ",void 0===n&&(b=m,c=e.errSchemaPath+"/"+m,s=P,u=y)}else{x=v;if((S="number"==typeof f)&&u){var O="'"+x+"'";a+=" if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" ( "+s+" === undefined || "+f+" "+v+"= "+s+" ? "+h+" "+g+"= "+f+" : "+h+" "+g+" "+s+" ) || "+h+" !== "+h+") { "}else{S&&void 0===n?(w=!0,b=m,c=e.errSchemaPath+"/"+m,s=f,g+="="):(S&&(s=Math[d?"min":"max"](f,n)),f===(!S||s)?(w=!0,b=m,c=e.errSchemaPath+"/"+m,g+="="):(w=!1,x+="="));O="'"+x+"'";a+=" if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" "+h+" "+g+" "+s+" || "+h+" !== "+h+") { "}}b=b||t,(k=k||[]).push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(b||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { comparison: "+O+", limit: "+s+", exclusive: "+w+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be "+x+" ",a+=u?"' + "+s:s+"'"),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";_=a;return a=k.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+_+"]); ":a+=" validate.errors = ["+_+"]; return false; ":a+=" var err = "+_+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",p&&(a+=" else { "),a}},276:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" "+h+".length "+("maxItems"==t?">":"<")+" "+s+") { ";var d=t,m=m||[];m.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxItems"==t?"more":"fewer",a+=" than ",a+=u?"' + "+s+" + '":""+n,a+=" items' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var f=a;return a=m.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+f+"]); ":a+=" validate.errors = ["+f+"]; return false; ":a+=" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},277:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");var d="maxLength"==t?">":"<";a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),!1===e.opts.unicode?a+=" "+h+".length ":a+=" ucs2length("+h+") ",a+=" "+d+" "+s+") { ";var m=t,f=f||[];f.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(m||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT be ",a+="maxLength"==t?"longer":"shorter",a+=" than ",a+=u?"' + "+s+" + '":""+n,a+=" characters' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var y=a;return a=f.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+y+"]); ":a+=" validate.errors = ["+y+"]; return false; ":a+=" var err = "+y+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},278:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'number') || "),a+=" Object.keys("+h+").length "+("maxProperties"==t?">":"<")+" "+s+") { ";var d=t,m=m||[];m.push(a),a="",!1!==e.createErrors?(a+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have ",a+="maxProperties"==t?"more":"fewer",a+=" than ",a+=u?"' + "+s+" + '":""+n,a+=" properties' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var f=a;return a=m.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+f+"]); ":a+=" validate.errors = ["+f+"]; return false; ":a+=" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},279:function(e){e.exports=JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}')},280:function(e,t){e.exports=class{constructor(){this.errors=[]}first(){return this.errors[0]||null}last(){return this.errors[this.errors.length-1]||null}merge(e){this.errors=this.errors.concat(e.getAll())}add(e){this.errors.push(e)}count(){return this.errors.length}toJSON(){return this.errors.map(e=>"function"==typeof e.toJSON?e.toJSON():{code:"InternalError",message:e.message})}getMessage(){var e="";for(var t in this.errors)e+=parseInt(t,10)+1+". "+this.errors[t].message+"\r\n";return e.trim()}getAll(){return this.errors}}},281:function(e,t,r){const s=r(204),a=r(179);e.exports=class{constructor(e,t,r=null){if("string"!=typeof t||0===t.length)throw new s("NodeIdInvalid");if(!a.isObject(e))throw new s("NodeInvalid",{node_id:t});if("string"!=typeof e.process_id)throw new s("ProcessIdMissing",{node_id:t});this.id=t,this.processGraph=r,this.source=e,this.process_id=e.process_id,this.namespace=e.namespace||null,this.arguments=a.isObject(e.arguments)?a.deepClone(e.arguments):{},this.description=e.description||null,this.isResultNode=e.result||!1,this.expectsFrom=[],this.receivedFrom=[],this.passesTo=[],this.computedResult=void 0}toJSON(){let e=a.mapObjectValues(this.arguments,e=>a.isObject(e)&&"function"==typeof e.toJSON?e.toJSON():e);return Object.assign({},this.source,{process_id:this.process_id,namespace:this.namespace,description:this.description,arguments:e,result:this.isResultNode})}getProcessGraph(){return this.processGraph}getParent(){return null!==this.processGraph?this.processGraph.getParentNode():null}getArgumentNames(){return Object.keys(this.arguments)}hasArgument(e){return void 0!==this.arguments[e]}getArgumentType(e){return a.getType(this.getRawArgument(e))}getRawArgument(e){return a.isObject(this.source.arguments)?this.source.arguments[e]:void 0}getParsedArgument(e){return this.arguments[e]}getArgument(e,t){return void 0===this.arguments[e]?t:this.evaluateArgument(this.arguments[e])}getArgumentRefs(e){return a.getRefs(this.getRawArgument(e),!1)}getRefs(){return a.getRefs(this.source.arguments,!1)}getProcessGraphParameterValue(e){let t,r=this.processGraph;do{if(r.hasArgument(e))return r.getArgument(e);r.hasParameterDefault(e)&&(t=r.getParameterDefault(e)),r=r.getParent()}while(null!==r);if(void 0!==t)return t;if(!this.processGraph.allowUndefinedParameterRefs)throw new s("ProcessGraphParameterMissing",{argument:e,node_id:this.id,process_id:this.process_id,namespace:this.namespace||"n/a"})}evaluateArgument(e){var t=a.getType(e);switch(t){case"result":return this.processGraph.getNode(e.from_node).getResult();case"callback":return e;case"parameter":return this.getProcessGraphParameterValue(e.from_parameter);case"array":case"object":let s="array"===t?[]:{};for(var r in e)s[r]=this.evaluateArgument(e[r]);return s;default:return e}}isStartNode(){return 0===this.expectsFrom.length}addPreviousNode(e){this.expectsFrom.find(t=>t.id===e.id)||this.expectsFrom.push(e)}getPreviousNodes(){return this.expectsFrom.sort((e,t)=>e.id.localeCompare(t.id))}addNextNode(e){this.passesTo.find(t=>t.id===e.id)||this.passesTo.push(e)}getNextNodes(){return this.passesTo.sort((e,t)=>e.id.localeCompare(t.id))}reset(){this.computedResult=void 0,this.receivedFrom=[]}getDescription(){return this.description}setDescription(e){this.description="string"==typeof e?e:null}setResult(e){this.computedResult=e}getResult(){return this.computedResult}solveDependency(e){return null!==e&&this.expectsFrom.includes(e)&&this.receivedFrom.push(e),this.expectsFrom.length===this.receivedFrom.length}}},282:function(e,t,r){},283:function(e,t,r){},284:function(e,t,r){"use strict";e.exports=function(e,t,r,s,a,i,o,n){var l=r-e,c=s-t,p=o-a,h=n-i,u=(-c*(e-a)+l*(t-i))/(-p*c+l*h),d=(p*(t-i)-h*(e-a))/(-p*c+l*h);return u>=0&&u<=1&&d>=0&&d<=1}},285:function(e,t,r){},408:function(e,t,r){"use strict";var s=r(409),a=r(223),i=r(413),o=r(272),n=r(273),l=r(414),c=r(415),p=r(436),h=r(178);e.exports=v,v.prototype.validate=function(e,t){var r;if("string"==typeof e){if(!(r=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var s=this._addSchema(e);r=s.validate||this._compile(s)}var a=r(t);!0!==r.$async&&(this.errors=r.errors);return a},v.prototype.compile=function(e,t){var r=this._addSchema(e,void 0,t);return r.validate||this._compile(r)},v.prototype.addSchema=function(e,t,r,s){if(Array.isArray(e)){for(var i=0;i=0?{index:s,compiling:!0}:(s=this._compilations.length,this._compilations[s]={schema:e,root:t,baseId:r},{index:s,compiling:!1})}function u(e,t,r){var s=d.call(this,e,t,r);s>=0&&this._compilations.splice(s,1)}function d(e,t,r){for(var s=0;s1){t[0]=t[0].slice(0,-1);for(var s=t.length-1,a=1;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},m=Math.floor,f=String.fromCharCode;function y(e){throw new RangeError(d[e])}function v(e,t){var r=e.split("@"),s="";r.length>1&&(s=r[0]+"@",e=r[1]);var a=function(e,t){for(var r=[],s=e.length;s--;)r[s]=t(e[s]);return r}((e=e.replace(u,".")).split("."),t).join(".");return s+a}function g(e){for(var t=[],r=0,s=e.length;r=55296&&a<=56319&&r>1,e+=m(e/t);e>455;s+=36)e=m(e/35);return m(s+36*e/(e+38))},w=function(e){var t,r=[],s=e.length,a=0,i=128,o=72,n=e.lastIndexOf("-");n<0&&(n=0);for(var l=0;l=128&&y("not-basic"),r.push(e.charCodeAt(l));for(var p=n>0?n+1:0;p=s&&y("invalid-input");var f=(t=e.charCodeAt(p++))-48<10?t-22:t-65<26?t-65:t-97<26?t-97:36;(f>=36||f>m((c-a)/u))&&y("overflow"),a+=f*u;var v=d<=o?1:d>=o+26?26:d-o;if(fm(c/g)&&y("overflow"),u*=g}var b=r.length+1;o=P(a-h,b,0==h),m(a/b)>c-i&&y("overflow"),i+=m(a/b),a%=b,r.splice(a++,0,i)}return String.fromCodePoint.apply(String,r)},E=function(e){var t=[],r=(e=g(e)).length,s=128,a=0,i=72,o=!0,n=!1,l=void 0;try{for(var p,h=e[Symbol.iterator]();!(o=(p=h.next()).done);o=!0){var u=p.value;u<128&&t.push(f(u))}}catch(e){n=!0,l=e}finally{try{!o&&h.return&&h.return()}finally{if(n)throw l}}var d=t.length,v=d;for(d&&t.push("-");v=s&&Om((c-a)/j)&&y("overflow"),a+=(w-s)*j,s=w;var $=!0,R=!1,I=void 0;try{for(var F,D=e[Symbol.iterator]();!($=(F=D.next()).done);$=!0){var A=F.value;if(Ac&&y("overflow"),A==s){for(var N=a,C=36;;C+=36){var T=C<=i?1:C>=i+26?26:C-i;if(N>6|192).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase():"%"+(t>>12|224).toString(16).toUpperCase()+"%"+(t>>6&63|128).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase()}function O(e){for(var t="",r=0,s=e.length;r=194&&a<224){if(s-r>=6){var i=parseInt(e.substr(r+4,2),16);t+=String.fromCharCode((31&a)<<6|63&i)}else t+=e.substr(r,6);r+=6}else if(a>=224){if(s-r>=9){var o=parseInt(e.substr(r+4,2),16),n=parseInt(e.substr(r+7,2),16);t+=String.fromCharCode((15&a)<<12|(63&o)<<6|63&n)}else t+=e.substr(r,9);r+=9}else t+=e.substr(r,3),r+=3}return t}function j(e,t){function r(e){var r=O(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,"")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,_).replace(t.PCT_ENCODED,a)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,_).replace(t.PCT_ENCODED,a)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,_).replace(t.PCT_ENCODED,a)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,_).replace(t.PCT_ENCODED,a)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,_).replace(t.PCT_ENCODED,a)),e}function $(e){return e.replace(/^0*(.*)/,"$1")||"0"}function R(e,t){var r=e.match(t.IPV4ADDRESS)||[],s=l(r,2)[1];return s?s.split(".").map($).join("."):e}function I(e,t){var r=e.match(t.IPV6ADDRESS)||[],s=l(r,3),a=s[1],i=s[2];if(a){for(var o=a.toLowerCase().split("::").reverse(),n=l(o,2),c=n[0],p=n[1],h=p?p.split(":").map($):[],u=c.split(":").map($),d=t.IPV4ADDRESS.test(u[u.length-1]),m=d?7:8,f=u.length-m,y=Array(m),v=0;v1){var P=y.slice(0,g.index),w=y.slice(g.index+g.length);b=P.join(":")+"::"+w.join(":")}else b=y.join(":");return i&&(b+="%"+i),b}return e}var F=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,D=void 0==="".match(/(){0}/)[1];function A(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={},s=!1!==t.iri?n:o;"suffix"===t.reference&&(e=(t.scheme?t.scheme+":":"")+"//"+e);var a=e.match(F);if(a){D?(r.scheme=a[1],r.userinfo=a[3],r.host=a[4],r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=a[7],r.fragment=a[8],isNaN(r.port)&&(r.port=a[5])):(r.scheme=a[1]||void 0,r.userinfo=-1!==e.indexOf("@")?a[3]:void 0,r.host=-1!==e.indexOf("//")?a[4]:void 0,r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=-1!==e.indexOf("?")?a[7]:void 0,r.fragment=-1!==e.indexOf("#")?a[8]:void 0,isNaN(r.port)&&(r.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?a[4]:void 0)),r.host&&(r.host=I(R(r.host,s),s)),void 0!==r.scheme||void 0!==r.userinfo||void 0!==r.host||void 0!==r.port||r.path||void 0!==r.query?void 0===r.scheme?r.reference="relative":void 0===r.fragment?r.reference="absolute":r.reference="uri":r.reference="same-document",t.reference&&"suffix"!==t.reference&&t.reference!==r.reference&&(r.error=r.error||"URI is not a "+t.reference+" reference.");var i=k[(t.scheme||r.scheme||"").toLowerCase()];if(t.unicodeSupport||i&&i.unicodeSupport)j(r,s);else{if(r.host&&(t.domainHost||i&&i.domainHost))try{r.host=S(r.host.replace(s.PCT_ENCODED,O).toLowerCase())}catch(e){r.error=r.error||"Host's domain name can not be converted to ASCII via punycode: "+e}j(r,o)}i&&i.parse&&i.parse(r,t)}else r.error=r.error||"URI can not be parsed.";return r}function N(e,t){var r=!1!==t.iri?n:o,s=[];return void 0!==e.userinfo&&(s.push(e.userinfo),s.push("@")),void 0!==e.host&&s.push(I(R(String(e.host),r),r).replace(r.IPV6ADDRESS,(function(e,t,r){return"["+t+(r?"%25"+r:"")+"]"}))),"number"!=typeof e.port&&"string"!=typeof e.port||(s.push(":"),s.push(String(e.port))),s.length?s.join(""):void 0}var C=/^\.\.?\//,T=/^\/\.(\/|$)/,M=/^\/\.\.(\/|$)/,L=/^\/?(?:.|\n)*?(?=\/|$)/;function q(e){for(var t=[];e.length;)if(e.match(C))e=e.replace(C,"");else if(e.match(T))e=e.replace(T,"/");else if(e.match(M))e=e.replace(M,"/"),t.pop();else if("."===e||".."===e)e="";else{var r=e.match(L);if(!r)throw new Error("Unexpected dot segment condition");var s=r[0];e=e.slice(s.length),t.push(s)}return t.join("")}function V(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.iri?n:o,s=[],a=k[(t.scheme||e.scheme||"").toLowerCase()];if(a&&a.serialize&&a.serialize(e,t),e.host)if(r.IPV6ADDRESS.test(e.host));else if(t.domainHost||a&&a.domainHost)try{e.host=t.iri?x(e.host):S(e.host.replace(r.PCT_ENCODED,O).toLowerCase())}catch(r){e.error=e.error||"Host's domain name can not be converted to "+(t.iri?"Unicode":"ASCII")+" via punycode: "+r}j(e,r),"suffix"!==t.reference&&e.scheme&&(s.push(e.scheme),s.push(":"));var i=N(e,t);if(void 0!==i&&("suffix"!==t.reference&&s.push("//"),s.push(i),e.path&&"/"!==e.path.charAt(0)&&s.push("/")),void 0!==e.path){var l=e.path;t.absolutePath||a&&a.absolutePath||(l=q(l)),void 0===i&&(l=l.replace(/^\/\//,"/%2F")),s.push(l)}return void 0!==e.query&&(s.push("?"),s.push(e.query)),void 0!==e.fragment&&(s.push("#"),s.push(e.fragment)),s.join("")}function B(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=arguments[3],a={};return s||(e=A(V(e,r),r),t=A(V(t,r),r)),!(r=r||{}).tolerant&&t.scheme?(a.scheme=t.scheme,a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=q(t.path||""),a.query=t.query):(void 0!==t.userinfo||void 0!==t.host||void 0!==t.port?(a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=q(t.path||""),a.query=t.query):(t.path?("/"===t.path.charAt(0)?a.path=q(t.path):(void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?a.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+t.path:a.path=t.path:a.path="/"+t.path,a.path=q(a.path)),a.query=t.query):(a.path=e.path,void 0!==t.query?a.query=t.query:a.query=e.query),a.userinfo=e.userinfo,a.host=e.host,a.port=e.port),a.scheme=e.scheme),a.fragment=t.fragment,a}function z(e,t){return e&&e.toString().replace(t&&t.iri?n.PCT_ENCODED:o.PCT_ENCODED,O)}var G={scheme:"http",domainHost:!0,parse:function(e,t){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e,t){var r="https"===String(e.scheme).toLowerCase();return e.port!==(r?443:80)&&""!==e.port||(e.port=void 0),e.path||(e.path="/"),e}},J={scheme:"https",domainHost:G.domainHost,parse:G.parse,serialize:G.serialize};function U(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}var Q={scheme:"ws",domainHost:!0,parse:function(e,t){var r=e;return r.secure=U(r),r.resourceName=(r.path||"/")+(r.query?"?"+r.query:""),r.path=void 0,r.query=void 0,r},serialize:function(e,t){if(e.port!==(U(e)?443:80)&&""!==e.port||(e.port=void 0),"boolean"==typeof e.secure&&(e.scheme=e.secure?"wss":"ws",e.secure=void 0),e.resourceName){var r=e.resourceName.split("?"),s=l(r,2),a=s[0],i=s[1];e.path=a&&"/"!==a?a:void 0,e.query=i,e.resourceName=void 0}return e.fragment=void 0,e}},K={scheme:"wss",domainHost:Q.domainHost,parse:Q.parse,serialize:Q.serialize},H={},Z="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",W="[0-9A-Fa-f]",Y=r(r("%[EFef]"+W+"%"+W+W+"%"+W+W)+"|"+r("%[89A-Fa-f]"+W+"%"+W+W)+"|"+r("%"+W+W)),X=t("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]'),ee=new RegExp(Z,"g"),te=new RegExp(Y,"g"),re=new RegExp(t("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',X),"g"),se=new RegExp(t("[^]",Z,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),ae=se;function ie(e){var t=O(e);return t.match(ee)?t:e}var oe={scheme:"mailto",parse:function(e,t){var r=e,s=r.to=r.path?r.path.split(","):[];if(r.path=void 0,r.query){for(var a=!1,i={},o=r.query.split("&"),n=0,l=o.length;n=55296&&t<=56319&&a%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,p=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,u=/^(?:\/(?:[^~/]|~0|~1)*)*$/,d=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,m=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function f(e){return e="full"==e?"full":"fast",s.copy(f[e])}function y(e){var t=e.match(a);if(!t)return!1;var r=+t[1],s=+t[2],o=+t[3];return s>=1&&s<=12&&o>=1&&o<=(2==s&&function(e){return e%4==0&&(e%100!=0||e%400==0)}(r)?29:i[s])}function v(e,t){var r=e.match(o);if(!r)return!1;var s=r[1],a=r[2],i=r[3],n=r[5];return(s<=23&&a<=59&&i<=59||23==s&&59==a&&60==i)&&(!t||n)}e.exports=f,f.fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:p,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:n,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":u,"json-pointer-uri-fragment":d,"relative-json-pointer":m},f.full={date:y,time:v,"date-time":function(e){var t=e.split(g);return 2==t.length&&y(t[0])&&v(t[1],!0)},uri:function(e){return b.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:p,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:n,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":u,"json-pointer-uri-fragment":d,"relative-json-pointer":m};var g=/t|\s/i;var b=/\/|:/;var P=/[^\\]\\Z/;function w(e){if(P.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},413:function(e,t,r){"use strict";var s=r(414),a=r(178).toHash;e.exports=function(){var e=[{type:"number",rules:[{maximum:["exclusiveMaximum"]},{minimum:["exclusiveMinimum"]},"multipleOf","format"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","items","contains","uniqueItems"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","propertyNames",{properties:["additionalProperties","patternProperties"]}]},{rules:["$ref","const","enum","not","anyOf","oneOf","allOf","if"]}],t=["type","$comment"];return e.all=a(t),e.types=a(["number","integer","string","array","object","boolean","null"]),e.forEach((function(r){r.rules=r.rules.map((function(r){var a;if("object"==typeof r){var i=Object.keys(r)[0];a=r[i],r=i,a.forEach((function(r){t.push(r),e.all[r]=!0}))}return t.push(r),e.all[r]={keyword:r,code:s[r],implements:a}})),e.all.$comment={keyword:"$comment",code:s.$comment},r.type&&(e.types[r.type]=r)})),e.keywords=a(t.concat(["$schema","$id","id","$data","$async","title","description","default","definitions","examples","readOnly","writeOnly","contentMediaType","contentEncoding","additionalItems","then","else"])),e.custom={},e}},414:function(e,t,r){"use strict";e.exports={$ref:r(415),allOf:r(416),anyOf:r(417),$comment:r(418),const:r(419),contains:r(420),dependencies:r(421),enum:r(422),format:r(423),if:r(424),items:r(425),maximum:r(274),minimum:r(274),maxItems:r(275),minItems:r(275),maxLength:r(276),minLength:r(276),maxProperties:r(277),minProperties:r(277),multipleOf:r(426),not:r(427),oneOf:r(428),pattern:r(429),properties:r(430),propertyNames:r(431),required:r(432),uniqueItems:r(433),validate:r(273)}},415:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a,i=" ",o=e.level,n=e.dataLevel,l=e.schema[t],c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(n||""),u="valid"+o;if("#"==l||"#/"==l)e.isRoot?(s=e.async,a="validate"):(s=!0===e.root.schema.$async,a="root.refVal[0]");else{var d=e.resolveRef(e.baseId,l,e.isRoot);if(void 0===d){var m=e.MissingRefError.message(e.baseId,l);if("fail"==e.opts.missingRefs){e.logger.error(m),(g=g||[]).push(i),i="",!1!==e.createErrors?(i+=" { keyword: '$ref' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { ref: '"+e.util.escapeQuotes(l)+"' } ",!1!==e.opts.messages&&(i+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(l)+"' "),e.opts.verbose&&(i+=" , schema: "+e.util.toQuotedString(l)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),i+=" } "):i+=" {} ";var f=i;i=g.pop(),!e.compositeRule&&p?e.async?i+=" throw new ValidationError(["+f+"]); ":i+=" validate.errors = ["+f+"]; return false; ":i+=" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",p&&(i+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs)throw new e.MissingRefError(e.baseId,l,m);e.logger.warn(m),p&&(i+=" if (true) { ")}}else if(d.inline){var y=e.util.copy(e);y.level++;var v="valid"+y.level;y.schema=d.schema,y.schemaPath="",y.errSchemaPath=l,i+=" "+e.validate(y).replace(/validate\.schema/g,d.code)+" ",p&&(i+=" if ("+v+") { ")}else s=!0===d.$async||e.async&&!1!==d.$async,a=d.code}if(a){var g;(g=g||[]).push(i),i="",e.opts.passContext?i+=" "+a+".call(this, ":i+=" "+a+"( ",i+=" "+h+", (dataPath || '')",'""'!=e.errorPath&&(i+=" + "+e.errorPath);var b=i+=" , "+(n?"data"+(n-1||""):"parentData")+" , "+(n?e.dataPathArr[n]:"parentDataProperty")+", rootData) ";if(i=g.pop(),s){if(!e.async)throw new Error("async schema referenced by sync schema");p&&(i+=" var "+u+"; "),i+=" try { await "+b+"; ",p&&(i+=" "+u+" = true; "),i+=" } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ",p&&(i+=" "+u+" = false; "),i+=" } ",p&&(i+=" if ("+u+") { ")}else i+=" if (!"+b+") { if (vErrors === null) vErrors = "+a+".errors; else vErrors = vErrors.concat("+a+".errors); errors = vErrors.length; } ",p&&(i+=" else { ")}return i}},416:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.schema[t],i=e.schemaPath+e.util.getProperty(t),o=e.errSchemaPath+"/"+t,n=!e.opts.allErrors,l=e.util.copy(e),c="";l.level++;var p="valid"+l.level,h=l.baseId,u=!0,d=a;if(d)for(var m,f=-1,y=d.length-1;f0||!1===m:e.util.schemaHasRules(m,e.RULES.all))&&(u=!1,l.schema=m,l.schemaPath=i+"["+f+"]",l.errSchemaPath=o+"/"+f,s+=" "+e.validate(l)+" ",l.baseId=h,n&&(s+=" if ("+p+") { ",c+="}"));return n&&(s+=u?" if (true) { ":" "+c.slice(0,-1)+" "),s}},417:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e),m="";d.level++;var f="valid"+d.level;if(o.every((function(t){return e.opts.strictKeywords?"object"==typeof t&&Object.keys(t).length>0||!1===t:e.util.schemaHasRules(t,e.RULES.all)}))){var y=d.baseId;s+=" var "+u+" = errors; var "+h+" = false; ";var v=e.compositeRule;e.compositeRule=d.compositeRule=!0;var g=o;if(g)for(var b,P=-1,w=g.length-1;P0||!1===o:e.util.schemaHasRules(o,e.RULES.all);if(s+="var "+u+" = errors;var "+h+";",b){var P=e.compositeRule;e.compositeRule=d.compositeRule=!0,d.schema=o,d.schemaPath=n,d.errSchemaPath=l,s+=" var "+m+" = false; for (var "+f+" = 0; "+f+" < "+p+".length; "+f+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,f,e.opts.jsonPointers,!0);var w=p+"["+f+"]";d.dataPathArr[y]=f;var E=e.validate(d);d.baseId=g,e.util.varOccurences(E,v)<2?s+=" "+e.util.varReplace(E,v,w)+" ":s+=" var "+v+" = "+w+"; "+E+" ",s+=" if ("+m+") break; } ",e.compositeRule=d.compositeRule=P,s+=" if (!"+m+") {"}else s+=" if ("+p+".length == 0) {";var S=S||[];S.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'contains' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(s+=" , message: 'should contain a valid item' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var x=s;return s=S.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+x+"]); ":s+=" validate.errors = ["+x+"]; return false; ":s+=" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } else { ",b&&(s+=" errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; } "),e.opts.allErrors&&(s+=" } "),s}},421:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e),d="";u.level++;var m="valid"+u.level,f={},y={},v=e.opts.ownProperties;for(w in o)if("__proto__"!=w){var g=o[w],b=Array.isArray(g)?y:f;b[w]=g}s+="var "+h+" = errors;";var P=e.errorPath;for(var w in s+="var missing"+a+";",y)if((b=y[w]).length){if(s+=" if ( "+p+e.util.getProperty(w)+" !== undefined ",v&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(w)+"') "),c){s+=" && ( ";var E=b;if(E)for(var S=-1,x=E.length-1;S0||!1===g:e.util.schemaHasRules(g,e.RULES.all))&&(s+=" "+m+" = true; if ( "+p+e.util.getProperty(w)+" !== undefined ",v&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(w)+"') "),s+=") { ",u.schema=g,u.schemaPath=n+e.util.getProperty(w),u.errSchemaPath=l+"/"+e.util.escapeFragment(w),s+=" "+e.validate(u)+" ",u.baseId=N,s+=" } ",c&&(s+=" if ("+m+") { ",d+="}"))}return c&&(s+=" "+d+" if ("+h+" == errors) {"),s}},422:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u=e.opts.$data&&o&&o.$data;u&&(s+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ");var d="i"+a,m="schema"+a;u||(s+=" var "+m+" = validate.schema"+n+";"),s+="var "+h+";",u&&(s+=" if (schema"+a+" === undefined) "+h+" = true; else if (!Array.isArray(schema"+a+")) "+h+" = false; else {"),s+=h+" = false;for (var "+d+"=0; "+d+"<"+m+".length; "+d+"++) if (equal("+p+", "+m+"["+d+"])) { "+h+" = true; break; }",u&&(s+=" } "),s+=" if (!"+h+") { ";var f=f||[];f.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'enum' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { allowedValues: schema"+a+" } ",!1!==e.opts.messages&&(s+=" , message: 'should be equal to one of the allowed values' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var y=s;return s=f.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+y+"]); ":s+=" validate.errors = ["+y+"]; return false; ":s+=" var err = "+y+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" }",c&&(s+=" else { "),s}},423:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||"");if(!1===e.opts.format)return c&&(s+=" if (true) { "),s;var h,u=e.opts.$data&&o&&o.$data;u?(s+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ",h="schema"+a):h=o;var d=e.opts.unknownFormats,m=Array.isArray(d);if(u){s+=" var "+(f="format"+a)+" = formats["+h+"]; var "+(y="isObject"+a)+" = typeof "+f+" == 'object' && !("+f+" instanceof RegExp) && "+f+".validate; var "+(v="formatType"+a)+" = "+y+" && "+f+".type || 'string'; if ("+y+") { ",e.async&&(s+=" var async"+a+" = "+f+".async; "),s+=" "+f+" = "+f+".validate; } if ( ",u&&(s+=" ("+h+" !== undefined && typeof "+h+" != 'string') || "),s+=" (","ignore"!=d&&(s+=" ("+h+" && !"+f+" ",m&&(s+=" && self._opts.unknownFormats.indexOf("+h+") == -1 "),s+=") || "),s+=" ("+f+" && "+v+" == '"+r+"' && !(typeof "+f+" == 'function' ? ",e.async?s+=" (async"+a+" ? await "+f+"("+p+") : "+f+"("+p+")) ":s+=" "+f+"("+p+") ",s+=" : "+f+".test("+p+"))))) {"}else{var f;if(!(f=e.formats[o])){if("ignore"==d)return e.logger.warn('unknown format "'+o+'" ignored in schema at path "'+e.errSchemaPath+'"'),c&&(s+=" if (true) { "),s;if(m&&d.indexOf(o)>=0)return c&&(s+=" if (true) { "),s;throw new Error('unknown format "'+o+'" is used in schema at path "'+e.errSchemaPath+'"')}var y,v=(y="object"==typeof f&&!(f instanceof RegExp)&&f.validate)&&f.type||"string";if(y){var g=!0===f.async;f=f.validate}if(v!=r)return c&&(s+=" if (true) { "),s;if(g){if(!e.async)throw new Error("async format in sync schema");s+=" if (!(await "+(b="formats"+e.util.getProperty(o)+".validate")+"("+p+"))) { "}else{s+=" if (! ";var b="formats"+e.util.getProperty(o);y&&(b+=".validate"),s+="function"==typeof f?" "+b+"("+p+") ":" "+b+".test("+p+") ",s+=") { "}}var P=P||[];P.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { format: ",s+=u?""+h:""+e.util.toQuotedString(o),s+=" } ",!1!==e.opts.messages&&(s+=" , message: 'should match format \"",s+=u?"' + "+h+" + '":""+e.util.escapeQuotes(o),s+="\"' "),e.opts.verbose&&(s+=" , schema: ",s+=u?"validate.schema"+n:""+e.util.toQuotedString(o),s+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var w=s;return s=P.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+w+"]); ":s+=" validate.errors = ["+w+"]; return false; ":s+=" var err = "+w+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } ",c&&(s+=" else { "),s}},424:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e);d.level++;var m="valid"+d.level,f=e.schema.then,y=e.schema.else,v=void 0!==f&&(e.opts.strictKeywords?"object"==typeof f&&Object.keys(f).length>0||!1===f:e.util.schemaHasRules(f,e.RULES.all)),g=void 0!==y&&(e.opts.strictKeywords?"object"==typeof y&&Object.keys(y).length>0||!1===y:e.util.schemaHasRules(y,e.RULES.all)),b=d.baseId;if(v||g){var P;d.createErrors=!1,d.schema=o,d.schemaPath=n,d.errSchemaPath=l,s+=" var "+u+" = errors; var "+h+" = true; ";var w=e.compositeRule;e.compositeRule=d.compositeRule=!0,s+=" "+e.validate(d)+" ",d.baseId=b,d.createErrors=!0,s+=" errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; } ",e.compositeRule=d.compositeRule=w,v?(s+=" if ("+m+") { ",d.schema=e.schema.then,d.schemaPath=e.schemaPath+".then",d.errSchemaPath=e.errSchemaPath+"/then",s+=" "+e.validate(d)+" ",d.baseId=b,s+=" "+h+" = "+m+"; ",v&&g?s+=" var "+(P="ifClause"+a)+" = 'then'; ":P="'then'",s+=" } ",g&&(s+=" else { ")):s+=" if (!"+m+") { ",g&&(d.schema=e.schema.else,d.schemaPath=e.schemaPath+".else",d.errSchemaPath=e.errSchemaPath+"/else",s+=" "+e.validate(d)+" ",d.baseId=b,s+=" "+h+" = "+m+"; ",v&&g?s+=" var "+(P="ifClause"+a)+" = 'else'; ":P="'else'",s+=" } "),s+=" if (!"+h+") { var err = ",!1!==e.createErrors?(s+=" { keyword: 'if' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { failingKeyword: "+P+" } ",!1!==e.opts.messages&&(s+=" , message: 'should match \"' + "+P+" + '\" schema' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ",s+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?s+=" throw new ValidationError(vErrors); ":s+=" validate.errors = vErrors; return false; "),s+=" } ",c&&(s+=" else { ")}else c&&(s+=" if (true) { ");return s}},425:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e),m="";d.level++;var f="valid"+d.level,y="i"+a,v=d.dataLevel=e.dataLevel+1,g="data"+v,b=e.baseId;if(s+="var "+u+" = errors;var "+h+";",Array.isArray(o)){var P=e.schema.additionalItems;if(!1===P){s+=" "+h+" = "+p+".length <= "+o.length+"; ";var w=l;l=e.errSchemaPath+"/additionalItems",s+=" if (!"+h+") { ";var E=E||[];E.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { limit: "+o.length+" } ",!1!==e.opts.messages&&(s+=" , message: 'should NOT have more than "+o.length+" items' "),e.opts.verbose&&(s+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var S=s;s=E.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+S+"]); ":s+=" validate.errors = ["+S+"]; return false; ":s+=" var err = "+S+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } ",l=w,c&&(m+="}",s+=" else { ")}var x=o;if(x)for(var k,_=-1,O=x.length-1;_0||!1===k:e.util.schemaHasRules(k,e.RULES.all)){s+=" "+f+" = true; if ("+p+".length > "+_+") { ";var j=p+"["+_+"]";d.schema=k,d.schemaPath=n+"["+_+"]",d.errSchemaPath=l+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_;var $=e.validate(d);d.baseId=b,e.util.varOccurences($,g)<2?s+=" "+e.util.varReplace($,g,j)+" ":s+=" var "+g+" = "+j+"; "+$+" ",s+=" } ",c&&(s+=" if ("+f+") { ",m+="}")}if("object"==typeof P&&(e.opts.strictKeywords?"object"==typeof P&&Object.keys(P).length>0||!1===P:e.util.schemaHasRules(P,e.RULES.all))){d.schema=P,d.schemaPath=e.schemaPath+".additionalItems",d.errSchemaPath=e.errSchemaPath+"/additionalItems",s+=" "+f+" = true; if ("+p+".length > "+o.length+") { for (var "+y+" = "+o.length+"; "+y+" < "+p+".length; "+y+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers,!0);j=p+"["+y+"]";d.dataPathArr[v]=y;$=e.validate(d);d.baseId=b,e.util.varOccurences($,g)<2?s+=" "+e.util.varReplace($,g,j)+" ":s+=" var "+g+" = "+j+"; "+$+" ",c&&(s+=" if (!"+f+") break; "),s+=" } } ",c&&(s+=" if ("+f+") { ",m+="}")}}else if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0||!1===o:e.util.schemaHasRules(o,e.RULES.all)){d.schema=o,d.schemaPath=n,d.errSchemaPath=l,s+=" for (var "+y+" = 0; "+y+" < "+p+".length; "+y+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers,!0);j=p+"["+y+"]";d.dataPathArr[v]=y;$=e.validate(d);d.baseId=b,e.util.varOccurences($,g)<2?s+=" "+e.util.varReplace($,g,j)+" ":s+=" var "+g+" = "+j+"; "+$+" ",c&&(s+=" if (!"+f+") break; "),s+=" }"}return c&&(s+=" "+m+" if ("+u+" == errors) {"),s}},426:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");a+="var division"+i+";if (",u&&(a+=" "+s+" !== undefined && ( typeof "+s+" != 'number' || "),a+=" (division"+i+" = "+h+" / "+s+", ",e.opts.multipleOfPrecision?a+=" Math.abs(Math.round(division"+i+") - division"+i+") > 1e-"+e.opts.multipleOfPrecision+" ":a+=" division"+i+" !== parseInt(division"+i+") ",a+=" ) ",u&&(a+=" ) "),a+=" ) { ";var d=d||[];d.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { multipleOf: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be multiple of ",a+=u?"' + "+s:s+"'"),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var m=a;return a=d.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},427:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e);u.level++;var d="valid"+u.level;if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0||!1===o:e.util.schemaHasRules(o,e.RULES.all)){u.schema=o,u.schemaPath=n,u.errSchemaPath=l,s+=" var "+h+" = errors; ";var m,f=e.compositeRule;e.compositeRule=u.compositeRule=!0,u.createErrors=!1,u.opts.allErrors&&(m=u.opts.allErrors,u.opts.allErrors=!1),s+=" "+e.validate(u)+" ",u.createErrors=!0,m&&(u.opts.allErrors=m),e.compositeRule=u.compositeRule=f,s+=" if ("+d+") { ";var y=y||[];y.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(s+=" , message: 'should NOT be valid' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var v=s;s=y.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+v+"]); ":s+=" validate.errors = ["+v+"]; return false; ":s+=" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } else { errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } ",e.opts.allErrors&&(s+=" } ")}else s+=" var err = ",!1!==e.createErrors?(s+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(s+=" , message: 'should NOT be valid' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ",s+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c&&(s+=" if (false) { ");return s}},428:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e),m="";d.level++;var f="valid"+d.level,y=d.baseId,v="prevValid"+a,g="passingSchemas"+a;s+="var "+u+" = errors , "+v+" = false , "+h+" = false , "+g+" = null; ";var b=e.compositeRule;e.compositeRule=d.compositeRule=!0;var P=o;if(P)for(var w,E=-1,S=P.length-1;E0||!1===w:e.util.schemaHasRules(w,e.RULES.all))?(d.schema=w,d.schemaPath=n+"["+E+"]",d.errSchemaPath=l+"/"+E,s+=" "+e.validate(d)+" ",d.baseId=y):s+=" var "+f+" = true; ",E&&(s+=" if ("+f+" && "+v+") { "+h+" = false; "+g+" = ["+g+", "+E+"]; } else { ",m+="}"),s+=" if ("+f+") { "+h+" = "+v+" = true; "+g+" = "+E+"; }";return e.compositeRule=d.compositeRule=b,s+=m+"if (!"+h+") { var err = ",!1!==e.createErrors?(s+=" { keyword: 'oneOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { passingSchemas: "+g+" } ",!1!==e.opts.messages&&(s+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ",s+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?s+=" throw new ValidationError(vErrors); ":s+=" validate.errors = vErrors; return false; "),s+="} else { errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; }",e.opts.allErrors&&(s+=" } "),s}},429:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'string') || "),a+=" !"+(u?"(new RegExp("+s+"))":e.usePattern(n))+".test("+h+") ) { ";var d=d||[];d.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'pattern' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { pattern: ",a+=u?""+s:""+e.util.toQuotedString(n),a+=" } ",!1!==e.opts.messages&&(a+=" , message: 'should match pattern \"",a+=u?"' + "+s+" + '":""+e.util.escapeQuotes(n),a+="\"' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+e.util.toQuotedString(n),a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var m=a;return a=d.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},430:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e),d="";u.level++;var m="valid"+u.level,f="key"+a,y="idx"+a,v=u.dataLevel=e.dataLevel+1,g="data"+v,b="dataProperties"+a,P=Object.keys(o||{}).filter(D),w=e.schema.patternProperties||{},E=Object.keys(w).filter(D),S=e.schema.additionalProperties,x=P.length||E.length,k=!1===S,_="object"==typeof S&&Object.keys(S).length,O=e.opts.removeAdditional,j=k||_||O,$=e.opts.ownProperties,R=e.baseId,I=e.schema.required;if(I&&(!e.opts.$data||!I.$data)&&I.length8)s+=" || validate.schema"+n+".hasOwnProperty("+f+") ";else{var A=P;if(A)for(var N=-1,C=A.length-1;N0||!1===Y:e.util.schemaHasRules(Y,e.RULES.all)){var X=e.util.getProperty(H),ee=(J=p+X,Q&&void 0!==Y.default);u.schema=Y,u.schemaPath=n+X,u.errSchemaPath=l+"/"+e.util.escapeFragment(H),u.errorPath=e.util.getPath(e.errorPath,H,e.opts.jsonPointers),u.dataPathArr[v]=e.util.toQuotedString(H);U=e.validate(u);if(u.baseId=R,e.util.varOccurences(U,g)<2){U=e.util.varReplace(U,g,J);var te=J}else{te=g;s+=" var "+g+" = "+J+"; "}if(ee)s+=" "+U+" ";else{if(F&&F[H]){s+=" if ( "+te+" === undefined ",$&&(s+=" || ! Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(H)+"') "),s+=") { "+m+" = false; ";q=e.errorPath,B=l;var re,se=e.util.escapeQuotes(H);e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(q,H,e.opts.jsonPointers)),l=e.errSchemaPath+"/required",(re=re||[]).push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { missingProperty: '"+se+"' } ",!1!==e.opts.messages&&(s+=" , message: '",e.opts._errorDataPathProperty?s+="is a required property":s+="should have required property \\'"+se+"\\'",s+="' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";z=s;s=re.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+z+"]); ":s+=" validate.errors = ["+z+"]; return false; ":s+=" var err = "+z+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l=B,e.errorPath=q,s+=" } else { "}else c?(s+=" if ( "+te+" === undefined ",$&&(s+=" || ! Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(H)+"') "),s+=") { "+m+" = true; } else { "):(s+=" if ("+te+" !== undefined ",$&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(H)+"') "),s+=" ) { ");s+=" "+U+" } "}}c&&(s+=" if ("+m+") { ",d+="}")}}if(E.length){var ae=E;if(ae)for(var ie,oe=-1,ne=ae.length-1;oe0||!1===Y:e.util.schemaHasRules(Y,e.RULES.all)){u.schema=Y,u.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(ie),u.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(ie),s+=$?" "+b+" = "+b+" || Object.keys("+p+"); for (var "+y+"=0; "+y+"<"+b+".length; "+y+"++) { var "+f+" = "+b+"["+y+"]; ":" for (var "+f+" in "+p+") { ",s+=" if ("+e.usePattern(ie)+".test("+f+")) { ",u.errorPath=e.util.getPathExpr(e.errorPath,f,e.opts.jsonPointers);J=p+"["+f+"]";u.dataPathArr[v]=f;U=e.validate(u);u.baseId=R,e.util.varOccurences(U,g)<2?s+=" "+e.util.varReplace(U,g,J)+" ":s+=" var "+g+" = "+J+"; "+U+" ",c&&(s+=" if (!"+m+") break; "),s+=" } ",c&&(s+=" else "+m+" = true; "),s+=" } ",c&&(s+=" if ("+m+") { ",d+="}")}}}return c&&(s+=" "+d+" if ("+h+" == errors) {"),s}},431:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e);u.level++;var d="valid"+u.level;if(s+="var "+h+" = errors;",e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0||!1===o:e.util.schemaHasRules(o,e.RULES.all)){u.schema=o,u.schemaPath=n,u.errSchemaPath=l;var m="key"+a,f="idx"+a,y="i"+a,v="' + "+m+" + '",g="data"+(u.dataLevel=e.dataLevel+1),b="dataProperties"+a,P=e.opts.ownProperties,w=e.baseId;P&&(s+=" var "+b+" = undefined; "),s+=P?" "+b+" = "+b+" || Object.keys("+p+"); for (var "+f+"=0; "+f+"<"+b+".length; "+f+"++) { var "+m+" = "+b+"["+f+"]; ":" for (var "+m+" in "+p+") { ",s+=" var startErrs"+a+" = errors; ";var E=m,S=e.compositeRule;e.compositeRule=u.compositeRule=!0;var x=e.validate(u);u.baseId=w,e.util.varOccurences(x,g)<2?s+=" "+e.util.varReplace(x,g,E)+" ":s+=" var "+g+" = "+E+"; "+x+" ",e.compositeRule=u.compositeRule=S,s+=" if (!"+d+") { for (var "+y+"=startErrs"+a+"; "+y+"0||!1===b:e.util.schemaHasRules(b,e.RULES.all))||(m[m.length]=y)}}else m=o;if(u||m.length){var P=e.errorPath,w=u||m.length>=e.opts.loopRequired,E=e.opts.ownProperties;if(c)if(s+=" var missing"+a+"; ",w){u||(s+=" var "+d+" = validate.schema"+n+"; ");var S="' + "+($="schema"+a+"["+(_="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),s+=" var "+h+" = true; ",u&&(s+=" if (schema"+a+" === undefined) "+h+" = true; else if (!Array.isArray(schema"+a+")) "+h+" = false; else {"),s+=" for (var "+_+" = 0; "+_+" < "+d+".length; "+_+"++) { "+h+" = "+p+"["+d+"["+_+"]] !== undefined ",E&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", "+d+"["+_+"]) "),s+="; if (!"+h+") break; } ",u&&(s+=" } "),s+=" if (!"+h+") { ",(j=j||[]).push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { missingProperty: '"+S+"' } ",!1!==e.opts.messages&&(s+=" , message: '",e.opts._errorDataPathProperty?s+="is a required property":s+="should have required property \\'"+S+"\\'",s+="' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var x=s;s=j.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+x+"]); ":s+=" validate.errors = ["+x+"]; return false; ":s+=" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } else { "}else{s+=" if ( ";var k=m;if(k)for(var _=-1,O=k.length-1;_ 1) { ";var m=e.schema.items&&e.schema.items.type,f=Array.isArray(m);if(!m||"object"==m||"array"==m||f&&(m.indexOf("object")>=0||m.indexOf("array")>=0))a+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+h+"[i], "+h+"[j])) { "+u+" = false; break outer; } } } ";else{a+=" var itemIndices = {}, item; for (;i--;) { var item = "+h+"[i]; ";var y="checkDataType"+(f?"s":"");a+=" if ("+e.util[y](m,"item",e.opts.strictNumbers,!0)+") continue; ",f&&(a+=" if (typeof item == 'string') item = '\"' + item; "),a+=" if (typeof itemIndices[item] == 'number') { "+u+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "}a+=" } ",d&&(a+=" } "),a+=" if (!"+u+") { ";var v=v||[];v.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var g=a;a=v.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+g+"]); ":a+=" validate.errors = ["+g+"]; return false; ":a+=" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",p&&(a+=" else { ")}else p&&(a+=" if (true) { ");return a}},434:function(e,t,r){"use strict";var s=["multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","additionalItems","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","additionalProperties","enum","format","const"];e.exports=function(e,t){for(var r=0;ra&&ti}},447:function(e,t,r){"use strict";var s=r(448);e.exports=function(e,t,r,a,i,o,n,l){return s(i,o,n,l,e,t,r,a)}},448:function(e,t,r){"use strict";var s=r(449),a=r(450);e.exports=function(e,t,r,i,o,n,l,c){return!(!s(o,n,l,c,e,t)&&!s(o,n,l,c,r,i))||(a(e,t,r,i,o,n,o+l,n)||a(e,t,r,i,o+l,n,o+l,n+c)||a(e,t,r,i,o,n+c,o+l,n+c)||a(e,t,r,i,o,n,o,n+c))}},449:function(e,t,r){"use strict";e.exports=function(e,t,r,s,a,i){return a>=e&&a<=e+r&&i>=t&&i<=t+s}},450:function(e,t,r){"use strict";const s=r(451),a=r(452),i=r(453),o=r(283);e.exports=function(e,t,r,n,l,c,p,h,u,d){return u||d?function(e,t,r,o,n,l,c,p,h,u){if(h&&u)return a(s(e,t,r,o,h),s(n,l,c,p,u));if(h)return i(n,l,c,p,s(e,t,r,o,h));if(u)return i(e,t,r,o,s(n,l,c,p,h))}(e,t,r,n,l,c,p,h,u,d):o(e,t,r,n,l,c,p,h)}},451:function(e,t,r){"use strict";e.exports=function(e,t,r,s,a){const i=Math.atan2(s-t,r-e)-Math.PI/2,o=a/2,n=Math.cos(i)*o,l=Math.sin(i)*o;return[e-n,t-l,r-n,s-l,r+n,s+l,e+n,t+l]}},452:function(e,t,r){"use strict";e.exports=function(e,t){for(var r,s,a,i,o,n,l=e,c=t,p=[l,c],h=0;hs)&&(s=a);for(i=o=null,n=0;no)&&(o=a);if(sr!=e[o+1]>r&&t<(e[o]-e[i])*(r-e[i+1])/(e[o+1]-e[i+1])+e[i]&&(l=!l),o=i;if(l)return!0;for(i=0;i({edges:[]}),computed:{schemas(){return this.schema instanceof s.ProcessSchema?this.schema:new s.ProcessSchema(this.schema)},hasValue(){return void 0!==this.value},textListeners(){return this.allowsArgumentChange?{click:this.openEditorForArguments}:{}},circleListeners(){var e={};return this.state.editable&&(e.mousedown=e=>{1==e.which&&(this.state.root.link(this),e.preventDefault(),e.stopPropagation())},this.output&&(e.dblclick=e=>{1==e.which&&this.$emit("input",!0)}),e.mouseover=()=>this.state.linkFrom&&this.state.root.link(this),e.mouseout=()=>this.state.linkTo&&this.state.root.unlink(this)),e},classes(){let e=[this.output?"output":"input","connector","field_"+this.name,this.hasValue||this.optional||this.output||this.getEdgeCount()>0?"hasValue":"noValue"];return this.allowsArgumentChange&&e.push("editable"),e},unspecified(){return!this.$parent.invalid&&this.state.root.hasProcesses&&this.schemas.unspecified},circleClasses(){var e=["circle"];for(var t of(this.getEdgeCount()>0&&e.push("io_active"),this.edges))t.selected?e.push("io_selected"):t.issues.length>0&&e.push("io_issues");return this.state.linkFrom!=this&&this.state.linkTo!=this||e.push("io_selected"),e},displayValue(){var e=38-this.displayLabel.length,t=null;if(this.isEditable&&!this.state.compactMode&&!i.a.isRef(this.value)){let r=void 0!==this.value?this.value:this.default;void 0!==r&&(t=this.formatValue(r,e,!0))}return"string"==typeof t?0===t.length&&(t="Empty"):t="",t},displayLabel(){return this.output&&this.state.compactMode?"":"string"==typeof this.label&&(this.label.length>0||this.output)?this.label:this.name},isArrayType(){return"array"===this.schemas.nativeDataType()},isObjectType(){return"object"===this.schemas.nativeDataType()},isEditable(){return!this.output&&this.schemas.isEditable()},allowsArgumentChange(){return!this.output&&this.schemas.isEditable()},allowsMultipleInputs(){return this.isArrayType||this.isObjectType||"any"===this.schemas.nativeDataType()}},watch:{edges(){this.updateEdgeStatus(),this.$emit("edgesChanged",this.edges,this)},value:{immediate:!0,handler(){this.updateEdgeStatus()}}},methods:{updateEdgeStatus(){if(!this.output)for(var e of this.edges)e.inactive=!this.isEdgeUsed(e)},getCirclePosition(){try{var e=this.state.root.domBoundingBox(this.$refs.circle),t=this.state.root.getDimensions();return[e.offsetLeft-t.offsetLeft+e.width/2,e.offsetTop-t.offsetTop+e.height/2]}catch(e){return console.warn(e),null}},openEditorForArguments(){this.allowsArgumentChange&&this.$parent.showArguments(this.name)},jsonSchema(){return this.schemas.toJSON()},setValue(e){"boolean"!=this.schemas.nativeDataType()||i.a.isRef(e)||(e=!!e),this.$emit("input",e)},resetValue(){if(void 0===this.default){var e;if(this.schemas.nullable())e=null;else switch(this.schemas.nativeDataType()){case"object":e={};break;case"array":e=[];break;case"string":e="";break;case"integer":case"number":e=0;break;case"boolean":e=!1;break;default:e=void 0}this.setValue(e)}else this.setValue(this.default)},getEdgeRef(e){return this.output?this.value:e.parameter1.value},addRefToValue(e){var t=this.getEdgeRef(e);if(t)if(this.allowsMultipleInputs)if(this.isArrayType)if(i.a.isRef(this.value))this.setValue([this.value,t]);else if(Array.isArray(this.value)&&this.value.length>0){var r=this.value;r.push(t),this.setValue(r)}else this.setValue(t);else if(this.isObjectType){var s=i.a.size(this.value);1!==this.getEdgeCount()||this.hasValue&&s?s||this.resetValue():this.setValue(t)}else this.setValue(t);else this.setValue(t)},removeRefFromValue(e){if(!this.output){var t=this.getEdgeRef(e);i.a.isRefEqual(t,this.value)?this.resetValue():(this.isArrayType||this.isObjectType)&&this.setValue(this.removeRefFromValueDeep(this.value,t))}},removeRefFromValueDeep(e,t){if(Array.isArray(e))for(var r=e.length;--r>=0;)null!==e[r]&&"object"==typeof e[r]&&(i.a.isRefEqual(t,e[r])?e.splice(r,1):e[r]=this.removeRefFromValueDeep(e[r],t));else if(i.a.isObject(e))for(var s in e)e.hasOwnProperty(s)&&null!==e[s]&&"object"==typeof e[s]&&(i.a.isRefEqual(t,e[s])?delete e[s]:e[r]=this.removeRefFromValueDeep(e[s],t));return e},addEdge(e){this.edges.push(e),this.isEdgeUsed(e)||this.output||this.addRefToValue(e)},eraseEdge(e){for(var t in this.edges)if(this.edges[t]==e)return this.removeRefFromValue(e),this.$delete(this.edges,t),!0;return!1},isEdgeUsed(e){var t=this.getEdgeRef(e);return!!i.a.isRefEqual(t,this.value)||this.hasRefInValue(t,this.value)},hasRefInValue(e,t){if(!t||"object"!=typeof t)return!1;if(i.a.isRefEqual(e,t))return!0;for(let r in t)if(this.hasRefInValue(e,t[r]))return!0;return!1},getEdgeCount(){return this.edges.length},formatProcess(e,t){if(e instanceof a.ProcessGraph&&1===e.getNodeCount())return this.formatValue(e.getResultNode().process_id,t);var r=Object.values(e.process_graph);return 1===r.length?this.formatValue(r[0].process_id,t):"Process"},formatValue(e,t,r=!0){if("object"==typeof e)return null===e?"n/a":Array.isArray(e)?this.formatArray(e,t,r):this.formatObject(e,t,r);if("string"==typeof e){if(e.length>t){var s=i.a.htmlentities(e.substr(0,t));return r?s+'':s}return i.a.htmlentities(e)}return"boolean"==typeof e?e?"✔️":"❌":"number"==typeof e?e.toString():i.a.htmlentities(JSON.stringify(e))},formatArray(e,t,r=!0){let s=[];for(let a in e){let o=e[a],n=this.formatValue(o,10,r),l=i.a.htmlentities_decode(this.formatValue(o,10,!1));if(l.length>t){if(0===s.length)return this.formatArraySimple(e,"List("+e.length+")");s.push(this.formatArraySimple(e,"…"));break}s.push(n),t-=l.length+2}return s.join(", ")},formatArraySimple(e,t,r=!0){if(r&&e.length<10){return''+t+""}return t},formatObject(e,t,r=!0){return 0===Object.keys(e).length?"None":e instanceof a.ProcessGraph||i.a.isObject(e.process_graph)?this.formatProcess(e,t):i.a.isRef(e)?this.formatValue(i.a.formatRef(e),t):void 0!==e.west&&void 0!==e.east&&void 0!==e.south&&void 0!==e.north?t>=12?"Bounding Box":"BBox":i.a.detectGeoJson(e)?this.formatValue(e.type,t):r?'Object':"Object"}}},n=(r(444),r(4)),l=Object(n.a)(o,(function(){var e=this,t=e._self._c;return t("div",{class:e.classes},[e.output?e._e():t("div",e._g({ref:"circle",class:e.circleClasses},e.circleListeners)),e._v(" "),t("span",e._g({staticClass:"text"},e.textListeners),[t("span",{directives:[{name:"show",rawName:"v-show",value:e.unspecified,expression:"unspecified"}],staticClass:"unspecified",attrs:{title:"Parameter is likely unsupported!"}},[t("i",{staticClass:"fas fa-exclamation-triangle"})]),e._v(" "),t("span",{staticClass:"label"},[e._v(e._s(e.displayLabel))]),e.displayValue.length?[e._v(": ")]:e._e(),e._v(" "),t("span",{staticClass:"value",domProps:{innerHTML:e._s(e.displayValue)}})],2),e._v(" "),e.output?t("div",e._g({ref:"circle",class:e.circleClasses,attrs:{title:"Output of the process"}},e.circleListeners)):e._e()])}),[],!1,null,null,null).exports,c=1.3,p={compactParams:110,compact:60,normalParams:220,normal:110};var h={name:"Block",components:{BlockParameter:l},props:{id:{type:String,required:!0},type:{type:String,required:!0},selected:{type:Boolean,default:!1},position:{type:Array,required:!0},process_id:{type:String},namespace:{type:String,default:null},description:{type:String,default:null},args:{type:Object,default:()=>({})},result:{type:Boolean,default:!1},origin:{type:String,default:null},spec:{type:Object,default:()=>null},state:{type:Object,required:!0}},data:()=>({showDescriptionField:!1,drag:null}),watch:{"state.compactMode"(){this.$emit("moved",this.position)},description:{immediate:!0,handler(){this.showDescriptionField=null!==this.description}}},computed:{width(){let e=p;return this.parameters.length>0?this.state.compactMode?e.compactParams:e.normalParams:this.state.compactMode?e.compact:e.normal},styles(){return{marginLeft:Math.round(this.state.center[0]+this.position[0]*this.state.scale)+"px",marginTop:Math.round(this.state.center[1]+this.position[1]*this.state.scale)+"px",fontSize:Math.round(10*this.state.scale)+"px",width:Math.round(this.state.scale*this.width)+"px"}},plainTitle(){let e=[];return e.push(this.name),this.namespace&&e.push("@"+this.namespace),this.showId&&e.push(" "+this.id),e.join("")},name(){switch(this.type){case"process":return this.collectionId?this.collectionId:this.processId;case"parameter":return this.spec.name;default:return this.id.substr(1)}},outputLabel(){return this.result?"Result":this.isParameter?"Process Parameter":""},containerClasses(){var e=["block"];return this.collectionId?e.push("block_collection"):this.isParameter&&e.push("block_argument"),this.result&&e.push("block_result"),this.selected&&e.push("block_selected"),this.invalid&&e.push("block_invalid"),e},invalid(){if("process"!==this.type||!this.$parent.hasProcesses)return!1;if(this.namespace&&i.a.isUrl(this.namespace))return!1;if(!this.processId)return!0;if(!this.spec)return!0;if("load_collection"===this.processId&&!i.a.isRef(this.args.id)){for(let e of this.$parent.collections)if(this.args.id===e.id)return!1;return!0}return!1},processId(){if("process"===this.type){if(this.process_id)return this.process_id;if(i.a.isObject(this.spec)&&this.spec.id)return this.spec.id}return null},collectionId(){return"process"!==this.type||"load_collection"!==this.processId||i.a.isRef(this.args.id)?null:this.args.id},isParameter(){return"parameter"===this.type},allowsParameterChange(){return this.isParameter?this.state.editable&&"schema"!==this.origin&&!!this.$parent.supports("editParameter"):this.parameters.filter(e=>e.isEditable()).length>0},allowsDuplicate(){return this.state.editable&&"process"===this.type&&"schema"!==this.origin},allowsDelete(){return this.state.editable&&(!this.spec||i.a.isObject(this.spec)&&"schema"!==this.origin)},allowsInfo(){return this.collectionId?this.$parent.supports("showCollection"):this.isParameter?i.a.isObject(this.spec)&&this.$parent.supports("showParameter"):this.$parent.supports("showProcess")},allowsDescription(){return this.state.editable&&"process"===this.type},showId(){return"parameter"!==this.type},hasParametersDefined(){return Boolean(i.a.isObject(this.spec)&&Array.isArray(this.spec.parameters)&&this.spec.parameters.length>0)},parameters(){let e=[],t=[];if(this.hasParametersDefined&&(t=this.spec.parameters.map(e=>new s.ProcessParameter(e)),e=t.map(e=>e.name)),i.a.size(this.args)>0)for(var r in this.args)e.includes(r)||t.push(new s.ProcessParameter({name:r,description:""}));return t},fields(){var e={};for(var t of this.parameters)e[t.name]=t;return e.output=this.output,e},output(){var e={};i.a.isObject(this.spec)&&(this.isParameter?e=this.spec:i.a.isObject(this.spec.returns)&&(e=this.spec.returns));var t={name:"output",schema:e.schema||{},description:e.description||"",optional:!0,output:!0,value:{}};return this.isParameter?t.value.from_parameter=this.id.substr(1):t.value.from_node=this.id.substr(1),t}},mounted(){this.draggingFn=this.dragging.bind(this),document.addEventListener("mousemove",this.draggingFn),this.stopDragFn=this.stopDrag.bind(this),document.addEventListener("mouseup",this.stopDragFn),this.$emit("mounted",this)},beforeDestroy(){document.removeEventListener("mousemove",this.draggingFn),document.removeEventListener("mouseup",this.stopDragFn),this.$emit("unmounted",this)},methods:{edit(){this.isParameter?this.editParameter():this.showArguments()},duplicate(){this.$parent.$emit("duplicate",{position:this.position,process_id:this.process_id,namespace:this.namespace,arguments:this.args,description:this.description})},hasParameter(e){return this.hasParametersDefined&&!!this.spec.parameters.find(t=>t.name===e)},updateDescription(e){let t,r=e.composedPath()[0];t=r&&"string"==typeof r.value&&(r.value.length>0||"input"===e.type)?r.value:null,this.showDescriptionField=null!==t,this.description!==t&&this.$emit("update","description",t)},updatePosition(e,t=!0){e=i.a.ensurePoint(e),this.position[0]===e[0]&&this.position[1]===e[1]||this.$emit("update","position",e,t)},updateArguments(e){let t=Object.keys(this.args).filter(t=>void 0===e[t]&&(!this.hasParametersDefined||this.hasParameter(t)));for(let t of this.parameters)void 0!==e[t.name]&&t.optional&&void 0!==t.default&&i.a.equals(t.default,e[t.name])&&delete e[t.name];this.$emit("update","arguments",e,t)},updateArgument(e,t){let r=i.a.deepClone(this.args);r[e]=t,this.updateArguments(r)},updateResult(e){this.hasOutputEdges()?this.state.root.$emit("error","A result node can't have outgoing edges."):e!==this.result&&this.$emit("update","result",e)},focus(){this.$parent.focus()},onMouseDown(e){this.select(!this.selected,!e.shiftKey)},select(e=!0,t=!0){this.$emit("update","selected",e,t),this.focus()},getDimensions(){let e=this.$parent.domBoundingBox(this.$refs.div);var t=this.$parent.getDimensions();return e.x=e.offsetLeft-t.offsetLeft,e.y=e.offsetTop-t.offsetTop,e},edgesChanged(e,t){e.refs=t.map(e=>e.parameter1.value)},editParameter(){this.$parent.$emit("editParameter",this.spec,"Edit Parameter: "+this.plainTitle,e=>this.$emit("update","spec",e))},showArguments(e=null){this.$parent.$emit("editArguments",this.parameters.filter(e=>e.isEditable()),this.args,this.plainTitle,this.state.editable,e,e=>this.updateArguments(e),this)},showInfo(){this.collectionId?this.$parent.$emit("showCollection",this.collectionId):this.isParameter?this.$parent.$emit("showParameter",this.spec,this.origin):this.$parent.$emit("showProcess",this.processId,this.namespace)},async addDescription(){this.select(),this.showDescriptionField=!0,await this.$nextTick(),this.$refs.descriptionField.focus()},async emitDrag(e){this.select(!0,!e.shiftKey),this.focus(),await this.$nextTick(),this.$emit("move",e)},getDragPos(e,t){return[t[0]/this.state.scale-e[0],t[1]/this.state.scale-e[1]]},startDrag(e){if(!this.selected)return;let t=this.$parent.getMousePos(e);this.drag={origin:this.position,mouse:this.getDragPos(this.position,t)}},stopDrag(){if(this.drag){var e=5/this.state.scale;(Math.abs(this.drag.origin[0]-this.position[0])>e||Math.abs(this.drag.origin[1]-this.position[1])>e)&&this.updatePosition(this.position),this.drag=null}},dragging(e){if(!this.drag)return;let t=this.$parent.getMousePos(e),r=this.getDragPos(this.drag.mouse,t);this.updatePosition(r,!1)},hasOutputEdges(){return this.$refs.output&&this.$refs.output.getEdgeCount()>0},async remove(){await this.$parent.removeBlock(this)},getBlockParameter(e){if("output"===e&&this.$refs.output)return this.$refs.output;if(Array.isArray(this.$refs.parameters)){var t=this.$refs.parameters.filter(t=>t.name===e);if(t.length>0)return t[0]}return null},isParameterScoped(e,t){let r=this.getBlockParameter(e);return s.ProcessUtils.getCallbackParameters(r).map(e=>e.name).includes(t)},hiddenParameterRef(e){if("process"!==this.type)return null;let t=e.id.substr(1);for(let e in this.args){let r=this.args[e];if(i.a.isObject(r)&&i.a.isObject(r.process_graph)){if(a.Utils.getRefs(r,!0,!0).find(r=>r.from_parameter===t&&!this.isParameterScoped(e,r.from_parameter)))return e}}return null}}},u=(r(445),Object(n.a)(h,(function(){var e=this,t=e._self._c;return t("div",{ref:"div",class:e.containerClasses,style:e.styles,attrs:{id:"block"+this.id},on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])?null:(t.preventDefault(),t.stopPropagation(),"button"in t&&0!==t.button?null:e.onMouseDown.apply(null,arguments))}}},[t("div",{staticClass:"blockTitle",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])?null:(t.preventDefault(),t.stopPropagation(),"button"in t&&0!==t.button?null:e.emitDrag.apply(null,arguments))}}},[t("span",{staticClass:"titleText",attrs:{title:e.plainTitle}},[t("span",{directives:[{name:"show",rawName:"v-show",value:e.invalid,expression:"invalid"}],staticClass:"invalid",attrs:{title:"Process or Collection not supported!"}},[t("i",{staticClass:"fas fa-exclamation-triangle"})]),e._v("\n "+e._s(e.name)+"\n "),e.showId?t("span",{staticClass:"blockId"},[e._v(e._s(e.id))]):e._e()]),e._v(" "),t("div",{staticClass:"blockicon",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])?null:(t.preventDefault(),t.stopPropagation(),"button"in t&&0!==t.button?null:e.focus())}}},[t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsDescription&&!e.showDescriptionField,expression:"allowsDescription && !showDescriptionField"}],staticClass:"addDescription",attrs:{title:"Add description"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.addDescription()}}},[t("i",{staticClass:"fas fa-comment-medical"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsDuplicate,expression:"allowsDuplicate"}],staticClass:"duplicate",attrs:{title:"Duplicate"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.duplicate.apply(null,arguments)}}},[t("i",{staticClass:"fas fa-clone"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsDelete,expression:"allowsDelete"}],staticClass:"delete",attrs:{title:"Remove (DEL)"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.remove()}}},[t("i",{staticClass:"fas fa-trash"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsInfo,expression:"allowsInfo"}],staticClass:"info",attrs:{title:"Details"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.showInfo()}}},[t("i",{staticClass:"fas fa-info"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsParameterChange,expression:"allowsParameterChange"}],staticClass:"settings",attrs:{title:e.isParameter?"Edit parameter":"Change parameter values"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.edit.apply(null,arguments)}}},[t("i",{staticClass:"fas fa-edit"})])])]),e._v(" "),t("div",{staticClass:"inout"},[t("div",{staticClass:"inputs"},e._l(e.parameters,(function(r,s){return t("BlockParameter",{key:s,ref:"parameters",refInFor:!0,attrs:{state:e.state,value:e.args[r.name],name:r.name,description:r.description,optional:r.optional,deprecated:r.deprecated,experimental:r.experimental,default:r.default,schema:r.schema},on:{input:t=>e.updateArgument(r.name,t),edgesChanged:function(t){return e.edgesChanged(r,t)}}})})),1),e._v(" "),t("div",{staticClass:"outputs"},[t("BlockParameter",e._b({ref:"output",attrs:{state:e.state,label:e.outputLabel},on:{input:e.updateResult}},"BlockParameter",e.output,!1))],1)]),e._v(" "),e.showDescriptionField?t("textarea",{ref:"descriptionField",staticClass:"editDescription",attrs:{readonly:!e.state.editable,placeholder:"Type description here..."},domProps:{value:e.description},on:{input:e.updateDescription,blur:e.updateDescription,mousedown:function(e){e.stopPropagation()}}}):e._e()])}),[],!1,null,null,null).exports);class d{constructor(e,t,r,s){this.x=e,this.y=t,this.dx=r,this.dy=s}distance(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}distanceP(e){var t=this.normal();t.x=e.x,t.y=e.y;var r=this.intersection(t);return[r[0],this.distance(t.alpha(r[1]),e)]}normal(){return new d(this.x,this.y,this.dy,-this.dx)}intersection(e){var t=this.dx,r=-e.dx,s=this.dy,a=-e.dy,i=e.x-this.x,o=e.y-this.y,n=t*a-r*s;return 0==n?null:[(a*i-r*o)/n,(-s*i+t*o)/n]}alpha(e){var t={};return t.x=this.x+this.dx*e,t.y=this.y+this.dy*e,t}}var m={name:"Edge",props:{id:{},parameter1:{type:Object,required:!0},parameter2:{type:Object,required:!0},selected:{type:Boolean,default:!1},inactive:{type:Boolean,default:!1},issues:{type:Array,default:()=>[]},lineWidth:{type:Number,default:3},lineColor:{type:Array,default:()=>[255,200,0,1]},state:{type:Object,required:!0}},data:()=>({position1:null,position2:null}),computed:{segment(){return new d(this.position1[0],this.position1[1],this.position2[0]-this.position1[0],this.position2[1]-this.position1[1])},scaledLineWidth(){return this.lineWidth*this.state.scale},lines(){var e=(this.position1[0]+this.position2[0])/2,t=(this.position1[1]+this.position2[1])/2,r=35*Math.PI/180,s=Math.cos(r),a=Math.sin(r),i=Math.cos(-r),o=Math.sin(-r),n=Math.sqrt(Math.pow(this.position1[0]-this.position2[0],2)+Math.pow(this.position1[1]-this.position2[1],2)),l=10*this.state.scale/(n/1.5),c=(this.position1[0]-e)*l,p=(this.position1[1]-t)*l,h=this.getLineStyle(this.scaledLineWidth,this.selected,this.inactive),u=this.getLineStyle(this.scaledLineWidth/1.5,this.selected),d=this.getLine(this.position1[0],this.position1[1],this.position2[0],this.position2[1],h);return this.inactive||n/this.state.scale<25?[d]:[d,this.getLine(e,t,e+(c*s-p*a),t+(p*s+c*a),u),this.getLine(e,t,e+(c*i-p*o),t+(p*i+c*o),u)]}},watch:{"state.center"(){this.updatePositions()},"state.scale"(){this.updatePositions()},"state.moving"(){this.updatePositions()}},created(){this.updatePositions()},mounted(){this.$emit("mounted",this)},beforeDestroy(){this.$emit("unmounted",this)},methods:{updatePositions(){let e=this.parameter1.getCirclePosition(),t=this.parameter2.getCirclePosition();e&&t&&(this.position1&&this.position2&&e[0]===this.position1[0]&&e[1]===this.position1[1]&&t[0]===this.position2[0]&&t[1]===this.position2[1]||(this.position1=Object.freeze(e),this.position2=Object.freeze(t),this.$emit("position",this.position1,this.position2)))},getLineStyle(e,t=!1,r=!1){let s=2*this.state.scale,a=this.lineColor;return t?a=[0,200,0,1]:this.issues.length>0&&(a=[255,0,0,1]),{stroke:`rgba(${a.join(", ")})`,"stroke-width":e,"stroke-dasharray":r?3*s+" "+2*s:"none"}},getLine:(e,t,r,s,a={})=>Object.assign({x1:e,y1:t,x2:r,y2:s},a),collide(e,t){if(!this.segment)return!1;var r=this.segment.distanceP({x:e,y:t});return r[0]>=0&&r[0]<=1&&r[1]e.id===t[r].id)||this.$emit("selectionChanged",this.selectedBlocks,this.selectedEdges)};var E={name:"ModelBuilder",components:{Block:u,Edge:f,ParameterViewer:()=>Promise.all([r.e(0),r.e(36)]).then(r.bind(null,486))},props:{id:{type:String,required:!0},editable:{type:Boolean,default:!1},value:{type:Object,default:()=>({})},collections:{type:Array,default:()=>[]},processes:{type:[Array,Object],default:()=>[]},parent:{type:Object,default:null},parentSchema:{type:Object,default:null},historySize:{type:Number,default:30},explicitZoom:{type:Boolean,default:!1},height:{type:String,default:null}},data(){return{isMounted:!1,allMounted:!1,newBlockOffset:0,history:[],historyPointer:null,process:Object.freeze(this.value),blocks:[],edges:[],hiddenParameterRefEdges:{},processGraph:null,nextBlockId:1,nextEdgeId:1,clipboard:null,activeTransactions:0,hasFocus:!1,linkingLine:null,parameterViewer:null,showZoomInfo:this.explicitZoom,state:(e=this,y.a.observable({root:e,editable:!1,compactMode:!1,moving:null,selecting:null,center:[0,0],mouse:[0,0],scale:c,linkFrom:null,linkTo:null}))};var e},computed:{style(){let e={};return"string"==typeof this.height&&(e.height=this.height),e},classes(){let e=["vue-component","model-builder"];return this.hasFocus&&e.push("focus"),this.editable&&e.push("editable"),this.state.compactMode&&e.push("compact"),this.state.scale<.5?e.push("scale_xs"):this.state.scale<.7?e.push("scale_s"):this.state.scale<.9?e.push("scale_m"):this.state.scale<1.1?e.push("scale_l"):e.push("scale_xl"),e},selectRect(){return this.state.selecting?{x:Math.min(this.state.selecting.current[0],this.state.selecting.start[0]),y:Math.min(this.state.selecting.current[1],this.state.selecting.start[1]),width:Math.abs(this.state.selecting.current[0]-this.state.selecting.start[0]),height:Math.abs(this.state.selecting.current[1]-this.state.selecting.start[1]),stroke:"rgba(0,0,0,0.8)","stroke-width":1,fill:"rgba(0,0,0,0.05)"}:null},processRegistry(){if(this.processes instanceof s.ProcessRegistry||"function"==typeof this.processes.count&&"function"==typeof this.processes.get)return this.processes;if(Array.isArray(this.processes))return new s.ProcessRegistry(this.processes);throw new Error("Invalid processes specified, must be ProcessRegistry or Array")},hasProcesses(){return this.processRegistry.count()>0},processBlocks(){return this.blocks.filter(e=>"process"===e.type)},selectedBlocks(){return this.blocks.filter(e=>e.selected)},selectedEdges(){return this.edges.filter(e=>e.selected)},selectedSideEdge(){return 1===this.selectedEdges.length&&this.selectedEdges[0].selectedParameter?this.selectedEdges[0]:null},hasSelection(){return this.selectedBlocks.length>0||this.selectedEdges.length>0},processParametersFromSchemas(){let e=[];this.parent&&this.parent.$parent&&"function"==typeof this.parent.$parent.getPgParameters&&(e=this.parent.$parent.getPgParameters().map(e=>e.spec));let t=[];this.parentSchema&&(t=this.parentSchema.getCallbackParameters());let r=e.filter(e=>!t.find(t=>e.name===t.name));return t.concat(r)}},watch:{parentSchema(){this.importPgParameters(this.processParametersFromSchemas,"schema")},async value(e){this.allMounted&&(e instanceof S||(this.process=e,await this.import(e,{propagate:!1,undoOnError:!1})))},editable:{immediate:!0,handler(e){this.state.editable=e}},selectedEdges:w,selectedBlocks:w,allMounted(){this.updateHiddenParameterRefEdges()},isMounted(){this.checkAllMounted()}},beforeCreate(){i.a.enableHtmlProps(this)},async created(){this.supports("error")||this.$on("error",(e,t=null)=>console.error(e,t)),this.supports("editArguments")||this.$on("editArguments",(...e)=>this.showParameterViewer(...e)),this.$on("duplicate",this.duplicate.bind(this))},async mounted(){i.a.loadFontAwesome(this),this.moveCenter(0,0,!0),this.onDocumentMouseUpFn=this.onDocumentMouseUp.bind(this),document.addEventListener("mouseup",this.onDocumentMouseUpFn),await this.importPgParameters(this.processParametersFromSchemas,"schema"),await this.import(this.value,{propagate:!1,undoOnError:!1})||this.perfectScale(),w.bind(this)(),this.isMounted=!0},beforeDestroy(){document.removeEventListener("mouseup",this.onDocumentMouseUpFn)},methods:{updateEdgePos(e,t){e.position1=t[0],e.position2=t[1]},mount(e,t=null){e.$el=t,this.checkAllMounted()},checkAllMounted(){this.isMounted?this.allMounted=!this.blocks.find(e=>!e.$el)||!this.edges.find(e=>!e.$el):this.allMounted=!1},updateBlockArguments(e,t,r){r.length>0&&this.parameterRemoved(e,r),this.$set(e,"arguments",t),this.commit(),r.length>0&&this.$nextTick(()=>this.refreshEdges())},updateBlockDescription(e,t){this.$set(e,"description",t),this.commit()},updateBlockPos(e,t,r=!0){this.$set(e,"position",t),this.commit(null,r,!1)},updateBlockResult(e,t){this.$set(e,"result",t),this.commit()},updateBlockSelected(e,t,r=!0){r&&this.unselectAll(),this.$set(e,"selected",t),this.commit(null,!1,!1)},updateBlockSpec(e,t){let r=i.a.omitFromObject(e.spec,["name","schema","description","optional","deprecated","experimental","default"]);Object.assign(r,t),r.optional||(delete r.optional,delete r.default),r.deprecated||delete r.deprecated,r.experimental||delete r.experimental,this.$set(e,"spec",r),this.commit()},updateBlock(e,t,r,s){switch(t){case"arguments":this.updateBlockArguments(e,r,s);break;case"description":this.updateBlockDescription(e,r);break;case"position":this.updateBlockPos(e,r,s);break;case"result":this.setResultNode(e,r);break;case"selected":this.updateBlockSelected(e,r,s);break;case"spec":this.updateBlockSpec(e,r)}},updateHiddenParameterRefEdges(){if(!this.hasProcesses||!this.allMounted||!this.blocks.find(e=>"parameter"===e.type))return void(this.hiddenParameterRefEdges={});let e={};for(let t of this.processBlocks)for(let r in t.arguments){let s=t.arguments[r];if(!i.a.isObject(s)||!i.a.isObject(s.process_graph))continue;let o=a.Utils.getRefs(s,!0,!0).filter(e=>void 0!==e.from_parameter);for(let s of o)try{if(!t.$el)continue;if(t.$el.isParameterScoped(r,s.from_parameter))continue;let a=this.getPgParameterById("$"+s.from_parameter);if(!a)continue;let i=a.$el.getBlockParameter("output"),o=t.$el.getBlockParameter(r),n=`${a.id}->${t.id}:${r}`;i&&o&&(this.hiddenParameterRefEdges[n]?e[n]=this.hiddenParameterRefEdges[n]:e[n]={$el:null,id:n,parameter1:i,parameter2:o})}catch(e){console.warn(e)}}this.hiddenParameterRefEdges=e},parameterRemoved(e,t){for(let r of this.edges.slice(0))r.parameter2.$parent.id===e.id&&t.includes(r.parameter2.name)&&this.removeEdge(r)},startDragBlock(e){for(let t of this.blocks)t.$el&&t.$el.startDrag(e)},refreshEdges(){this.refreshEdgesFor(this.edges),this.refreshEdgesFor(Object.values(this.hiddenParameterRefEdges))},refreshEdgesFor(e){for(let t of e)t.$el&&t.$el.updatePositions()},supports(e){return Boolean(this.$listeners&&this.$listeners[e])},focus(){this.$refs.div.focus()},link(e){this.state.linkFrom?this.state.linkTo=e:this.state.linkFrom=e},unlink(e=null){e?this.state.linkTo==e?this.state.linkTo=null:this.state.linkFrom==e&&(this.state.linkFrom=null,this.linkingLine=null):(this.state.linkTo=null,this.state.linkFrom=null,this.linkingLine=null)},multiSelect(){let e=this.selectRect;this.blocks.filter(t=>{if(Array.isArray(t.position)&&t.$el){let r=t.$el.getDimensions();return g()(e.x,e.y,e.width,e.height,r.x,r.y,r.width,r.height)}return!1}).map(e=>e.selected=!0),this.edges.filter(t=>Array.isArray(t.position1)&&Array.isArray(t.position2)&&P()(e.x,e.y,e.width,e.height,t.position1[0],t.position1[1],t.position2[0],t.position2[1])).map(e=>e.selected=!0)},toJSON(){let e=this.export();return JSON.stringify(e,null,2)},async onDocumentMouseUp(e){if(!this.parameterViewer&&(this.selectedSideEdge&&this.selectEdge(this.selectedSideEdge,null),this.state.selecting&&(this.multiSelect(),this.state.selecting=null),this.state.moving&&(this.state.moving=null),this.state.editable&&this.state.linkFrom)){if(1==e.which&&this.state.linkTo)try{await this.addEdge(this.state.linkFrom,this.state.linkTo)}catch(e){this.$emit("error",e)}this.unlink()}},async onKeyDown(e){if(this.parameterViewer)return;var t=document.querySelectorAll("input, textarea, button, select, datalist");for(let e of t)if(e===document.activeElement)return;let r=!1;if(this.state.editable)if("Delete"===e.code)this.deleteSelected(),r=!0;else if(e.ctrlKey||e.metaKey)if("KeyV"===e.code){if(!navigator||!navigator.clipboard||"function"!=typeof navigator.clipboard.readText)return void this.$emit("error","Pasting is not supported by your browser.");if(this.hasSelection&&this.clipboard){if(this.clipboard.edges.length>0)return void this.$emit("error","Pasting edges is not supported yet.");this.clipboard.blocks.length>0&&this.clipboard.blocks.forEach(e=>{"process"===e.type&&"schema"!==e.origin?this.duplicate(i.a.pickFromObject(e,["arguments","description","namespace","position","process_id"])):this.$emit("error",`Pasting block '${e.id}' is not supported.`)})}else try{const e=await navigator.clipboard.readText();let t=JSON.parse(e);await this.import(t)}catch(e){this.$emit("error",e,"Paste Error")}r=!0}else if("KeyC"===e.code){if(!navigator||!navigator.clipboard||"function"!=typeof navigator.clipboard.writeText)return void this.$emit("error","Copying is not supported by your browser.");if(this.hasSelection)this.clipboard={blocks:this.selectedBlocks.slice(0),edges:this.selectedEdges.slice(0)};else try{let e=this.toJSON();await navigator.clipboard.writeText(e),r=!0}catch(e){this.$emit("error",e,"Copy Error")}r=!0}r&&(e.preventDefault(),e.stopPropagation())},onMouseWheel(e){if(!this.parameterViewer&&(!this.explicitZoom||this.hasFocus||e.ctrlKey||e.metaKey)){let a=this.getMousePos(e);var t=a[0]-this.state.center[0],r=a[1]-this.state.center[1],s=Math.pow(1.1,-1*Math.sign(e.deltaY));this.moveCenter(-t*(s-1),-r*(s-1)),this.state.scale*=s,e.preventDefault(),this.showZoomInfo=!1}},domBoundingBox(e){var t=e.getBoundingClientRect();return t.offsetTop=t.top+Math.max(document.documentElement.scrollTop,document.body.scrollTop),t.offsetLeft=t.left+Math.max(document.documentElement.scrollLeft,document.body.scrollLeft),t},getMousePos(e){let t=this.$refs.div.getBoundingClientRect();return[e.clientX-t.left,e.clientY-t.top]},onMouseMove(e){if(!this.parameterViewer)try{let s=this.getMousePos(e);if(this.state.editable&&this.selectedSideEdge){var t=this.selectedSideEdge.selectedParameter.getCirclePosition();if(t)Math.sqrt(Math.pow(s[0]-t[0],2)+Math.pow(s[1]-t[1],2))>10&&(this.link(this.selectedSideEdge.selectedParameter),this.removeEdge(this.selectedSideEdge),this.commit())}if(this.state.selecting&&(this.state.selecting.current=s),this.state.moving&&(this.moveCenter(s[0]-this.state.moving[0],s[1]-this.state.moving[1]),this.state.moving=s),this.state.linkFrom){var r=this.state.linkFrom.getCirclePosition();r&&(this.linkingLine={x1:r[0],y1:r[1],x2:s[0],y2:s[1],stroke:"rgba(0,0,0,0.4)","stroke-width":3*this.state.scale})}}catch(e){this.$emit("error",e)}},onMouseDown(e){if(this.parameterViewer)return;let t=null,r=this.getMousePos(e);if(1==e.which)for(var s of(e.shiftKey?this.state.selecting={start:r,current:r}:this.unselectAll(),this.edges))if(s.$el){var a=s.$el.collide(r[0],r[1]);if(0!=a){if(0!==this.selectedEdges.length||e.shiftKey||(a<.3?t=s.parameter2:a>.7&&(t=s.parameter1)),this.selectEdge(s,!0,t),s.issues.length>0)for(let e of s.issues)this.$emit("error",e);e.preventDefault();break}}2!=e.which&&(1!=e.which||t||e.shiftKey)||(this.state.moving=r),this.focus()},getDimensions(){return this.domBoundingBox(this.$refs.div)},async clear(){return await this.startTransaction(async()=>(this.edges=[],this.blocks=this.blocks.filter(e=>"parameter"===e.type&&i.a.isObject(e.spec)&&"schema"===e.origin),this.nextBlockId=1,this.nextEdgeId=1,this.process={},this.updateHiddenParameterRefEdges(),!0))},commit(e=null,t=!0,r=!0){this.activeTransactions>0||(!1!==t&&this.saveHistory(),!1!==r?(this.$emit("input",null===e?this.export():e),this.updateHiddenParameterRefEdges()):this.refreshEdges())},saveHistory(){var e=this.export(!0);this.history.splice(this.historyPointer+1,this.historySize,Object.freeze(e)),this.history.length>this.historySize&&this.history.shift(),this.historyPointer=this.history.length-1,this.$emit("historyChanged",this.history,this.historyPointer)},async undo(){await this.historyStep(-1)},async redo(){await this.historyStep(1)},async historyStep(e){var t=this.historyPointer+e,r=this.history[t];r&&(this.historyPointer=t,this.import(r,{saveHistory:!1,undoOnError:!1,perfectScale:!1}),this.$emit("historyChanged",this.history,this.historyPointer))},setResultNode(e,t=!0){if((e=this.getBlockById(e.id))&&e.result!==t){this.updateBlockResult(e,t);var r=!1,s=!1;for(var a of this.processBlocks)if(!e||a.id!==e.id)if(s=!0,t)this.updateBlockResult(a,!1);else if(a.$el&&!a.$el.hasOutputEdges()){this.updateBlockResult(a,!0),r=!0;break}!s||t||r||this.$emit("error","No result node available, please specify one.")}},getPositionForPageXY(e,t){var r=this.getDimensions();return null!==e&&(e=(e-r.offsetLeft-this.state.center[0])/this.state.scale),null!==t&&(t=(t-r.offsetTop-this.state.center[1])/this.state.scale),[e,t]},duplicate(e){(e=i.a.deepClone(e)).position&&(e.position[1]+=100);let t=this.addBlock(e);this.$nextTick(()=>this.createEdgesForArguments(t.id,e.arguments))},addProcess(e,t={},r=[],s=null){return this.addBlock({process_id:e,namespace:s,arguments:t,position:r})},addBlock(e,t=null){let r=String(this.incrementId(t));null===t&&i.a.hasText(e.process_id)?(t=e.process_id.replace(/^([a-z]*).*$/i,"$1")+r,this.getBlockById("#"+t)&&(t=r)):t=r,"function"==typeof e.toJSON&&(e=e.toJSON());var s={id:"#"+t,type:"process",selected:!1,position:e.position,process_id:e.process_id,namespace:e.namespace,arguments:e.arguments,description:e.description||null,result:e.result||!1};this.processRegistry&&(s.spec=this.processRegistry.get(e.process_id,e.namespace));var a=this.getBlockSize(s);return s.position=i.a.ensurePoint(s.position,()=>this.getNewBlockDefaultPosition(a)),s.result&&this.blocks.filter(e=>!0===e.result).length?delete s.result:0===this.processBlocks.length&&(s.result=!0),this.blocks.push(y.a.observable(s)),this.commit(),s},getNewBlockDefaultPosition(e){var t=this.getDimensions(),r=[(-this.state.center[0]+t.width/2)/this.state.scale-e[0]/2+this.newBlockOffset,(-this.state.center[1]+t.height/2)/this.state.scale-e[1]/2+this.newBlockOffset];return this.newBlockOffset<150&&(this.newBlockOffset+=10),r},getBlockSize(e){if(e.$el){let t=e.$el.getDimensions();return[t.width/this.state.scale,t.height/this.state.scale]}let t,r=Math.max(i.a.size(e.arguments),i.a.isObject(e.spec)?i.a.size(e.spec.parameters):0),s=p;return t=r>0?this.state.compactMode?s.compactParams:s.normalParams:this.state.compactMode?s.compact:s.normal,[t,20+15*r+("string"==typeof e.description?40:0)]},moveCenter(e,t,r=!1){var s=this.getDimensions();this.state.center=[(r?s.width/2:this.state.center[0])+e,(r?s.height/2:this.state.center[1])+t],this.newBlockOffset=0},unselectAll(){for(var e of this.blocks)this.updateBlockSelected(e,!1,!1);for(var t of this.edges)this.selectEdge(t,!1)},selectEdge(e,t=!0,r=null){return i.a.isObject(e)||(e=this.edges[e]),e.selected!==t&&(null!==t&&this.$set(e,"selected",t),this.$set(e,"selectedParameter",r),!0)},removeEdge(e){e.parameter1.eraseEdge(e),e.parameter2.eraseEdge(e),this.$delete(this.edges,this.edges.indexOf(e))},async removeBlock(e){if("parameter"===e.type){let t=null,r=this.blocks.find(r=>(t=r.$el.hiddenParameterRef(e),null!==t));if(r)throw new Error(`Parameter is still used in '${r.id}', parameter '${t}'. Only unused parameters can be deleted.`)}return await this.startTransaction(async()=>{var t=this.blocks.findIndex(t=>t.id==e.id);if(t<0)return!1;for(var r of this.edges.slice(0))r.parameter1.$parent.id!==e.id&&r.parameter2.$parent.id!==e.id||this.removeEdge(r);return e.result&&this.setResultNode(e,!1),this.$delete(this.blocks,t),!0})},getBlockById(e){var t=this.blocks.filter(t=>t.id===e);return t.length>0?t[0]:null},async deleteSelected(){return!!this.hasSelection&&await this.startTransaction(async()=>{for(var e of this.selectedBlocks.slice(0))e.$el.allowsDelete&&await this.removeBlock(e);for(var t of this.selectedEdges.slice(0))this.removeEdge(t);return!0})},async addEdgeByNames(e,t,r,s){var a=[];for(var i of[e,r]){var o=this.getBlockById(i);if(!o)throw"Can't find block: "+i;if(!o.$el)throw"Block not mounted yet: "+i;a.push(o.$el)}await this.addEdge(a[0].getBlockParameter(t),a[1].getBlockParameter(s))},async addEdge(e,t){if(!e||!t)throw"One of the parameters is invalid.";if(e!=t){if(e.$parent==t.$parent)throw"You can't link a block to itself";var r={id:this.nextEdgeId++,selected:!1,inactive:!1,issues:[],$el:null};if(e.output?(r.parameter1=e,r.parameter2=t):(r.parameter1=t,r.parameter2=e),r.parameter1.output===r.parameter2.output)throw"You have to link an input with an output";if(-1!==this.allSuccessors(r.parameter1).indexOf(r.parameter2.id))throw"You can not create a loop";if(r.parameter2.getEdgeCount()>0&&!r.parameter2.allowsMultipleInputs)throw"Parameter accepts only one input";for(var s of this.edges)if(s.$el&&s.$el.equals(r))throw"This connection exists already";if(!a.JsonSchemaValidator.isSchemaCompatible(r.parameter2.schema||{},r.parameter1.schema||{},!1,!0)){let e='Incoming data type is not compatible for parameter "'+r.parameter2.name+'"';r.issues.push(e),this.$emit("error",e)}return await this.startTransaction(async()=>(this.unlink(),this.edges.push(y.a.observable(r)),r.parameter1.addEdge(r),r.parameter2.addEdge(r),this.setResultNode(r.parameter1.$parent,!1),!0))}},allSuccessors(e){var t=e.$parent,r={},s=[t];for(r[t.id]=!0;s.length>0;){var a=s.pop();for(var i in a.edges)for(var o in a.edges[i]){var n=a.edges[i][o];if(n.block1==a){var l=n.block2;l.id in r||(r[l.id]=!0,s.push(l))}}}return Object.values(r)},async toggleCompact(){this.state.compactMode=!this.state.compactMode,this.$emit("compactMode",this.state.compactMode),await this.$nextTick(),this.refreshEdges()},export(e=!1){let t={process_graph:{}};for(let r of this.processBlocks){let s=["process_id","namespace","arguments","description","result"];e&&s.push("position");let a=i.a.pickFromObject(r,s);null===a.description&&delete a.description,!0!==a.result&&delete a.result,a.namespace||delete a.namespace;let o=r.id.substr(1);t.process_graph[o]=a}if(!this.parent){t.parameters=[];let e=this.getPgParameters();for(let r of e)t.parameters.push(r.spec)}return new S(Object.assign({},this.process,t))},async startTransaction(e,t={},...r){let s;this.activeTransactions++;try{s=await e(r)}catch(e){if(this.$emit("error",e,"Model is invalid"),!1!==t.undoOnError)try{await this.undo()}catch(t){this.$emit("error",e,"Revert failed")}s=!1}return this.activeTransactions--,this.commit(null,t.saveHistory,t.propagate),s},async import(e,t={}){return await this.startTransaction(async()=>{if(!1!==t.clear&&(await this.clear(),this.process=e instanceof a.ProcessGraph?e.toJSON():e),!i.a.isObject(e))return!1;let r;return e instanceof a.ProcessGraph?(r=new a.ProcessGraph(e.toJSON(),this.processRegistry),r.setParent(e.parentProcessId,e.parentParameterName)):r=new a.ProcessGraph(e,this.processRegistry),r.allowEmpty(),r.parse(),this.processGraph=Object.freeze(r),await this.importPgParameters(this.processGraph.getProcessParameters(!0),"user",!1!==t.clear),await this.importNodes(this.processGraph.getStartNodes()),await this.importEdges(this.processGraph),!1!==t.perfectScale&&this.perfectScale(),this.$nextTick(()=>this.updateHiddenParameterRefEdges()),!0},t)},async importPgParameters(e,t,r=!0){if(!Array.isArray(e))return;return await this.startTransaction(async()=>{r&&(this.blocks=this.blocks.filter(e=>"parameter"!==e.type||e.origin!==t));let s=this.getBlockSize({}),a=[0,0];for(var i in e)a=[-s[0]-20,i*(s[1]+20)],await this.addPgParameter(e[i],t,a)},{undoOnError:!1,saveHistory:!1,propagate:!1})},async addPgParameter(e,t="user",r=null){return await this.startTransaction(async()=>{let s="$"+e.name;return!(this.blocks.findIndex(e=>"parameter"===e.type&&e.id==s)>=0)&&(void 0===(e=i.a.deepClone(e)).schema&&(e.schema={}),this.blocks.push(y.a.observable({id:s,type:"parameter",origin:t,position:i.a.ensurePoint(r,()=>this.getNewBlockDefaultPosition(this.getBlockSize({}))),spec:Object.freeze(e)})),!0)})},getPgParameters(){return this.blocks.filter(e=>"parameter"===e.type)},getPgParameterById(e){return this.blocks.find(t=>"parameter"===t.type&&t.id===e)},async importEdges(e){var t=e.getNodes();return Promise.all(Object.values(t).map(e=>this.importEdgesForNode(e)))},async importEdgesForNode(e){var t=e.getArgumentNames();for(let r in t){let s=t[r],a=e.getRawArgument(s),i="#"+e.id;switch(e.getArgumentType(s)){case"result":await this.addEdgeByNames("#"+a.from_node,"output",i,s,!1);break;case"parameter":await this.addEdgeByNames("$"+a.from_parameter,"output",i,s,!1);break;case"object":case"array":await this.importEdgeDeep(a,i,s)}}},async importEdgeDeep(e,t,r){for(let s in e)if(e[s]&&"object"==typeof e[s]&&"process_graph"!==s)await this.importEdgeDeep(e[s],t,r);else{if(!i.a.isRef(e))continue;e.from_node?await this.addEdgeByNames("#"+e.from_node,"output",t,r,!1):e.from_parameter&&await this.addEdgeByNames("$"+e.from_parameter,"output",t,r,!1)}},async createEdgesForArguments(e,t){for(let r in t)await this.importEdgeDeep(t[r],e,r)},async importNodes(e,t=0,r=0,s=[]){let a=[],o=0;for(let n of e){if(s.includes(n.id)||void 0!==n.getPreviousNodes().find(e=>!s.includes(e.id))){r+=10;continue}let e="function"==typeof n.toJSON?n.toJSON():n;e.position=i.a.ensurePoint(e.position,()=>[t,r]);let l=this.addBlock(e,n.id);s.push(n.id);let c=this.getBlockSize(l);o=Math.max(o,e.position[0]+c[0]),r=e.position[1]+c[1]+20,a=a.concat(n.getNextNodes())}a.length&&await this.importNodes(a,o+20,0,s)},incrementId(e=null){"number"==typeof e||"string"==typeof e&&0!==e.length||(e=this.nextBlockId,this.nextBlockId++);let t=Number.parseInt(e,10);return Number.isNaN(t)||(this.nextBlockId=Math.max(this.nextBlockId,t+1)),e},perfectScale(){if(this.$refs.div&&0!==this.blocks.length){var e=null,t=null,r=null,s=null;for(let a of this.blocks){let o=this.getBlockSize(a),n=i.a.ensurePoint(a.position);null==e?(e=n[0]-15,t=n[0]+o[0]+15,r=n[1]-15,s=n[1]+o[1]+15):(e=Math.min(e,n[0]-15),t=Math.max(t,n[0]+o[0]+15),r=Math.min(r,n[1]-15),s=Math.max(s,n[1]+o[1]+15))}var a=this.$refs.div.getBoundingClientRect(),o=a.width/(t-e),n=a.height/(s-r);this.state.scale=Math.min(o,n,1.5),this.state.center=[a.width/2-this.state.scale*(e+t)/2,a.height/2-this.state.scale*(r+s)/2],this.newBlockOffset=0}},showParameterViewer(e,t,r,s,a,i,o){this.parameterViewer={parameters:e,values:t,title:r,selectParameterName:a,parent:o}}}};class S{constructor(e){Object.assign(this,e)}}var x=E,k=(r(456),Object(n.a)(x,(function(){var e=this,t=e._self._c;return t("div",{ref:"div",class:e.classes,style:e.style,attrs:{id:e.id,tabindex:"0"},on:{mousemove:e.onMouseMove,mousedown:e.onMouseDown,wheel:e.onMouseWheel,keydown:e.onKeyDown,focus:function(t){e.hasFocus=!0},blur:function(t){e.hasFocus=!1}}},[t("svg",{staticClass:"canvas",attrs:{xmlns:"http://www.w3.org/2000/svg",version:"1.1"}},[e._l(e.edges,(function(r){return t("Edge",{key:r.id,attrs:{id:r.id,parameter1:r.parameter1,parameter2:r.parameter2,selected:r.selected,inactive:r.inactive,issues:r.issues,state:e.state},on:{mounted:t=>e.mount(r,t),unmounted:()=>e.mount(r),position:function(t){return e.updateEdgePos(r,arguments)}}})})),e._v(" "),e._l(e.hiddenParameterRefEdges,(function(r){return t("Edge",{key:r.id,attrs:{id:r.id,parameter1:r.parameter1,parameter2:r.parameter2,inactive:!0,lineColor:[200,200,200,1],lineWidth:2,state:e.state},on:{mounted:t=>e.mount(r,t),unmounted:()=>e.mount(r)}})})),e._v(" "),e.linkingLine?t("line",e._b({},"line",e.linkingLine,!1)):e._e(),e._v(" "),e.selectRect?t("rect",e._b({},"rect",e.selectRect,!1)):e._e()],2),e._v(" "),t("div",{staticClass:"blocks"},e._l(e.blocks,(function(r){return t("Block",{key:r.id,attrs:{id:r.id,type:r.type,spec:r.spec,state:e.state,selected:r.selected,position:r.position,origin:r.origin,process_id:r.process_id,namespace:r.namespace,result:r.result,args:r.arguments,description:r.description},on:{update:(...t)=>e.updateBlock(r,...t),mounted:t=>e.mount(r,t),unmounted:()=>e.mount(r),move:e.startDragBlock}})})),1),e._v(" "),e.state.scale<.7||e.showZoomInfo?t("div",{staticClass:"zoomInfo"},[e.state.scale<.7?t("div",[e._v("\n Zoom in for more details.\n ")]):e._e(),e._v(" "),e.showZoomInfo?t("div",[e._v("\n Zoom with "),t("kbd",[e._v("STRG")]),e._v(" or "),t("kbd",[e._v("Meta")]),e._v(" key and the mouse wheel.\n ")]):e._e()]):e._e(),e._v(" "),e.parameterViewer?t("ParameterViewer",e._b({on:{close:function(t){e.parameterViewer=null}}},"ParameterViewer",e.parameterViewer,!1)):e._e()],1)}),[],!1,null,null,null));t.default=k.exports}}]); \ No newline at end of file +!function(e){"use strict";function t(){for(var e=arguments.length,t=Array(e),r=0;r1){t[0]=t[0].slice(0,-1);for(var s=t.length-1,a=1;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},m=Math.floor,f=String.fromCharCode;function y(e){throw new RangeError(d[e])}function v(e,t){var r=e.split("@"),s="";r.length>1&&(s=r[0]+"@",e=r[1]);var a=function(e,t){for(var r=[],s=e.length;s--;)r[s]=t(e[s]);return r}((e=e.replace(u,".")).split("."),t).join(".");return s+a}function g(e){for(var t=[],r=0,s=e.length;r=55296&&a<=56319&&r>1,e+=m(e/t);e>455;s+=36)e=m(e/35);return m(s+36*e/(e+38))},w=function(e){var t,r=[],s=e.length,a=0,i=128,o=72,n=e.lastIndexOf("-");n<0&&(n=0);for(var l=0;l=128&&y("not-basic"),r.push(e.charCodeAt(l));for(var p=n>0?n+1:0;p=s&&y("invalid-input");var f=(t=e.charCodeAt(p++))-48<10?t-22:t-65<26?t-65:t-97<26?t-97:36;(f>=36||f>m((c-a)/u))&&y("overflow"),a+=f*u;var v=d<=o?1:d>=o+26?26:d-o;if(fm(c/g)&&y("overflow"),u*=g}var b=r.length+1;o=P(a-h,b,0==h),m(a/b)>c-i&&y("overflow"),i+=m(a/b),a%=b,r.splice(a++,0,i)}return String.fromCodePoint.apply(String,r)},E=function(e){var t=[],r=(e=g(e)).length,s=128,a=0,i=72,o=!0,n=!1,l=void 0;try{for(var p,h=e[Symbol.iterator]();!(o=(p=h.next()).done);o=!0){var u=p.value;u<128&&t.push(f(u))}}catch(e){n=!0,l=e}finally{try{!o&&h.return&&h.return()}finally{if(n)throw l}}var d=t.length,v=d;for(d&&t.push("-");v=s&&Om((c-a)/j)&&y("overflow"),a+=(w-s)*j,s=w;var $=!0,R=!1,I=void 0;try{for(var F,D=e[Symbol.iterator]();!($=(F=D.next()).done);$=!0){var A=F.value;if(Ac&&y("overflow"),A==s){for(var N=a,C=36;;C+=36){var T=C<=i?1:C>=i+26?26:C-i;if(N>6|192).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase():"%"+(t>>12|224).toString(16).toUpperCase()+"%"+(t>>6&63|128).toString(16).toUpperCase()+"%"+(63&t|128).toString(16).toUpperCase()}function O(e){for(var t="",r=0,s=e.length;r=194&&a<224){if(s-r>=6){var i=parseInt(e.substr(r+4,2),16);t+=String.fromCharCode((31&a)<<6|63&i)}else t+=e.substr(r,6);r+=6}else if(a>=224){if(s-r>=9){var o=parseInt(e.substr(r+4,2),16),n=parseInt(e.substr(r+7,2),16);t+=String.fromCharCode((15&a)<<12|(63&o)<<6|63&n)}else t+=e.substr(r,9);r+=9}else t+=e.substr(r,3),r+=3}return t}function j(e,t){function r(e){var r=O(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,"")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,_).replace(t.PCT_ENCODED,a)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,_).replace(t.PCT_ENCODED,a)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,_).replace(t.PCT_ENCODED,a)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,_).replace(t.PCT_ENCODED,a)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,_).replace(t.PCT_ENCODED,a)),e}function $(e){return e.replace(/^0*(.*)/,"$1")||"0"}function R(e,t){var r=e.match(t.IPV4ADDRESS)||[],s=l(r,2)[1];return s?s.split(".").map($).join("."):e}function I(e,t){var r=e.match(t.IPV6ADDRESS)||[],s=l(r,3),a=s[1],i=s[2];if(a){for(var o=a.toLowerCase().split("::").reverse(),n=l(o,2),c=n[0],p=n[1],h=p?p.split(":").map($):[],u=c.split(":").map($),d=t.IPV4ADDRESS.test(u[u.length-1]),m=d?7:8,f=u.length-m,y=Array(m),v=0;v1){var P=y.slice(0,g.index),w=y.slice(g.index+g.length);b=P.join(":")+"::"+w.join(":")}else b=y.join(":");return i&&(b+="%"+i),b}return e}var F=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,D=void 0==="".match(/(){0}/)[1];function A(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={},s=!1!==t.iri?n:o;"suffix"===t.reference&&(e=(t.scheme?t.scheme+":":"")+"//"+e);var a=e.match(F);if(a){D?(r.scheme=a[1],r.userinfo=a[3],r.host=a[4],r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=a[7],r.fragment=a[8],isNaN(r.port)&&(r.port=a[5])):(r.scheme=a[1]||void 0,r.userinfo=-1!==e.indexOf("@")?a[3]:void 0,r.host=-1!==e.indexOf("//")?a[4]:void 0,r.port=parseInt(a[5],10),r.path=a[6]||"",r.query=-1!==e.indexOf("?")?a[7]:void 0,r.fragment=-1!==e.indexOf("#")?a[8]:void 0,isNaN(r.port)&&(r.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?a[4]:void 0)),r.host&&(r.host=I(R(r.host,s),s)),void 0!==r.scheme||void 0!==r.userinfo||void 0!==r.host||void 0!==r.port||r.path||void 0!==r.query?void 0===r.scheme?r.reference="relative":void 0===r.fragment?r.reference="absolute":r.reference="uri":r.reference="same-document",t.reference&&"suffix"!==t.reference&&t.reference!==r.reference&&(r.error=r.error||"URI is not a "+t.reference+" reference.");var i=k[(t.scheme||r.scheme||"").toLowerCase()];if(t.unicodeSupport||i&&i.unicodeSupport)j(r,s);else{if(r.host&&(t.domainHost||i&&i.domainHost))try{r.host=S(r.host.replace(s.PCT_ENCODED,O).toLowerCase())}catch(e){r.error=r.error||"Host's domain name can not be converted to ASCII via punycode: "+e}j(r,o)}i&&i.parse&&i.parse(r,t)}else r.error=r.error||"URI can not be parsed.";return r}function N(e,t){var r=!1!==t.iri?n:o,s=[];return void 0!==e.userinfo&&(s.push(e.userinfo),s.push("@")),void 0!==e.host&&s.push(I(R(String(e.host),r),r).replace(r.IPV6ADDRESS,(function(e,t,r){return"["+t+(r?"%25"+r:"")+"]"}))),"number"!=typeof e.port&&"string"!=typeof e.port||(s.push(":"),s.push(String(e.port))),s.length?s.join(""):void 0}var C=/^\.\.?\//,T=/^\/\.(\/|$)/,M=/^\/\.\.(\/|$)/,L=/^\/?(?:.|\n)*?(?=\/|$)/;function q(e){for(var t=[];e.length;)if(e.match(C))e=e.replace(C,"");else if(e.match(T))e=e.replace(T,"/");else if(e.match(M))e=e.replace(M,"/"),t.pop();else if("."===e||".."===e)e="";else{var r=e.match(L);if(!r)throw new Error("Unexpected dot segment condition");var s=r[0];e=e.slice(s.length),t.push(s)}return t.join("")}function V(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.iri?n:o,s=[],a=k[(t.scheme||e.scheme||"").toLowerCase()];if(a&&a.serialize&&a.serialize(e,t),e.host)if(r.IPV6ADDRESS.test(e.host));else if(t.domainHost||a&&a.domainHost)try{e.host=t.iri?x(e.host):S(e.host.replace(r.PCT_ENCODED,O).toLowerCase())}catch(r){e.error=e.error||"Host's domain name can not be converted to "+(t.iri?"Unicode":"ASCII")+" via punycode: "+r}j(e,r),"suffix"!==t.reference&&e.scheme&&(s.push(e.scheme),s.push(":"));var i=N(e,t);if(void 0!==i&&("suffix"!==t.reference&&s.push("//"),s.push(i),e.path&&"/"!==e.path.charAt(0)&&s.push("/")),void 0!==e.path){var l=e.path;t.absolutePath||a&&a.absolutePath||(l=q(l)),void 0===i&&(l=l.replace(/^\/\//,"/%2F")),s.push(l)}return void 0!==e.query&&(s.push("?"),s.push(e.query)),void 0!==e.fragment&&(s.push("#"),s.push(e.fragment)),s.join("")}function B(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=arguments[3],a={};return s||(e=A(V(e,r),r),t=A(V(t,r),r)),!(r=r||{}).tolerant&&t.scheme?(a.scheme=t.scheme,a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=q(t.path||""),a.query=t.query):(void 0!==t.userinfo||void 0!==t.host||void 0!==t.port?(a.userinfo=t.userinfo,a.host=t.host,a.port=t.port,a.path=q(t.path||""),a.query=t.query):(t.path?("/"===t.path.charAt(0)?a.path=q(t.path):(void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?a.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+t.path:a.path=t.path:a.path="/"+t.path,a.path=q(a.path)),a.query=t.query):(a.path=e.path,void 0!==t.query?a.query=t.query:a.query=e.query),a.userinfo=e.userinfo,a.host=e.host,a.port=e.port),a.scheme=e.scheme),a.fragment=t.fragment,a}function z(e,t){return e&&e.toString().replace(t&&t.iri?n.PCT_ENCODED:o.PCT_ENCODED,O)}var G={scheme:"http",domainHost:!0,parse:function(e,t){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e,t){var r="https"===String(e.scheme).toLowerCase();return e.port!==(r?443:80)&&""!==e.port||(e.port=void 0),e.path||(e.path="/"),e}},J={scheme:"https",domainHost:G.domainHost,parse:G.parse,serialize:G.serialize};function U(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}var Q={scheme:"ws",domainHost:!0,parse:function(e,t){var r=e;return r.secure=U(r),r.resourceName=(r.path||"/")+(r.query?"?"+r.query:""),r.path=void 0,r.query=void 0,r},serialize:function(e,t){if(e.port!==(U(e)?443:80)&&""!==e.port||(e.port=void 0),"boolean"==typeof e.secure&&(e.scheme=e.secure?"wss":"ws",e.secure=void 0),e.resourceName){var r=e.resourceName.split("?"),s=l(r,2),a=s[0],i=s[1];e.path=a&&"/"!==a?a:void 0,e.query=i,e.resourceName=void 0}return e.fragment=void 0,e}},K={scheme:"wss",domainHost:Q.domainHost,parse:Q.parse,serialize:Q.serialize},H={},Z="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",W="[0-9A-Fa-f]",Y=r(r("%[EFef]"+W+"%"+W+W+"%"+W+W)+"|"+r("%[89A-Fa-f]"+W+"%"+W+W)+"|"+r("%"+W+W)),X=t("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]'),ee=new RegExp(Z,"g"),te=new RegExp(Y,"g"),re=new RegExp(t("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',X),"g"),se=new RegExp(t("[^]",Z,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),ae=se;function ie(e){var t=O(e);return t.match(ee)?t:e}var oe={scheme:"mailto",parse:function(e,t){var r=e,s=r.to=r.path?r.path.split(","):[];if(r.path=void 0,r.query){for(var a=!1,i={},o=r.query.split("&"),n=0,l=o.length;n=55296&&t<=56319&&a%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,p=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,u=/^(?:\/(?:[^~/]|~0|~1)*)*$/,d=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,m=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function f(e){return e="full"==e?"full":"fast",s.copy(f[e])}function y(e){var t=e.match(a);if(!t)return!1;var r=+t[1],s=+t[2],o=+t[3];return s>=1&&s<=12&&o>=1&&o<=(2==s&&function(e){return e%4==0&&(e%100!=0||e%400==0)}(r)?29:i[s])}function v(e,t){var r=e.match(o);if(!r)return!1;var s=r[1],a=r[2],i=r[3],n=r[5];return(s<=23&&a<=59&&i<=59||23==s&&59==a&&60==i)&&(!t||n)}e.exports=f,f.fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:p,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:n,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":u,"json-pointer-uri-fragment":d,"relative-json-pointer":m},f.full={date:y,time:v,"date-time":function(e){var t=e.split(g);return 2==t.length&&y(t[0])&&v(t[1],!0)},uri:function(e){return b.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:p,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:n,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":u,"json-pointer-uri-fragment":d,"relative-json-pointer":m};var g=/t|\s/i;var b=/\/|:/;var P=/[^\\]\\Z/;function w(e){if(P.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},415:function(e,t,r){"use strict";var s=r(416),a=r(178).toHash;e.exports=function(){var e=[{type:"number",rules:[{maximum:["exclusiveMaximum"]},{minimum:["exclusiveMinimum"]},"multipleOf","format"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","items","contains","uniqueItems"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","propertyNames",{properties:["additionalProperties","patternProperties"]}]},{rules:["$ref","const","enum","not","anyOf","oneOf","allOf","if"]}],t=["type","$comment"];return e.all=a(t),e.types=a(["number","integer","string","array","object","boolean","null"]),e.forEach((function(r){r.rules=r.rules.map((function(r){var a;if("object"==typeof r){var i=Object.keys(r)[0];a=r[i],r=i,a.forEach((function(r){t.push(r),e.all[r]=!0}))}return t.push(r),e.all[r]={keyword:r,code:s[r],implements:a}})),e.all.$comment={keyword:"$comment",code:s.$comment},r.type&&(e.types[r.type]=r)})),e.keywords=a(t.concat(["$schema","$id","id","$data","$async","title","description","default","definitions","examples","readOnly","writeOnly","contentMediaType","contentEncoding","additionalItems","then","else"])),e.custom={},e}},416:function(e,t,r){"use strict";e.exports={$ref:r(417),allOf:r(418),anyOf:r(419),$comment:r(420),const:r(421),contains:r(422),dependencies:r(423),enum:r(424),format:r(425),if:r(426),items:r(427),maximum:r(275),minimum:r(275),maxItems:r(276),minItems:r(276),maxLength:r(277),minLength:r(277),maxProperties:r(278),minProperties:r(278),multipleOf:r(428),not:r(429),oneOf:r(430),pattern:r(431),properties:r(432),propertyNames:r(433),required:r(434),uniqueItems:r(435),validate:r(274)}},417:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a,i=" ",o=e.level,n=e.dataLevel,l=e.schema[t],c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(n||""),u="valid"+o;if("#"==l||"#/"==l)e.isRoot?(s=e.async,a="validate"):(s=!0===e.root.schema.$async,a="root.refVal[0]");else{var d=e.resolveRef(e.baseId,l,e.isRoot);if(void 0===d){var m=e.MissingRefError.message(e.baseId,l);if("fail"==e.opts.missingRefs){e.logger.error(m),(g=g||[]).push(i),i="",!1!==e.createErrors?(i+=" { keyword: '$ref' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { ref: '"+e.util.escapeQuotes(l)+"' } ",!1!==e.opts.messages&&(i+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(l)+"' "),e.opts.verbose&&(i+=" , schema: "+e.util.toQuotedString(l)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),i+=" } "):i+=" {} ";var f=i;i=g.pop(),!e.compositeRule&&p?e.async?i+=" throw new ValidationError(["+f+"]); ":i+=" validate.errors = ["+f+"]; return false; ":i+=" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",p&&(i+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs)throw new e.MissingRefError(e.baseId,l,m);e.logger.warn(m),p&&(i+=" if (true) { ")}}else if(d.inline){var y=e.util.copy(e);y.level++;var v="valid"+y.level;y.schema=d.schema,y.schemaPath="",y.errSchemaPath=l,i+=" "+e.validate(y).replace(/validate\.schema/g,d.code)+" ",p&&(i+=" if ("+v+") { ")}else s=!0===d.$async||e.async&&!1!==d.$async,a=d.code}if(a){var g;(g=g||[]).push(i),i="",e.opts.passContext?i+=" "+a+".call(this, ":i+=" "+a+"( ",i+=" "+h+", (dataPath || '')",'""'!=e.errorPath&&(i+=" + "+e.errorPath);var b=i+=" , "+(n?"data"+(n-1||""):"parentData")+" , "+(n?e.dataPathArr[n]:"parentDataProperty")+", rootData) ";if(i=g.pop(),s){if(!e.async)throw new Error("async schema referenced by sync schema");p&&(i+=" var "+u+"; "),i+=" try { await "+b+"; ",p&&(i+=" "+u+" = true; "),i+=" } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ",p&&(i+=" "+u+" = false; "),i+=" } ",p&&(i+=" if ("+u+") { ")}else i+=" if (!"+b+") { if (vErrors === null) vErrors = "+a+".errors; else vErrors = vErrors.concat("+a+".errors); errors = vErrors.length; } ",p&&(i+=" else { ")}return i}},418:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.schema[t],i=e.schemaPath+e.util.getProperty(t),o=e.errSchemaPath+"/"+t,n=!e.opts.allErrors,l=e.util.copy(e),c="";l.level++;var p="valid"+l.level,h=l.baseId,u=!0,d=a;if(d)for(var m,f=-1,y=d.length-1;f0||!1===m:e.util.schemaHasRules(m,e.RULES.all))&&(u=!1,l.schema=m,l.schemaPath=i+"["+f+"]",l.errSchemaPath=o+"/"+f,s+=" "+e.validate(l)+" ",l.baseId=h,n&&(s+=" if ("+p+") { ",c+="}"));return n&&(s+=u?" if (true) { ":" "+c.slice(0,-1)+" "),s}},419:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e),m="";d.level++;var f="valid"+d.level;if(o.every((function(t){return e.opts.strictKeywords?"object"==typeof t&&Object.keys(t).length>0||!1===t:e.util.schemaHasRules(t,e.RULES.all)}))){var y=d.baseId;s+=" var "+u+" = errors; var "+h+" = false; ";var v=e.compositeRule;e.compositeRule=d.compositeRule=!0;var g=o;if(g)for(var b,P=-1,w=g.length-1;P0||!1===o:e.util.schemaHasRules(o,e.RULES.all);if(s+="var "+u+" = errors;var "+h+";",b){var P=e.compositeRule;e.compositeRule=d.compositeRule=!0,d.schema=o,d.schemaPath=n,d.errSchemaPath=l,s+=" var "+m+" = false; for (var "+f+" = 0; "+f+" < "+p+".length; "+f+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,f,e.opts.jsonPointers,!0);var w=p+"["+f+"]";d.dataPathArr[y]=f;var E=e.validate(d);d.baseId=g,e.util.varOccurences(E,v)<2?s+=" "+e.util.varReplace(E,v,w)+" ":s+=" var "+v+" = "+w+"; "+E+" ",s+=" if ("+m+") break; } ",e.compositeRule=d.compositeRule=P,s+=" if (!"+m+") {"}else s+=" if ("+p+".length == 0) {";var S=S||[];S.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'contains' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(s+=" , message: 'should contain a valid item' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var x=s;return s=S.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+x+"]); ":s+=" validate.errors = ["+x+"]; return false; ":s+=" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } else { ",b&&(s+=" errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; } "),e.opts.allErrors&&(s+=" } "),s}},423:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e),d="";u.level++;var m="valid"+u.level,f={},y={},v=e.opts.ownProperties;for(w in o)if("__proto__"!=w){var g=o[w],b=Array.isArray(g)?y:f;b[w]=g}s+="var "+h+" = errors;";var P=e.errorPath;for(var w in s+="var missing"+a+";",y)if((b=y[w]).length){if(s+=" if ( "+p+e.util.getProperty(w)+" !== undefined ",v&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(w)+"') "),c){s+=" && ( ";var E=b;if(E)for(var S=-1,x=E.length-1;S0||!1===g:e.util.schemaHasRules(g,e.RULES.all))&&(s+=" "+m+" = true; if ( "+p+e.util.getProperty(w)+" !== undefined ",v&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(w)+"') "),s+=") { ",u.schema=g,u.schemaPath=n+e.util.getProperty(w),u.errSchemaPath=l+"/"+e.util.escapeFragment(w),s+=" "+e.validate(u)+" ",u.baseId=N,s+=" } ",c&&(s+=" if ("+m+") { ",d+="}"))}return c&&(s+=" "+d+" if ("+h+" == errors) {"),s}},424:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u=e.opts.$data&&o&&o.$data;u&&(s+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ");var d="i"+a,m="schema"+a;u||(s+=" var "+m+" = validate.schema"+n+";"),s+="var "+h+";",u&&(s+=" if (schema"+a+" === undefined) "+h+" = true; else if (!Array.isArray(schema"+a+")) "+h+" = false; else {"),s+=h+" = false;for (var "+d+"=0; "+d+"<"+m+".length; "+d+"++) if (equal("+p+", "+m+"["+d+"])) { "+h+" = true; break; }",u&&(s+=" } "),s+=" if (!"+h+") { ";var f=f||[];f.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'enum' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { allowedValues: schema"+a+" } ",!1!==e.opts.messages&&(s+=" , message: 'should be equal to one of the allowed values' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var y=s;return s=f.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+y+"]); ":s+=" validate.errors = ["+y+"]; return false; ":s+=" var err = "+y+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" }",c&&(s+=" else { "),s}},425:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||"");if(!1===e.opts.format)return c&&(s+=" if (true) { "),s;var h,u=e.opts.$data&&o&&o.$data;u?(s+=" var schema"+a+" = "+e.util.getData(o.$data,i,e.dataPathArr)+"; ",h="schema"+a):h=o;var d=e.opts.unknownFormats,m=Array.isArray(d);if(u){s+=" var "+(f="format"+a)+" = formats["+h+"]; var "+(y="isObject"+a)+" = typeof "+f+" == 'object' && !("+f+" instanceof RegExp) && "+f+".validate; var "+(v="formatType"+a)+" = "+y+" && "+f+".type || 'string'; if ("+y+") { ",e.async&&(s+=" var async"+a+" = "+f+".async; "),s+=" "+f+" = "+f+".validate; } if ( ",u&&(s+=" ("+h+" !== undefined && typeof "+h+" != 'string') || "),s+=" (","ignore"!=d&&(s+=" ("+h+" && !"+f+" ",m&&(s+=" && self._opts.unknownFormats.indexOf("+h+") == -1 "),s+=") || "),s+=" ("+f+" && "+v+" == '"+r+"' && !(typeof "+f+" == 'function' ? ",e.async?s+=" (async"+a+" ? await "+f+"("+p+") : "+f+"("+p+")) ":s+=" "+f+"("+p+") ",s+=" : "+f+".test("+p+"))))) {"}else{var f;if(!(f=e.formats[o])){if("ignore"==d)return e.logger.warn('unknown format "'+o+'" ignored in schema at path "'+e.errSchemaPath+'"'),c&&(s+=" if (true) { "),s;if(m&&d.indexOf(o)>=0)return c&&(s+=" if (true) { "),s;throw new Error('unknown format "'+o+'" is used in schema at path "'+e.errSchemaPath+'"')}var y,v=(y="object"==typeof f&&!(f instanceof RegExp)&&f.validate)&&f.type||"string";if(y){var g=!0===f.async;f=f.validate}if(v!=r)return c&&(s+=" if (true) { "),s;if(g){if(!e.async)throw new Error("async format in sync schema");s+=" if (!(await "+(b="formats"+e.util.getProperty(o)+".validate")+"("+p+"))) { "}else{s+=" if (! ";var b="formats"+e.util.getProperty(o);y&&(b+=".validate"),s+="function"==typeof f?" "+b+"("+p+") ":" "+b+".test("+p+") ",s+=") { "}}var P=P||[];P.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { format: ",s+=u?""+h:""+e.util.toQuotedString(o),s+=" } ",!1!==e.opts.messages&&(s+=" , message: 'should match format \"",s+=u?"' + "+h+" + '":""+e.util.escapeQuotes(o),s+="\"' "),e.opts.verbose&&(s+=" , schema: ",s+=u?"validate.schema"+n:""+e.util.toQuotedString(o),s+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var w=s;return s=P.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+w+"]); ":s+=" validate.errors = ["+w+"]; return false; ":s+=" var err = "+w+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } ",c&&(s+=" else { "),s}},426:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e);d.level++;var m="valid"+d.level,f=e.schema.then,y=e.schema.else,v=void 0!==f&&(e.opts.strictKeywords?"object"==typeof f&&Object.keys(f).length>0||!1===f:e.util.schemaHasRules(f,e.RULES.all)),g=void 0!==y&&(e.opts.strictKeywords?"object"==typeof y&&Object.keys(y).length>0||!1===y:e.util.schemaHasRules(y,e.RULES.all)),b=d.baseId;if(v||g){var P;d.createErrors=!1,d.schema=o,d.schemaPath=n,d.errSchemaPath=l,s+=" var "+u+" = errors; var "+h+" = true; ";var w=e.compositeRule;e.compositeRule=d.compositeRule=!0,s+=" "+e.validate(d)+" ",d.baseId=b,d.createErrors=!0,s+=" errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; } ",e.compositeRule=d.compositeRule=w,v?(s+=" if ("+m+") { ",d.schema=e.schema.then,d.schemaPath=e.schemaPath+".then",d.errSchemaPath=e.errSchemaPath+"/then",s+=" "+e.validate(d)+" ",d.baseId=b,s+=" "+h+" = "+m+"; ",v&&g?s+=" var "+(P="ifClause"+a)+" = 'then'; ":P="'then'",s+=" } ",g&&(s+=" else { ")):s+=" if (!"+m+") { ",g&&(d.schema=e.schema.else,d.schemaPath=e.schemaPath+".else",d.errSchemaPath=e.errSchemaPath+"/else",s+=" "+e.validate(d)+" ",d.baseId=b,s+=" "+h+" = "+m+"; ",v&&g?s+=" var "+(P="ifClause"+a)+" = 'else'; ":P="'else'",s+=" } "),s+=" if (!"+h+") { var err = ",!1!==e.createErrors?(s+=" { keyword: 'if' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { failingKeyword: "+P+" } ",!1!==e.opts.messages&&(s+=" , message: 'should match \"' + "+P+" + '\" schema' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ",s+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?s+=" throw new ValidationError(vErrors); ":s+=" validate.errors = vErrors; return false; "),s+=" } ",c&&(s+=" else { ")}else c&&(s+=" if (true) { ");return s}},427:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e),m="";d.level++;var f="valid"+d.level,y="i"+a,v=d.dataLevel=e.dataLevel+1,g="data"+v,b=e.baseId;if(s+="var "+u+" = errors;var "+h+";",Array.isArray(o)){var P=e.schema.additionalItems;if(!1===P){s+=" "+h+" = "+p+".length <= "+o.length+"; ";var w=l;l=e.errSchemaPath+"/additionalItems",s+=" if (!"+h+") { ";var E=E||[];E.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { limit: "+o.length+" } ",!1!==e.opts.messages&&(s+=" , message: 'should NOT have more than "+o.length+" items' "),e.opts.verbose&&(s+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var S=s;s=E.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+S+"]); ":s+=" validate.errors = ["+S+"]; return false; ":s+=" var err = "+S+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } ",l=w,c&&(m+="}",s+=" else { ")}var x=o;if(x)for(var k,_=-1,O=x.length-1;_0||!1===k:e.util.schemaHasRules(k,e.RULES.all)){s+=" "+f+" = true; if ("+p+".length > "+_+") { ";var j=p+"["+_+"]";d.schema=k,d.schemaPath=n+"["+_+"]",d.errSchemaPath=l+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_;var $=e.validate(d);d.baseId=b,e.util.varOccurences($,g)<2?s+=" "+e.util.varReplace($,g,j)+" ":s+=" var "+g+" = "+j+"; "+$+" ",s+=" } ",c&&(s+=" if ("+f+") { ",m+="}")}if("object"==typeof P&&(e.opts.strictKeywords?"object"==typeof P&&Object.keys(P).length>0||!1===P:e.util.schemaHasRules(P,e.RULES.all))){d.schema=P,d.schemaPath=e.schemaPath+".additionalItems",d.errSchemaPath=e.errSchemaPath+"/additionalItems",s+=" "+f+" = true; if ("+p+".length > "+o.length+") { for (var "+y+" = "+o.length+"; "+y+" < "+p+".length; "+y+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers,!0);j=p+"["+y+"]";d.dataPathArr[v]=y;$=e.validate(d);d.baseId=b,e.util.varOccurences($,g)<2?s+=" "+e.util.varReplace($,g,j)+" ":s+=" var "+g+" = "+j+"; "+$+" ",c&&(s+=" if (!"+f+") break; "),s+=" } } ",c&&(s+=" if ("+f+") { ",m+="}")}}else if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0||!1===o:e.util.schemaHasRules(o,e.RULES.all)){d.schema=o,d.schemaPath=n,d.errSchemaPath=l,s+=" for (var "+y+" = 0; "+y+" < "+p+".length; "+y+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers,!0);j=p+"["+y+"]";d.dataPathArr[v]=y;$=e.validate(d);d.baseId=b,e.util.varOccurences($,g)<2?s+=" "+e.util.varReplace($,g,j)+" ":s+=" var "+g+" = "+j+"; "+$+" ",c&&(s+=" if (!"+f+") break; "),s+=" }"}return c&&(s+=" "+m+" if ("+u+" == errors) {"),s}},428:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;if(u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,!u&&"number"!=typeof n)throw new Error(t+" must be number");a+="var division"+i+";if (",u&&(a+=" "+s+" !== undefined && ( typeof "+s+" != 'number' || "),a+=" (division"+i+" = "+h+" / "+s+", ",e.opts.multipleOfPrecision?a+=" Math.abs(Math.round(division"+i+") - division"+i+") > 1e-"+e.opts.multipleOfPrecision+" ":a+=" division"+i+" !== parseInt(division"+i+") ",a+=" ) ",u&&(a+=" ) "),a+=" ) { ";var d=d||[];d.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { multipleOf: "+s+" } ",!1!==e.opts.messages&&(a+=" , message: 'should be multiple of ",a+=u?"' + "+s:s+"'"),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var m=a;return a=d.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},429:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e);u.level++;var d="valid"+u.level;if(e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0||!1===o:e.util.schemaHasRules(o,e.RULES.all)){u.schema=o,u.schemaPath=n,u.errSchemaPath=l,s+=" var "+h+" = errors; ";var m,f=e.compositeRule;e.compositeRule=u.compositeRule=!0,u.createErrors=!1,u.opts.allErrors&&(m=u.opts.allErrors,u.opts.allErrors=!1),s+=" "+e.validate(u)+" ",u.createErrors=!0,m&&(u.opts.allErrors=m),e.compositeRule=u.compositeRule=f,s+=" if ("+d+") { ";var y=y||[];y.push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(s+=" , message: 'should NOT be valid' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var v=s;s=y.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+v+"]); ":s+=" validate.errors = ["+v+"]; return false; ":s+=" var err = "+v+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } else { errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } ",e.opts.allErrors&&(s+=" } ")}else s+=" var err = ",!1!==e.createErrors?(s+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(s+=" , message: 'should NOT be valid' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ",s+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c&&(s+=" if (false) { ");return s}},430:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="valid"+a,u="errs__"+a,d=e.util.copy(e),m="";d.level++;var f="valid"+d.level,y=d.baseId,v="prevValid"+a,g="passingSchemas"+a;s+="var "+u+" = errors , "+v+" = false , "+h+" = false , "+g+" = null; ";var b=e.compositeRule;e.compositeRule=d.compositeRule=!0;var P=o;if(P)for(var w,E=-1,S=P.length-1;E0||!1===w:e.util.schemaHasRules(w,e.RULES.all))?(d.schema=w,d.schemaPath=n+"["+E+"]",d.errSchemaPath=l+"/"+E,s+=" "+e.validate(d)+" ",d.baseId=y):s+=" var "+f+" = true; ",E&&(s+=" if ("+f+" && "+v+") { "+h+" = false; "+g+" = ["+g+", "+E+"]; } else { ",m+="}"),s+=" if ("+f+") { "+h+" = "+v+" = true; "+g+" = "+E+"; }";return e.compositeRule=d.compositeRule=b,s+=m+"if (!"+h+") { var err = ",!1!==e.createErrors?(s+=" { keyword: 'oneOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { passingSchemas: "+g+" } ",!1!==e.opts.messages&&(s+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ",s+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(e.async?s+=" throw new ValidationError(vErrors); ":s+=" validate.errors = vErrors; return false; "),s+="} else { errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; }",e.opts.allErrors&&(s+=" } "),s}},431:function(e,t,r){"use strict";e.exports=function(e,t,r){var s,a=" ",i=e.level,o=e.dataLevel,n=e.schema[t],l=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,p=!e.opts.allErrors,h="data"+(o||""),u=e.opts.$data&&n&&n.$data;u?(a+=" var schema"+i+" = "+e.util.getData(n.$data,o,e.dataPathArr)+"; ",s="schema"+i):s=n,a+="if ( ",u&&(a+=" ("+s+" !== undefined && typeof "+s+" != 'string') || "),a+=" !"+(u?"(new RegExp("+s+"))":e.usePattern(n))+".test("+h+") ) { ";var d=d||[];d.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'pattern' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { pattern: ",a+=u?""+s:""+e.util.toQuotedString(n),a+=" } ",!1!==e.opts.messages&&(a+=" , message: 'should match pattern \"",a+=u?"' + "+s+" + '":""+e.util.escapeQuotes(n),a+="\"' "),e.opts.verbose&&(a+=" , schema: ",a+=u?"validate.schema"+l:""+e.util.toQuotedString(n),a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var m=a;return a=d.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+m+"]); ":a+=" validate.errors = ["+m+"]; return false; ":a+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",p&&(a+=" else { "),a}},432:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e),d="";u.level++;var m="valid"+u.level,f="key"+a,y="idx"+a,v=u.dataLevel=e.dataLevel+1,g="data"+v,b="dataProperties"+a,P=Object.keys(o||{}).filter(D),w=e.schema.patternProperties||{},E=Object.keys(w).filter(D),S=e.schema.additionalProperties,x=P.length||E.length,k=!1===S,_="object"==typeof S&&Object.keys(S).length,O=e.opts.removeAdditional,j=k||_||O,$=e.opts.ownProperties,R=e.baseId,I=e.schema.required;if(I&&(!e.opts.$data||!I.$data)&&I.length8)s+=" || validate.schema"+n+".hasOwnProperty("+f+") ";else{var A=P;if(A)for(var N=-1,C=A.length-1;N0||!1===Y:e.util.schemaHasRules(Y,e.RULES.all)){var X=e.util.getProperty(H),ee=(J=p+X,Q&&void 0!==Y.default);u.schema=Y,u.schemaPath=n+X,u.errSchemaPath=l+"/"+e.util.escapeFragment(H),u.errorPath=e.util.getPath(e.errorPath,H,e.opts.jsonPointers),u.dataPathArr[v]=e.util.toQuotedString(H);U=e.validate(u);if(u.baseId=R,e.util.varOccurences(U,g)<2){U=e.util.varReplace(U,g,J);var te=J}else{te=g;s+=" var "+g+" = "+J+"; "}if(ee)s+=" "+U+" ";else{if(F&&F[H]){s+=" if ( "+te+" === undefined ",$&&(s+=" || ! Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(H)+"') "),s+=") { "+m+" = false; ";q=e.errorPath,B=l;var re,se=e.util.escapeQuotes(H);e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(q,H,e.opts.jsonPointers)),l=e.errSchemaPath+"/required",(re=re||[]).push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { missingProperty: '"+se+"' } ",!1!==e.opts.messages&&(s+=" , message: '",e.opts._errorDataPathProperty?s+="is a required property":s+="should have required property \\'"+se+"\\'",s+="' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";z=s;s=re.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+z+"]); ":s+=" validate.errors = ["+z+"]; return false; ":s+=" var err = "+z+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l=B,e.errorPath=q,s+=" } else { "}else c?(s+=" if ( "+te+" === undefined ",$&&(s+=" || ! Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(H)+"') "),s+=") { "+m+" = true; } else { "):(s+=" if ("+te+" !== undefined ",$&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", '"+e.util.escapeQuotes(H)+"') "),s+=" ) { ");s+=" "+U+" } "}}c&&(s+=" if ("+m+") { ",d+="}")}}if(E.length){var ae=E;if(ae)for(var ie,oe=-1,ne=ae.length-1;oe0||!1===Y:e.util.schemaHasRules(Y,e.RULES.all)){u.schema=Y,u.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(ie),u.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(ie),s+=$?" "+b+" = "+b+" || Object.keys("+p+"); for (var "+y+"=0; "+y+"<"+b+".length; "+y+"++) { var "+f+" = "+b+"["+y+"]; ":" for (var "+f+" in "+p+") { ",s+=" if ("+e.usePattern(ie)+".test("+f+")) { ",u.errorPath=e.util.getPathExpr(e.errorPath,f,e.opts.jsonPointers);J=p+"["+f+"]";u.dataPathArr[v]=f;U=e.validate(u);u.baseId=R,e.util.varOccurences(U,g)<2?s+=" "+e.util.varReplace(U,g,J)+" ":s+=" var "+g+" = "+J+"; "+U+" ",c&&(s+=" if (!"+m+") break; "),s+=" } ",c&&(s+=" else "+m+" = true; "),s+=" } ",c&&(s+=" if ("+m+") { ",d+="}")}}}return c&&(s+=" "+d+" if ("+h+" == errors) {"),s}},433:function(e,t,r){"use strict";e.exports=function(e,t,r){var s=" ",a=e.level,i=e.dataLevel,o=e.schema[t],n=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,p="data"+(i||""),h="errs__"+a,u=e.util.copy(e);u.level++;var d="valid"+u.level;if(s+="var "+h+" = errors;",e.opts.strictKeywords?"object"==typeof o&&Object.keys(o).length>0||!1===o:e.util.schemaHasRules(o,e.RULES.all)){u.schema=o,u.schemaPath=n,u.errSchemaPath=l;var m="key"+a,f="idx"+a,y="i"+a,v="' + "+m+" + '",g="data"+(u.dataLevel=e.dataLevel+1),b="dataProperties"+a,P=e.opts.ownProperties,w=e.baseId;P&&(s+=" var "+b+" = undefined; "),s+=P?" "+b+" = "+b+" || Object.keys("+p+"); for (var "+f+"=0; "+f+"<"+b+".length; "+f+"++) { var "+m+" = "+b+"["+f+"]; ":" for (var "+m+" in "+p+") { ",s+=" var startErrs"+a+" = errors; ";var E=m,S=e.compositeRule;e.compositeRule=u.compositeRule=!0;var x=e.validate(u);u.baseId=w,e.util.varOccurences(x,g)<2?s+=" "+e.util.varReplace(x,g,E)+" ":s+=" var "+g+" = "+E+"; "+x+" ",e.compositeRule=u.compositeRule=S,s+=" if (!"+d+") { for (var "+y+"=startErrs"+a+"; "+y+"0||!1===b:e.util.schemaHasRules(b,e.RULES.all))||(m[m.length]=y)}}else m=o;if(u||m.length){var P=e.errorPath,w=u||m.length>=e.opts.loopRequired,E=e.opts.ownProperties;if(c)if(s+=" var missing"+a+"; ",w){u||(s+=" var "+d+" = validate.schema"+n+"; ");var S="' + "+($="schema"+a+"["+(_="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),s+=" var "+h+" = true; ",u&&(s+=" if (schema"+a+" === undefined) "+h+" = true; else if (!Array.isArray(schema"+a+")) "+h+" = false; else {"),s+=" for (var "+_+" = 0; "+_+" < "+d+".length; "+_+"++) { "+h+" = "+p+"["+d+"["+_+"]] !== undefined ",E&&(s+=" && Object.prototype.hasOwnProperty.call("+p+", "+d+"["+_+"]) "),s+="; if (!"+h+") break; } ",u&&(s+=" } "),s+=" if (!"+h+") { ",(j=j||[]).push(s),s="",!1!==e.createErrors?(s+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { missingProperty: '"+S+"' } ",!1!==e.opts.messages&&(s+=" , message: '",e.opts._errorDataPathProperty?s+="is a required property":s+="should have required property \\'"+S+"\\'",s+="' "),e.opts.verbose&&(s+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),s+=" } "):s+=" {} ";var x=s;s=j.pop(),!e.compositeRule&&c?e.async?s+=" throw new ValidationError(["+x+"]); ":s+=" validate.errors = ["+x+"]; return false; ":s+=" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } else { "}else{s+=" if ( ";var k=m;if(k)for(var _=-1,O=k.length-1;_ 1) { ";var m=e.schema.items&&e.schema.items.type,f=Array.isArray(m);if(!m||"object"==m||"array"==m||f&&(m.indexOf("object")>=0||m.indexOf("array")>=0))a+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+h+"[i], "+h+"[j])) { "+u+" = false; break outer; } } } ";else{a+=" var itemIndices = {}, item; for (;i--;) { var item = "+h+"[i]; ";var y="checkDataType"+(f?"s":"");a+=" if ("+e.util[y](m,"item",e.opts.strictNumbers,!0)+") continue; ",f&&(a+=" if (typeof item == 'string') item = '\"' + item; "),a+=" if (typeof itemIndices[item] == 'number') { "+u+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "}a+=" } ",d&&(a+=" } "),a+=" if (!"+u+") { ";var v=v||[];v.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(a+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(a+=" , schema: ",a+=d?"validate.schema"+l:""+n,a+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),a+=" } "):a+=" {} ";var g=a;a=v.pop(),!e.compositeRule&&p?e.async?a+=" throw new ValidationError(["+g+"]); ":a+=" validate.errors = ["+g+"]; return false; ":a+=" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",p&&(a+=" else { ")}else p&&(a+=" if (true) { ");return a}},436:function(e,t,r){"use strict";var s=["multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","additionalItems","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","additionalProperties","enum","format","const"];e.exports=function(e,t){for(var r=0;ra&&ti}},449:function(e,t,r){"use strict";var s=r(450);e.exports=function(e,t,r,a,i,o,n,l){return s(i,o,n,l,e,t,r,a)}},450:function(e,t,r){"use strict";var s=r(451),a=r(452);e.exports=function(e,t,r,i,o,n,l,c){return!(!s(o,n,l,c,e,t)&&!s(o,n,l,c,r,i))||(a(e,t,r,i,o,n,o+l,n)||a(e,t,r,i,o+l,n,o+l,n+c)||a(e,t,r,i,o,n+c,o+l,n+c)||a(e,t,r,i,o,n,o,n+c))}},451:function(e,t,r){"use strict";e.exports=function(e,t,r,s,a,i){return a>=e&&a<=e+r&&i>=t&&i<=t+s}},452:function(e,t,r){"use strict";const s=r(453),a=r(454),i=r(455),o=r(284);e.exports=function(e,t,r,n,l,c,p,h,u,d){return u||d?function(e,t,r,o,n,l,c,p,h,u){if(h&&u)return a(s(e,t,r,o,h),s(n,l,c,p,u));if(h)return i(n,l,c,p,s(e,t,r,o,h));if(u)return i(e,t,r,o,s(n,l,c,p,h))}(e,t,r,n,l,c,p,h,u,d):o(e,t,r,n,l,c,p,h)}},453:function(e,t,r){"use strict";e.exports=function(e,t,r,s,a){const i=Math.atan2(s-t,r-e)-Math.PI/2,o=a/2,n=Math.cos(i)*o,l=Math.sin(i)*o;return[e-n,t-l,r-n,s-l,r+n,s+l,e+n,t+l]}},454:function(e,t,r){"use strict";e.exports=function(e,t){for(var r,s,a,i,o,n,l=e,c=t,p=[l,c],h=0;hs)&&(s=a);for(i=o=null,n=0;no)&&(o=a);if(sr!=e[o+1]>r&&t<(e[o]-e[i])*(r-e[i+1])/(e[o+1]-e[i+1])+e[i]&&(l=!l),o=i;if(l)return!0;for(i=0;i({edges:[]}),computed:{schemas(){return this.schema instanceof s.ProcessSchema?this.schema:new s.ProcessSchema(this.schema)},hasValue(){return void 0!==this.value},textListeners(){return this.allowsArgumentChange?{click:this.openEditorForArguments}:{}},circleListeners(){var e={};return this.state.editable&&(e.mousedown=e=>{1==e.which&&(this.state.root.link(this),e.preventDefault(),e.stopPropagation())},this.output&&(e.dblclick=e=>{1==e.which&&this.$emit("input",!0)}),e.mouseover=()=>this.state.linkFrom&&this.state.root.link(this),e.mouseout=()=>this.state.linkTo&&this.state.root.unlink(this)),e},classes(){let e=[this.output?"output":"input","connector","field_"+this.name,this.hasValue||this.optional||this.output||this.getEdgeCount()>0?"hasValue":"noValue"];return this.allowsArgumentChange&&e.push("editable"),e},unspecified(){return!this.$parent.invalid&&this.state.root.hasProcesses&&this.schemas.unspecified},circleClasses(){var e=["circle"];for(var t of(this.getEdgeCount()>0&&e.push("io_active"),this.edges))t.selected?e.push("io_selected"):t.issues.length>0&&e.push("io_issues");return this.state.linkFrom!=this&&this.state.linkTo!=this||e.push("io_selected"),e},displayValue(){var e=38-this.displayLabel.length,t=null;if(this.isEditable&&!this.state.compactMode&&!i.a.isRef(this.value)){let r=void 0!==this.value?this.value:this.default;void 0!==r&&(t=this.formatValue(r,e,!0))}return"string"==typeof t?0===t.length&&(t="Empty"):t="",t},displayLabel(){return this.output&&this.state.compactMode?"":"string"==typeof this.label&&(this.label.length>0||this.output)?this.label:this.name},isArrayType(){return"array"===this.schemas.nativeDataType()},isObjectType(){return"object"===this.schemas.nativeDataType()},isEditable(){return!this.output&&this.schemas.isEditable()},allowsArgumentChange(){return!this.output&&this.schemas.isEditable()},allowsMultipleInputs(){return this.isArrayType||this.isObjectType||"any"===this.schemas.nativeDataType()}},watch:{edges(){this.updateEdgeStatus(),this.$emit("edgesChanged",this.edges,this)},value:{immediate:!0,handler(){this.updateEdgeStatus()}}},methods:{updateEdgeStatus(){if(!this.output)for(var e of this.edges)e.inactive=!this.isEdgeUsed(e)},getCirclePosition(){try{var e=this.state.root.domBoundingBox(this.$refs.circle),t=this.state.root.getDimensions();return[e.offsetLeft-t.offsetLeft+e.width/2,e.offsetTop-t.offsetTop+e.height/2]}catch(e){return console.warn(e),null}},openEditorForArguments(){this.allowsArgumentChange&&this.$parent.showArguments(this.name)},jsonSchema(){return this.schemas.toJSON()},setValue(e){"boolean"!=this.schemas.nativeDataType()||i.a.isRef(e)||(e=!!e),this.$emit("input",e)},resetValue(){if(void 0===this.default){var e;if(this.schemas.nullable())e=null;else switch(this.schemas.nativeDataType()){case"object":e={};break;case"array":e=[];break;case"string":e="";break;case"integer":case"number":e=0;break;case"boolean":e=!1;break;default:e=void 0}this.setValue(e)}else this.setValue(this.default)},getEdgeRef(e){return this.output?this.value:e.parameter1.value},addRefToValue(e){var t=this.getEdgeRef(e);if(t)if(this.allowsMultipleInputs)if(this.isArrayType)if(i.a.isRef(this.value))this.setValue([this.value,t]);else if(Array.isArray(this.value)&&this.value.length>0){var r=this.value;r.push(t),this.setValue(r)}else this.setValue(t);else if(this.isObjectType){var s=i.a.size(this.value);1!==this.getEdgeCount()||this.hasValue&&s?s||this.resetValue():this.setValue(t)}else this.setValue(t);else this.setValue(t)},removeRefFromValue(e){if(!this.output){var t=this.getEdgeRef(e);i.a.isRefEqual(t,this.value)?this.resetValue():(this.isArrayType||this.isObjectType)&&this.setValue(this.removeRefFromValueDeep(this.value,t))}},removeRefFromValueDeep(e,t){if(Array.isArray(e))for(var r=e.length;--r>=0;)null!==e[r]&&"object"==typeof e[r]&&(i.a.isRefEqual(t,e[r])?e.splice(r,1):e[r]=this.removeRefFromValueDeep(e[r],t));else if(i.a.isObject(e))for(var s in e)e.hasOwnProperty(s)&&null!==e[s]&&"object"==typeof e[s]&&(i.a.isRefEqual(t,e[s])?delete e[s]:e[r]=this.removeRefFromValueDeep(e[s],t));return e},addEdge(e){this.edges.push(e),this.isEdgeUsed(e)||this.output||this.addRefToValue(e)},eraseEdge(e){for(var t in this.edges)if(this.edges[t]==e)return this.removeRefFromValue(e),this.$delete(this.edges,t),!0;return!1},isEdgeUsed(e){var t=this.getEdgeRef(e);return!!i.a.isRefEqual(t,this.value)||this.hasRefInValue(t,this.value)},hasRefInValue(e,t){if(!t||"object"!=typeof t)return!1;if(i.a.isRefEqual(e,t))return!0;for(let r in t)if(this.hasRefInValue(e,t[r]))return!0;return!1},getEdgeCount(){return this.edges.length},formatProcess(e,t){if(e instanceof a.ProcessGraph&&1===e.getNodeCount())return this.formatValue(e.getResultNode().process_id,t);var r=Object.values(e.process_graph);return 1===r.length?this.formatValue(r[0].process_id,t):"Process"},formatValue(e,t,r=!0){if("object"==typeof e)return null===e?"n/a":Array.isArray(e)?this.formatArray(e,t,r):this.formatObject(e,t,r);if("string"==typeof e){if(e.length>t){var s=i.a.htmlentities(e.substr(0,t));return r?s+'':s}return i.a.htmlentities(e)}return"boolean"==typeof e?e?"✔️":"❌":"number"==typeof e?e.toString():i.a.htmlentities(JSON.stringify(e))},formatArray(e,t,r=!0){let s=[];for(let a in e){let o=e[a],n=this.formatValue(o,10,r),l=i.a.htmlentities_decode(this.formatValue(o,10,!1));if(l.length>t){if(0===s.length)return this.formatArraySimple(e,"List("+e.length+")");s.push(this.formatArraySimple(e,"…"));break}s.push(n),t-=l.length+2}return s.join(", ")},formatArraySimple(e,t,r=!0){if(r&&e.length<10){return''+t+""}return t},formatObject(e,t,r=!0){return 0===Object.keys(e).length?"None":e instanceof a.ProcessGraph||i.a.isObject(e.process_graph)?this.formatProcess(e,t):i.a.isRef(e)?this.formatValue(i.a.formatRef(e),t):void 0!==e.west&&void 0!==e.east&&void 0!==e.south&&void 0!==e.north?t>=12?"Bounding Box":"BBox":i.a.detectGeoJson(e)?this.formatValue(e.type,t):r?'Object':"Object"}}},n=(r(446),r(4)),l=Object(n.a)(o,(function(){var e=this,t=e._self._c;return t("div",{class:e.classes},[e.output?e._e():t("div",e._g({ref:"circle",class:e.circleClasses},e.circleListeners)),e._v(" "),t("span",e._g({staticClass:"text"},e.textListeners),[t("span",{directives:[{name:"show",rawName:"v-show",value:e.unspecified,expression:"unspecified"}],staticClass:"unspecified",attrs:{title:"Parameter is likely unsupported!"}},[t("i",{staticClass:"fas fa-exclamation-triangle"})]),e._v(" "),t("span",{staticClass:"label"},[e._v(e._s(e.displayLabel))]),e.displayValue.length?[e._v(": ")]:e._e(),e._v(" "),t("span",{staticClass:"value",domProps:{innerHTML:e._s(e.displayValue)}})],2),e._v(" "),e.output?t("div",e._g({ref:"circle",class:e.circleClasses,attrs:{title:"Output of the process"}},e.circleListeners)):e._e()])}),[],!1,null,null,null).exports,c=1.3,p={compactParams:110,compact:60,normalParams:220,normal:110};var h={name:"Block",components:{BlockParameter:l},props:{id:{type:String,required:!0},type:{type:String,required:!0},selected:{type:Boolean,default:!1},position:{type:Array,required:!0},process_id:{type:String},namespace:{type:String,default:null},description:{type:String,default:null},args:{type:Object,default:()=>({})},result:{type:Boolean,default:!1},origin:{type:String,default:null},spec:{type:Object,default:()=>null},state:{type:Object,required:!0}},data:()=>({showDescriptionField:!1,drag:null}),watch:{"state.compactMode"(){this.$emit("moved",this.position)},description:{immediate:!0,handler(){this.showDescriptionField=null!==this.description}}},computed:{width(){let e=p;return this.parameters.length>0?this.state.compactMode?e.compactParams:e.normalParams:this.state.compactMode?e.compact:e.normal},styles(){return{marginLeft:Math.round(this.state.center[0]+this.position[0]*this.state.scale)+"px",marginTop:Math.round(this.state.center[1]+this.position[1]*this.state.scale)+"px",fontSize:Math.round(10*this.state.scale)+"px",width:Math.round(this.state.scale*this.width)+"px"}},plainTitle(){let e=[];return e.push(this.name),this.namespace&&e.push("@"+this.namespace),this.showId&&e.push(" "+this.id),e.join("")},name(){switch(this.type){case"process":return this.collectionId?this.collectionId:this.processId;case"parameter":return this.spec.name;default:return this.id.substr(1)}},outputLabel(){return this.result?"Result":this.isParameter?"Process Parameter":""},containerClasses(){var e=["block"];return this.collectionId?e.push("block_collection"):this.isParameter&&e.push("block_argument"),this.result&&e.push("block_result"),this.selected&&e.push("block_selected"),this.invalid&&e.push("block_invalid"),e},invalid(){if("process"!==this.type||!this.$parent.hasProcesses)return!1;if(this.namespace&&i.a.isUrl(this.namespace))return!1;if(!this.processId)return!0;if(!this.spec)return!0;if("load_collection"===this.processId&&!i.a.isRef(this.args.id)){for(let e of this.$parent.collections)if(this.args.id===e.id)return!1;return!0}return!1},processId(){if("process"===this.type){if(this.process_id)return this.process_id;if(i.a.isObject(this.spec)&&this.spec.id)return this.spec.id}return null},collectionId(){return"process"!==this.type||"load_collection"!==this.processId||i.a.isRef(this.args.id)?null:this.args.id},isParameter(){return"parameter"===this.type},allowsParameterChange(){return this.isParameter?this.state.editable&&"schema"!==this.origin&&!!this.$parent.supports("editParameter"):this.parameters.filter(e=>e.isEditable()).length>0},allowsDuplicate(){return this.state.editable&&"process"===this.type&&"schema"!==this.origin},allowsDelete(){return this.state.editable&&(!this.spec||i.a.isObject(this.spec)&&"schema"!==this.origin)},allowsInfo(){return this.collectionId?this.$parent.supports("showCollection"):this.isParameter?i.a.isObject(this.spec)&&this.$parent.supports("showParameter"):this.$parent.supports("showProcess")},allowsDescription(){return this.state.editable&&"process"===this.type},showId(){return"parameter"!==this.type},hasParametersDefined(){return Boolean(i.a.isObject(this.spec)&&Array.isArray(this.spec.parameters)&&this.spec.parameters.length>0)},parameters(){let e=[],t=[];if(this.hasParametersDefined&&(t=this.spec.parameters.map(e=>new s.ProcessParameter(e)),e=t.map(e=>e.name)),i.a.size(this.args)>0)for(var r in this.args)e.includes(r)||t.push(new s.ProcessParameter({name:r,description:""}));return t},fields(){var e={};for(var t of this.parameters)e[t.name]=t;return e.output=this.output,e},output(){var e={};i.a.isObject(this.spec)&&(this.isParameter?e=this.spec:i.a.isObject(this.spec.returns)&&(e=this.spec.returns));var t={name:"output",schema:e.schema||{},description:e.description||"",optional:!0,output:!0,value:{}};return this.isParameter?t.value.from_parameter=this.id.substr(1):t.value.from_node=this.id.substr(1),t}},mounted(){this.draggingFn=this.dragging.bind(this),document.addEventListener("mousemove",this.draggingFn),this.stopDragFn=this.stopDrag.bind(this),document.addEventListener("mouseup",this.stopDragFn),this.$emit("mounted",this)},beforeDestroy(){document.removeEventListener("mousemove",this.draggingFn),document.removeEventListener("mouseup",this.stopDragFn),this.$emit("unmounted",this)},methods:{edit(){this.isParameter?this.editParameter():this.showArguments()},duplicate(){this.$parent.$emit("duplicate",{position:this.position,process_id:this.process_id,namespace:this.namespace,arguments:this.args,description:this.description})},hasParameter(e){return this.hasParametersDefined&&!!this.spec.parameters.find(t=>t.name===e)},updateDescription(e){let t,r=e.composedPath()[0];t=r&&"string"==typeof r.value&&(r.value.length>0||"input"===e.type)?r.value:null,this.showDescriptionField=null!==t,this.description!==t&&this.$emit("update","description",t)},updatePosition(e,t=!0){e=i.a.ensurePoint(e),this.position[0]===e[0]&&this.position[1]===e[1]||this.$emit("update","position",e,t)},updateArguments(e){let t=Object.keys(this.args).filter(t=>void 0===e[t]&&(!this.hasParametersDefined||this.hasParameter(t)));for(let t of this.parameters)void 0!==e[t.name]&&t.optional&&void 0!==t.default&&i.a.equals(t.default,e[t.name])&&delete e[t.name];this.$emit("update","arguments",e,t)},updateArgument(e,t){let r=i.a.deepClone(this.args);r[e]=t,this.updateArguments(r)},updateResult(e){this.hasOutputEdges()?this.state.root.$emit("error","A result node can't have outgoing edges."):e!==this.result&&this.$emit("update","result",e)},focus(){this.$parent.focus()},onMouseDown(e){this.select(!this.selected,!e.shiftKey)},select(e=!0,t=!0){this.$emit("update","selected",e,t),this.focus()},getDimensions(){let e=this.$parent.domBoundingBox(this.$refs.div);var t=this.$parent.getDimensions();return e.x=e.offsetLeft-t.offsetLeft,e.y=e.offsetTop-t.offsetTop,e},edgesChanged(e,t){e.refs=t.map(e=>e.parameter1.value)},editParameter(){this.$parent.$emit("editParameter",this.spec,"Edit Parameter: "+this.plainTitle,e=>this.$emit("update","spec",e))},showArguments(e=null){this.$parent.$emit("editArguments",this.parameters.filter(e=>e.isEditable()),this.args,this.plainTitle,this.state.editable,e,e=>this.updateArguments(e),this)},showInfo(){this.collectionId?this.$parent.$emit("showCollection",this.collectionId):this.isParameter?this.$parent.$emit("showParameter",this.spec,this.origin):this.$parent.$emit("showProcess",this.processId,this.namespace)},async addDescription(){this.select(),this.showDescriptionField=!0,await this.$nextTick(),this.$refs.descriptionField.focus()},async emitDrag(e){this.select(!0,!e.shiftKey),this.focus(),await this.$nextTick(),this.$emit("move",e)},getDragPos(e,t){return[t[0]/this.state.scale-e[0],t[1]/this.state.scale-e[1]]},startDrag(e){if(!this.selected)return;let t=this.$parent.getMousePos(e);this.drag={origin:this.position,mouse:this.getDragPos(this.position,t)}},stopDrag(){if(this.drag){var e=5/this.state.scale;(Math.abs(this.drag.origin[0]-this.position[0])>e||Math.abs(this.drag.origin[1]-this.position[1])>e)&&this.updatePosition(this.position),this.drag=null}},dragging(e){if(!this.drag)return;let t=this.$parent.getMousePos(e),r=this.getDragPos(this.drag.mouse,t);this.updatePosition(r,!1)},hasOutputEdges(){return this.$refs.output&&this.$refs.output.getEdgeCount()>0},async remove(){await this.$parent.removeBlock(this)},getBlockParameter(e){if("output"===e&&this.$refs.output)return this.$refs.output;if(Array.isArray(this.$refs.parameters)){var t=this.$refs.parameters.filter(t=>t.name===e);if(t.length>0)return t[0]}return null},isParameterScoped(e,t){let r=this.getBlockParameter(e);return s.ProcessUtils.getCallbackParameters(r).map(e=>e.name).includes(t)},hiddenParameterRef(e){if("process"!==this.type)return null;let t=e.id.substr(1);for(let e in this.args){let r=this.args[e];if(i.a.isObject(r)&&i.a.isObject(r.process_graph)){if(a.Utils.getRefs(r,!0,!0).find(r=>r.from_parameter===t&&!this.isParameterScoped(e,r.from_parameter)))return e}}return null}}},u=(r(447),Object(n.a)(h,(function(){var e=this,t=e._self._c;return t("div",{ref:"div",class:e.containerClasses,style:e.styles,attrs:{id:"block"+this.id},on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])?null:(t.preventDefault(),t.stopPropagation(),"button"in t&&0!==t.button?null:e.onMouseDown.apply(null,arguments))}}},[t("div",{staticClass:"blockTitle",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])?null:(t.preventDefault(),t.stopPropagation(),"button"in t&&0!==t.button?null:e.emitDrag.apply(null,arguments))}}},[t("span",{staticClass:"titleText",attrs:{title:e.plainTitle}},[t("span",{directives:[{name:"show",rawName:"v-show",value:e.invalid,expression:"invalid"}],staticClass:"invalid",attrs:{title:"Process or Collection not supported!"}},[t("i",{staticClass:"fas fa-exclamation-triangle"})]),e._v("\n "+e._s(e.name)+"\n "),e.showId?t("span",{staticClass:"blockId"},[e._v(e._s(e.id))]):e._e()]),e._v(" "),t("div",{staticClass:"blockicon",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])?null:(t.preventDefault(),t.stopPropagation(),"button"in t&&0!==t.button?null:e.focus())}}},[t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsDescription&&!e.showDescriptionField,expression:"allowsDescription && !showDescriptionField"}],staticClass:"addDescription",attrs:{title:"Add description"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.addDescription()}}},[t("i",{staticClass:"fas fa-comment-medical"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsDuplicate,expression:"allowsDuplicate"}],staticClass:"duplicate",attrs:{title:"Duplicate"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.duplicate.apply(null,arguments)}}},[t("i",{staticClass:"fas fa-clone"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsDelete,expression:"allowsDelete"}],staticClass:"delete",attrs:{title:"Remove (DEL)"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.remove()}}},[t("i",{staticClass:"fas fa-trash"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsInfo,expression:"allowsInfo"}],staticClass:"info",attrs:{title:"Details"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.showInfo()}}},[t("i",{staticClass:"fas fa-info"})]),e._v(" "),t("span",{directives:[{name:"show",rawName:"v-show",value:e.allowsParameterChange,expression:"allowsParameterChange"}],staticClass:"settings",attrs:{title:e.isParameter?"Edit parameter":"Change parameter values"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.edit.apply(null,arguments)}}},[t("i",{staticClass:"fas fa-edit"})])])]),e._v(" "),t("div",{staticClass:"inout"},[t("div",{staticClass:"inputs"},e._l(e.parameters,(function(r,s){return t("BlockParameter",{key:s,ref:"parameters",refInFor:!0,attrs:{state:e.state,value:e.args[r.name],name:r.name,description:r.description,optional:r.optional,deprecated:r.deprecated,experimental:r.experimental,default:r.default,schema:r.schema},on:{input:t=>e.updateArgument(r.name,t),edgesChanged:function(t){return e.edgesChanged(r,t)}}})})),1),e._v(" "),t("div",{staticClass:"outputs"},[t("BlockParameter",e._b({ref:"output",attrs:{state:e.state,label:e.outputLabel},on:{input:e.updateResult}},"BlockParameter",e.output,!1))],1)]),e._v(" "),e.showDescriptionField?t("textarea",{ref:"descriptionField",staticClass:"editDescription",attrs:{readonly:!e.state.editable,placeholder:"Type description here..."},domProps:{value:e.description},on:{input:e.updateDescription,blur:e.updateDescription,mousedown:function(e){e.stopPropagation()}}}):e._e()])}),[],!1,null,null,null).exports);class d{constructor(e,t,r,s){this.x=e,this.y=t,this.dx=r,this.dy=s}distance(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}distanceP(e){var t=this.normal();t.x=e.x,t.y=e.y;var r=this.intersection(t);return[r[0],this.distance(t.alpha(r[1]),e)]}normal(){return new d(this.x,this.y,this.dy,-this.dx)}intersection(e){var t=this.dx,r=-e.dx,s=this.dy,a=-e.dy,i=e.x-this.x,o=e.y-this.y,n=t*a-r*s;return 0==n?null:[(a*i-r*o)/n,(-s*i+t*o)/n]}alpha(e){var t={};return t.x=this.x+this.dx*e,t.y=this.y+this.dy*e,t}}var m={name:"Edge",props:{id:{},parameter1:{type:Object,required:!0},parameter2:{type:Object,required:!0},selected:{type:Boolean,default:!1},inactive:{type:Boolean,default:!1},issues:{type:Array,default:()=>[]},lineWidth:{type:Number,default:3},lineColor:{type:Array,default:()=>[255,200,0,1]},state:{type:Object,required:!0}},data:()=>({position1:null,position2:null}),computed:{segment(){return new d(this.position1[0],this.position1[1],this.position2[0]-this.position1[0],this.position2[1]-this.position1[1])},scaledLineWidth(){return this.lineWidth*this.state.scale},lines(){var e=(this.position1[0]+this.position2[0])/2,t=(this.position1[1]+this.position2[1])/2,r=35*Math.PI/180,s=Math.cos(r),a=Math.sin(r),i=Math.cos(-r),o=Math.sin(-r),n=Math.sqrt(Math.pow(this.position1[0]-this.position2[0],2)+Math.pow(this.position1[1]-this.position2[1],2)),l=10*this.state.scale/(n/1.5),c=(this.position1[0]-e)*l,p=(this.position1[1]-t)*l,h=this.getLineStyle(this.scaledLineWidth,this.selected,this.inactive),u=this.getLineStyle(this.scaledLineWidth/1.5,this.selected),d=this.getLine(this.position1[0],this.position1[1],this.position2[0],this.position2[1],h);return this.inactive||n/this.state.scale<25?[d]:[d,this.getLine(e,t,e+(c*s-p*a),t+(p*s+c*a),u),this.getLine(e,t,e+(c*i-p*o),t+(p*i+c*o),u)]}},watch:{"state.center"(){this.updatePositions()},"state.scale"(){this.updatePositions()},"state.moving"(){this.updatePositions()}},created(){this.updatePositions()},mounted(){this.$emit("mounted",this)},beforeDestroy(){this.$emit("unmounted",this)},methods:{updatePositions(){let e=this.parameter1.getCirclePosition(),t=this.parameter2.getCirclePosition();e&&t&&(this.position1&&this.position2&&e[0]===this.position1[0]&&e[1]===this.position1[1]&&t[0]===this.position2[0]&&t[1]===this.position2[1]||(this.position1=Object.freeze(e),this.position2=Object.freeze(t),this.$emit("position",this.position1,this.position2)))},getLineStyle(e,t=!1,r=!1){let s=2*this.state.scale,a=this.lineColor;return t?a=[0,200,0,1]:this.issues.length>0&&(a=[255,0,0,1]),{stroke:`rgba(${a.join(", ")})`,"stroke-width":e,"stroke-dasharray":r?3*s+" "+2*s:"none"}},getLine:(e,t,r,s,a={})=>Object.assign({x1:e,y1:t,x2:r,y2:s},a),collide(e,t){if(!this.segment)return!1;var r=this.segment.distanceP({x:e,y:t});return r[0]>=0&&r[0]<=1&&r[1]e.id===t[r].id)||this.$emit("selectionChanged",this.selectedBlocks,this.selectedEdges)};var E={name:"ModelBuilder",components:{Block:u,Edge:f,ParameterViewer:()=>Promise.all([r.e(0),r.e(37)]).then(r.bind(null,488))},props:{id:{type:String,required:!0},editable:{type:Boolean,default:!1},value:{type:Object,default:()=>({})},collections:{type:Array,default:()=>[]},processes:{type:[Array,Object],default:()=>[]},parent:{type:Object,default:null},parentSchema:{type:Object,default:null},historySize:{type:Number,default:30},explicitZoom:{type:Boolean,default:!1},height:{type:String,default:null}},data(){return{isMounted:!1,allMounted:!1,newBlockOffset:0,history:[],historyPointer:null,process:Object.freeze(this.value),blocks:[],edges:[],hiddenParameterRefEdges:{},processGraph:null,nextBlockId:1,nextEdgeId:1,clipboard:null,activeTransactions:0,hasFocus:!1,linkingLine:null,parameterViewer:null,showZoomInfo:this.explicitZoom,state:(e=this,y.a.observable({root:e,editable:!1,compactMode:!1,moving:null,selecting:null,center:[0,0],mouse:[0,0],scale:c,linkFrom:null,linkTo:null}))};var e},computed:{style(){let e={};return"string"==typeof this.height&&(e.height=this.height),e},classes(){let e=["vue-component","model-builder"];return this.hasFocus&&e.push("focus"),this.editable&&e.push("editable"),this.state.compactMode&&e.push("compact"),this.state.scale<.5?e.push("scale_xs"):this.state.scale<.7?e.push("scale_s"):this.state.scale<.9?e.push("scale_m"):this.state.scale<1.1?e.push("scale_l"):e.push("scale_xl"),e},selectRect(){return this.state.selecting?{x:Math.min(this.state.selecting.current[0],this.state.selecting.start[0]),y:Math.min(this.state.selecting.current[1],this.state.selecting.start[1]),width:Math.abs(this.state.selecting.current[0]-this.state.selecting.start[0]),height:Math.abs(this.state.selecting.current[1]-this.state.selecting.start[1]),stroke:"rgba(0,0,0,0.8)","stroke-width":1,fill:"rgba(0,0,0,0.05)"}:null},processRegistry(){if(this.processes instanceof s.ProcessRegistry||"function"==typeof this.processes.count&&"function"==typeof this.processes.get)return this.processes;if(Array.isArray(this.processes))return new s.ProcessRegistry(this.processes);throw new Error("Invalid processes specified, must be ProcessRegistry or Array")},hasProcesses(){return this.processRegistry.count()>0},processBlocks(){return this.blocks.filter(e=>"process"===e.type)},selectedBlocks(){return this.blocks.filter(e=>e.selected)},selectedEdges(){return this.edges.filter(e=>e.selected)},selectedSideEdge(){return 1===this.selectedEdges.length&&this.selectedEdges[0].selectedParameter?this.selectedEdges[0]:null},hasSelection(){return this.selectedBlocks.length>0||this.selectedEdges.length>0},processParametersFromSchemas(){let e=[];this.parent&&this.parent.$parent&&"function"==typeof this.parent.$parent.getPgParameters&&(e=this.parent.$parent.getPgParameters().map(e=>e.spec));let t=[];this.parentSchema&&(t=this.parentSchema.getCallbackParameters());let r=e.filter(e=>!t.find(t=>e.name===t.name));return t.concat(r)}},watch:{parentSchema(){this.importPgParameters(this.processParametersFromSchemas,"schema")},async value(e){this.allMounted&&(e instanceof S||(this.process=e,await this.import(e,{propagate:!1,undoOnError:!1})))},editable:{immediate:!0,handler(e){this.state.editable=e}},selectedEdges:w,selectedBlocks:w,allMounted(){this.updateHiddenParameterRefEdges()},isMounted(){this.checkAllMounted()}},beforeCreate(){i.a.enableHtmlProps(this)},async created(){this.supports("error")||this.$on("error",(e,t=null)=>console.error(e,t)),this.supports("editArguments")||this.$on("editArguments",(...e)=>this.showParameterViewer(...e)),this.$on("duplicate",this.duplicate.bind(this))},async mounted(){i.a.loadFontAwesome(this),this.moveCenter(0,0,!0),this.onDocumentMouseUpFn=this.onDocumentMouseUp.bind(this),document.addEventListener("mouseup",this.onDocumentMouseUpFn),await this.importPgParameters(this.processParametersFromSchemas,"schema"),await this.import(this.value,{propagate:!1,undoOnError:!1})||this.perfectScale(),w.bind(this)(),this.isMounted=!0},beforeDestroy(){document.removeEventListener("mouseup",this.onDocumentMouseUpFn)},methods:{updateEdgePos(e,t){e.position1=t[0],e.position2=t[1]},mount(e,t=null){e.$el=t,this.checkAllMounted()},checkAllMounted(){this.isMounted?this.allMounted=!this.blocks.find(e=>!e.$el)||!this.edges.find(e=>!e.$el):this.allMounted=!1},updateBlockArguments(e,t,r){r.length>0&&this.parameterRemoved(e,r),this.$set(e,"arguments",t),this.commit(),r.length>0&&this.$nextTick(()=>this.refreshEdges())},updateBlockDescription(e,t){this.$set(e,"description",t),this.commit()},updateBlockPos(e,t,r=!0){this.$set(e,"position",t),this.commit(null,r,!1)},updateBlockResult(e,t){this.$set(e,"result",t),this.commit()},updateBlockSelected(e,t,r=!0){r&&this.unselectAll(),this.$set(e,"selected",t),this.commit(null,!1,!1)},updateBlockSpec(e,t){let r=i.a.omitFromObject(e.spec,["name","schema","description","optional","deprecated","experimental","default"]);Object.assign(r,t),r.optional||(delete r.optional,delete r.default),r.deprecated||delete r.deprecated,r.experimental||delete r.experimental,this.$set(e,"spec",r),this.commit()},updateBlock(e,t,r,s){switch(t){case"arguments":this.updateBlockArguments(e,r,s);break;case"description":this.updateBlockDescription(e,r);break;case"position":this.updateBlockPos(e,r,s);break;case"result":this.setResultNode(e,r);break;case"selected":this.updateBlockSelected(e,r,s);break;case"spec":this.updateBlockSpec(e,r)}},updateHiddenParameterRefEdges(){if(!this.hasProcesses||!this.allMounted||!this.blocks.find(e=>"parameter"===e.type))return void(this.hiddenParameterRefEdges={});let e={};for(let t of this.processBlocks)for(let r in t.arguments){let s=t.arguments[r];if(!i.a.isObject(s)||!i.a.isObject(s.process_graph))continue;let o=a.Utils.getRefs(s,!0,!0).filter(e=>void 0!==e.from_parameter);for(let s of o)try{if(!t.$el)continue;if(t.$el.isParameterScoped(r,s.from_parameter))continue;let a=this.getPgParameterById("$"+s.from_parameter);if(!a)continue;let i=a.$el.getBlockParameter("output"),o=t.$el.getBlockParameter(r),n=`${a.id}->${t.id}:${r}`;i&&o&&(this.hiddenParameterRefEdges[n]?e[n]=this.hiddenParameterRefEdges[n]:e[n]={$el:null,id:n,parameter1:i,parameter2:o})}catch(e){console.warn(e)}}this.hiddenParameterRefEdges=e},parameterRemoved(e,t){for(let r of this.edges.slice(0))r.parameter2.$parent.id===e.id&&t.includes(r.parameter2.name)&&this.removeEdge(r)},startDragBlock(e){for(let t of this.blocks)t.$el&&t.$el.startDrag(e)},refreshEdges(){this.refreshEdgesFor(this.edges),this.refreshEdgesFor(Object.values(this.hiddenParameterRefEdges))},refreshEdgesFor(e){for(let t of e)t.$el&&t.$el.updatePositions()},supports(e){return Boolean(this.$listeners&&this.$listeners[e])},focus(){this.$refs.div.focus()},link(e){this.state.linkFrom?this.state.linkTo=e:this.state.linkFrom=e},unlink(e=null){e?this.state.linkTo==e?this.state.linkTo=null:this.state.linkFrom==e&&(this.state.linkFrom=null,this.linkingLine=null):(this.state.linkTo=null,this.state.linkFrom=null,this.linkingLine=null)},multiSelect(){let e=this.selectRect;this.blocks.filter(t=>{if(Array.isArray(t.position)&&t.$el){let r=t.$el.getDimensions();return g()(e.x,e.y,e.width,e.height,r.x,r.y,r.width,r.height)}return!1}).map(e=>e.selected=!0),this.edges.filter(t=>Array.isArray(t.position1)&&Array.isArray(t.position2)&&P()(e.x,e.y,e.width,e.height,t.position1[0],t.position1[1],t.position2[0],t.position2[1])).map(e=>e.selected=!0)},toJSON(){let e=this.export();return JSON.stringify(e,null,2)},async onDocumentMouseUp(e){if(!this.parameterViewer&&(this.selectedSideEdge&&this.selectEdge(this.selectedSideEdge,null),this.state.selecting&&(this.multiSelect(),this.state.selecting=null),this.state.moving&&(this.state.moving=null),this.state.editable&&this.state.linkFrom)){if(1==e.which&&this.state.linkTo)try{await this.addEdge(this.state.linkFrom,this.state.linkTo)}catch(e){this.$emit("error",e)}this.unlink()}},async onKeyDown(e){if(this.parameterViewer)return;var t=document.querySelectorAll("input, textarea, button, select, datalist");for(let e of t)if(e===document.activeElement)return;let r=!1;if(this.state.editable)if("Delete"===e.code)this.deleteSelected(),r=!0;else if(e.ctrlKey||e.metaKey)if("KeyV"===e.code){if(!navigator||!navigator.clipboard||"function"!=typeof navigator.clipboard.readText)return void this.$emit("error","Pasting is not supported by your browser.");if(this.hasSelection&&this.clipboard){if(this.clipboard.edges.length>0)return void this.$emit("error","Pasting edges is not supported yet.");this.clipboard.blocks.length>0&&this.clipboard.blocks.forEach(e=>{"process"===e.type&&"schema"!==e.origin?this.duplicate(i.a.pickFromObject(e,["arguments","description","namespace","position","process_id"])):this.$emit("error",`Pasting block '${e.id}' is not supported.`)})}else try{const e=await navigator.clipboard.readText();let t=JSON.parse(e);await this.import(t)}catch(e){this.$emit("error",e,"Paste Error")}r=!0}else if("KeyC"===e.code){if(!navigator||!navigator.clipboard||"function"!=typeof navigator.clipboard.writeText)return void this.$emit("error","Copying is not supported by your browser.");if(this.hasSelection)this.clipboard={blocks:this.selectedBlocks.slice(0),edges:this.selectedEdges.slice(0)};else try{let e=this.toJSON();await navigator.clipboard.writeText(e),r=!0}catch(e){this.$emit("error",e,"Copy Error")}r=!0}r&&(e.preventDefault(),e.stopPropagation())},onMouseWheel(e){if(!this.parameterViewer&&(!this.explicitZoom||this.hasFocus||e.ctrlKey||e.metaKey)){let a=this.getMousePos(e);var t=a[0]-this.state.center[0],r=a[1]-this.state.center[1],s=Math.pow(1.1,-1*Math.sign(e.deltaY));this.moveCenter(-t*(s-1),-r*(s-1)),this.state.scale*=s,e.preventDefault(),this.showZoomInfo=!1}},domBoundingBox(e){var t=e.getBoundingClientRect();return t.offsetTop=t.top+Math.max(document.documentElement.scrollTop,document.body.scrollTop),t.offsetLeft=t.left+Math.max(document.documentElement.scrollLeft,document.body.scrollLeft),t},getMousePos(e){let t=this.$refs.div.getBoundingClientRect();return[e.clientX-t.left,e.clientY-t.top]},onMouseMove(e){if(!this.parameterViewer)try{let s=this.getMousePos(e);if(this.state.editable&&this.selectedSideEdge){var t=this.selectedSideEdge.selectedParameter.getCirclePosition();if(t)Math.sqrt(Math.pow(s[0]-t[0],2)+Math.pow(s[1]-t[1],2))>10&&(this.link(this.selectedSideEdge.selectedParameter),this.removeEdge(this.selectedSideEdge),this.commit())}if(this.state.selecting&&(this.state.selecting.current=s),this.state.moving&&(this.moveCenter(s[0]-this.state.moving[0],s[1]-this.state.moving[1]),this.state.moving=s),this.state.linkFrom){var r=this.state.linkFrom.getCirclePosition();r&&(this.linkingLine={x1:r[0],y1:r[1],x2:s[0],y2:s[1],stroke:"rgba(0,0,0,0.4)","stroke-width":3*this.state.scale})}}catch(e){this.$emit("error",e)}},onMouseDown(e){if(this.parameterViewer)return;let t=null,r=this.getMousePos(e);if(1==e.which)for(var s of(e.shiftKey?this.state.selecting={start:r,current:r}:this.unselectAll(),this.edges))if(s.$el){var a=s.$el.collide(r[0],r[1]);if(0!=a){if(0!==this.selectedEdges.length||e.shiftKey||(a<.3?t=s.parameter2:a>.7&&(t=s.parameter1)),this.selectEdge(s,!0,t),s.issues.length>0)for(let e of s.issues)this.$emit("error",e);e.preventDefault();break}}2!=e.which&&(1!=e.which||t||e.shiftKey)||(this.state.moving=r),this.focus()},getDimensions(){return this.domBoundingBox(this.$refs.div)},async clear(){return await this.startTransaction(async()=>(this.edges=[],this.blocks=this.blocks.filter(e=>"parameter"===e.type&&i.a.isObject(e.spec)&&"schema"===e.origin),this.nextBlockId=1,this.nextEdgeId=1,this.process={},this.updateHiddenParameterRefEdges(),!0))},commit(e=null,t=!0,r=!0){this.activeTransactions>0||(!1!==t&&this.saveHistory(),!1!==r?(this.$emit("input",null===e?this.export():e),this.updateHiddenParameterRefEdges()):this.refreshEdges())},saveHistory(){var e=this.export(!0);this.history.splice(this.historyPointer+1,this.historySize,Object.freeze(e)),this.history.length>this.historySize&&this.history.shift(),this.historyPointer=this.history.length-1,this.$emit("historyChanged",this.history,this.historyPointer)},async undo(){await this.historyStep(-1)},async redo(){await this.historyStep(1)},async historyStep(e){var t=this.historyPointer+e,r=this.history[t];r&&(this.historyPointer=t,this.import(r,{saveHistory:!1,undoOnError:!1,perfectScale:!1}),this.$emit("historyChanged",this.history,this.historyPointer))},setResultNode(e,t=!0){if((e=this.getBlockById(e.id))&&e.result!==t){this.updateBlockResult(e,t);var r=!1,s=!1;for(var a of this.processBlocks)if(!e||a.id!==e.id)if(s=!0,t)this.updateBlockResult(a,!1);else if(a.$el&&!a.$el.hasOutputEdges()){this.updateBlockResult(a,!0),r=!0;break}!s||t||r||this.$emit("error","No result node available, please specify one.")}},getPositionForPageXY(e,t){var r=this.getDimensions();return null!==e&&(e=(e-r.offsetLeft-this.state.center[0])/this.state.scale),null!==t&&(t=(t-r.offsetTop-this.state.center[1])/this.state.scale),[e,t]},duplicate(e){(e=i.a.deepClone(e)).position&&(e.position[1]+=100);let t=this.addBlock(e);this.$nextTick(()=>this.createEdgesForArguments(t.id,e.arguments))},addProcess(e,t={},r=[],s=null){return this.addBlock({process_id:e,namespace:s,arguments:t,position:r})},addBlock(e,t=null){let r=String(this.incrementId(t));null===t&&i.a.hasText(e.process_id)?(t=e.process_id.replace(/^([a-z]*).*$/i,"$1")+r,this.getBlockById("#"+t)&&(t=r)):t=r,"function"==typeof e.toJSON&&(e=e.toJSON());var s={id:"#"+t,type:"process",selected:!1,position:e.position,process_id:e.process_id,namespace:e.namespace,arguments:e.arguments,description:e.description||null,result:e.result||!1};this.processRegistry&&(s.spec=this.processRegistry.get(e.process_id,e.namespace));var a=this.getBlockSize(s);return s.position=i.a.ensurePoint(s.position,()=>this.getNewBlockDefaultPosition(a)),s.result&&this.blocks.filter(e=>!0===e.result).length?delete s.result:0===this.processBlocks.length&&(s.result=!0),this.blocks.push(y.a.observable(s)),this.commit(),s},getNewBlockDefaultPosition(e){var t=this.getDimensions(),r=[(-this.state.center[0]+t.width/2)/this.state.scale-e[0]/2+this.newBlockOffset,(-this.state.center[1]+t.height/2)/this.state.scale-e[1]/2+this.newBlockOffset];return this.newBlockOffset<150&&(this.newBlockOffset+=10),r},getBlockSize(e){if(e.$el){let t=e.$el.getDimensions();return[t.width/this.state.scale,t.height/this.state.scale]}let t,r=Math.max(i.a.size(e.arguments),i.a.isObject(e.spec)?i.a.size(e.spec.parameters):0),s=p;return t=r>0?this.state.compactMode?s.compactParams:s.normalParams:this.state.compactMode?s.compact:s.normal,[t,20+15*r+("string"==typeof e.description?40:0)]},moveCenter(e,t,r=!1){var s=this.getDimensions();this.state.center=[(r?s.width/2:this.state.center[0])+e,(r?s.height/2:this.state.center[1])+t],this.newBlockOffset=0},unselectAll(){for(var e of this.blocks)this.updateBlockSelected(e,!1,!1);for(var t of this.edges)this.selectEdge(t,!1)},selectEdge(e,t=!0,r=null){return i.a.isObject(e)||(e=this.edges[e]),e.selected!==t&&(null!==t&&this.$set(e,"selected",t),this.$set(e,"selectedParameter",r),!0)},removeEdge(e){e.parameter1.eraseEdge(e),e.parameter2.eraseEdge(e),this.$delete(this.edges,this.edges.indexOf(e))},async removeBlock(e){if("parameter"===e.type){let t=null,r=this.blocks.find(r=>(t=r.$el.hiddenParameterRef(e),null!==t));if(r)throw new Error(`Parameter is still used in '${r.id}', parameter '${t}'. Only unused parameters can be deleted.`)}return await this.startTransaction(async()=>{var t=this.blocks.findIndex(t=>t.id==e.id);if(t<0)return!1;for(var r of this.edges.slice(0))r.parameter1.$parent.id!==e.id&&r.parameter2.$parent.id!==e.id||this.removeEdge(r);return e.result&&this.setResultNode(e,!1),this.$delete(this.blocks,t),!0})},getBlockById(e){var t=this.blocks.filter(t=>t.id===e);return t.length>0?t[0]:null},async deleteSelected(){return!!this.hasSelection&&await this.startTransaction(async()=>{for(var e of this.selectedBlocks.slice(0))e.$el.allowsDelete&&await this.removeBlock(e);for(var t of this.selectedEdges.slice(0))this.removeEdge(t);return!0})},async addEdgeByNames(e,t,r,s){var a=[];for(var i of[e,r]){var o=this.getBlockById(i);if(!o)throw"Can't find block: "+i;if(!o.$el)throw"Block not mounted yet: "+i;a.push(o.$el)}await this.addEdge(a[0].getBlockParameter(t),a[1].getBlockParameter(s))},async addEdge(e,t){if(!e||!t)throw"One of the parameters is invalid.";if(e!=t){if(e.$parent==t.$parent)throw"You can't link a block to itself";var r={id:this.nextEdgeId++,selected:!1,inactive:!1,issues:[],$el:null};if(e.output?(r.parameter1=e,r.parameter2=t):(r.parameter1=t,r.parameter2=e),r.parameter1.output===r.parameter2.output)throw"You have to link an input with an output";if(-1!==this.allSuccessors(r.parameter1).indexOf(r.parameter2.id))throw"You can not create a loop";if(r.parameter2.getEdgeCount()>0&&!r.parameter2.allowsMultipleInputs)throw"Parameter accepts only one input";for(var s of this.edges)if(s.$el&&s.$el.equals(r))throw"This connection exists already";if(!a.JsonSchemaValidator.isSchemaCompatible(r.parameter2.schema||{},r.parameter1.schema||{},!1,!0)){let e='Incoming data type is not compatible for parameter "'+r.parameter2.name+'"';r.issues.push(e),this.$emit("error",e)}return await this.startTransaction(async()=>(this.unlink(),this.edges.push(y.a.observable(r)),r.parameter1.addEdge(r),r.parameter2.addEdge(r),this.setResultNode(r.parameter1.$parent,!1),!0))}},allSuccessors(e){var t=e.$parent,r={},s=[t];for(r[t.id]=!0;s.length>0;){var a=s.pop();for(var i in a.edges)for(var o in a.edges[i]){var n=a.edges[i][o];if(n.block1==a){var l=n.block2;l.id in r||(r[l.id]=!0,s.push(l))}}}return Object.values(r)},async toggleCompact(){this.state.compactMode=!this.state.compactMode,this.$emit("compactMode",this.state.compactMode),await this.$nextTick(),this.refreshEdges()},export(e=!1){let t={process_graph:{}};for(let r of this.processBlocks){let s=["process_id","namespace","arguments","description","result"];e&&s.push("position");let a=i.a.pickFromObject(r,s);null===a.description&&delete a.description,!0!==a.result&&delete a.result,a.namespace||delete a.namespace;let o=r.id.substr(1);t.process_graph[o]=a}if(!this.parent){t.parameters=[];let e=this.getPgParameters();for(let r of e)t.parameters.push(r.spec)}return new S(Object.assign({},this.process,t))},async startTransaction(e,t={},...r){let s;this.activeTransactions++;try{s=await e(r)}catch(e){if(this.$emit("error",e,"Model is invalid"),!1!==t.undoOnError)try{await this.undo()}catch(t){this.$emit("error",e,"Revert failed")}s=!1}return this.activeTransactions--,this.commit(null,t.saveHistory,t.propagate),s},async import(e,t={}){return await this.startTransaction(async()=>{if(!1!==t.clear&&(await this.clear(),this.process=e instanceof a.ProcessGraph?e.toJSON():e),!i.a.isObject(e))return!1;let r;return e instanceof a.ProcessGraph?(r=new a.ProcessGraph(e.toJSON(),this.processRegistry),r.setParent(e.parentProcessId,e.parentParameterName)):r=new a.ProcessGraph(e,this.processRegistry),r.allowEmpty(),r.parse(),this.processGraph=Object.freeze(r),await this.importPgParameters(this.processGraph.getProcessParameters(!0),"user",!1!==t.clear),await this.importNodes(this.processGraph.getStartNodes()),await this.importEdges(this.processGraph),!1!==t.perfectScale&&this.perfectScale(),this.$nextTick(()=>this.updateHiddenParameterRefEdges()),!0},t)},async importPgParameters(e,t,r=!0){if(!Array.isArray(e))return;return await this.startTransaction(async()=>{r&&(this.blocks=this.blocks.filter(e=>"parameter"!==e.type||e.origin!==t));let s=this.getBlockSize({}),a=[0,0];for(var i in e)a=[-s[0]-20,i*(s[1]+20)],await this.addPgParameter(e[i],t,a)},{undoOnError:!1,saveHistory:!1,propagate:!1})},async addPgParameter(e,t="user",r=null){return await this.startTransaction(async()=>{let s="$"+e.name;return!(this.blocks.findIndex(e=>"parameter"===e.type&&e.id==s)>=0)&&(void 0===(e=i.a.deepClone(e)).schema&&(e.schema={}),this.blocks.push(y.a.observable({id:s,type:"parameter",origin:t,position:i.a.ensurePoint(r,()=>this.getNewBlockDefaultPosition(this.getBlockSize({}))),spec:Object.freeze(e)})),!0)})},getPgParameters(){return this.blocks.filter(e=>"parameter"===e.type)},getPgParameterById(e){return this.blocks.find(t=>"parameter"===t.type&&t.id===e)},async importEdges(e){var t=e.getNodes();return Promise.all(Object.values(t).map(e=>this.importEdgesForNode(e)))},async importEdgesForNode(e){var t=e.getArgumentNames();for(let r in t){let s=t[r],a=e.getRawArgument(s),i="#"+e.id;switch(e.getArgumentType(s)){case"result":await this.addEdgeByNames("#"+a.from_node,"output",i,s,!1);break;case"parameter":await this.addEdgeByNames("$"+a.from_parameter,"output",i,s,!1);break;case"object":case"array":await this.importEdgeDeep(a,i,s)}}},async importEdgeDeep(e,t,r){for(let s in e)if(e[s]&&"object"==typeof e[s]&&"process_graph"!==s)await this.importEdgeDeep(e[s],t,r);else{if(!i.a.isRef(e))continue;e.from_node?await this.addEdgeByNames("#"+e.from_node,"output",t,r,!1):e.from_parameter&&await this.addEdgeByNames("$"+e.from_parameter,"output",t,r,!1)}},async createEdgesForArguments(e,t){for(let r in t)await this.importEdgeDeep(t[r],e,r)},async importNodes(e,t=0,r=0,s=[]){let a=[],o=0;for(let n of e){if(s.includes(n.id)||void 0!==n.getPreviousNodes().find(e=>!s.includes(e.id))){r+=10;continue}let e="function"==typeof n.toJSON?n.toJSON():n;e.position=i.a.ensurePoint(e.position,()=>[t,r]);let l=this.addBlock(e,n.id);s.push(n.id);let c=this.getBlockSize(l);o=Math.max(o,e.position[0]+c[0]),r=e.position[1]+c[1]+20,a=a.concat(n.getNextNodes())}a.length&&await this.importNodes(a,o+20,0,s)},incrementId(e=null){"number"==typeof e||"string"==typeof e&&0!==e.length||(e=this.nextBlockId,this.nextBlockId++);let t=Number.parseInt(e,10);return Number.isNaN(t)||(this.nextBlockId=Math.max(this.nextBlockId,t+1)),e},perfectScale(){if(this.$refs.div&&0!==this.blocks.length){var e=null,t=null,r=null,s=null;for(let a of this.blocks){let o=this.getBlockSize(a),n=i.a.ensurePoint(a.position);null==e?(e=n[0]-15,t=n[0]+o[0]+15,r=n[1]-15,s=n[1]+o[1]+15):(e=Math.min(e,n[0]-15),t=Math.max(t,n[0]+o[0]+15),r=Math.min(r,n[1]-15),s=Math.max(s,n[1]+o[1]+15))}var a=this.$refs.div.getBoundingClientRect(),o=a.width/(t-e),n=a.height/(s-r);this.state.scale=Math.min(o,n,1.5),this.state.center=[a.width/2-this.state.scale*(e+t)/2,a.height/2-this.state.scale*(r+s)/2],this.newBlockOffset=0}},showParameterViewer(e,t,r,s,a,i,o){this.parameterViewer={parameters:e,values:t,title:r,selectParameterName:a,parent:o}}}};class S{constructor(e){Object.assign(this,e)}}var x=E,k=(r(458),Object(n.a)(x,(function(){var e=this,t=e._self._c;return t("div",{ref:"div",class:e.classes,style:e.style,attrs:{id:e.id,tabindex:"0"},on:{mousemove:e.onMouseMove,mousedown:e.onMouseDown,wheel:e.onMouseWheel,keydown:e.onKeyDown,focus:function(t){e.hasFocus=!0},blur:function(t){e.hasFocus=!1}}},[t("svg",{staticClass:"canvas",attrs:{xmlns:"http://www.w3.org/2000/svg",version:"1.1"}},[e._l(e.edges,(function(r){return t("Edge",{key:r.id,attrs:{id:r.id,parameter1:r.parameter1,parameter2:r.parameter2,selected:r.selected,inactive:r.inactive,issues:r.issues,state:e.state},on:{mounted:t=>e.mount(r,t),unmounted:()=>e.mount(r),position:function(t){return e.updateEdgePos(r,arguments)}}})})),e._v(" "),e._l(e.hiddenParameterRefEdges,(function(r){return t("Edge",{key:r.id,attrs:{id:r.id,parameter1:r.parameter1,parameter2:r.parameter2,inactive:!0,lineColor:[200,200,200,1],lineWidth:2,state:e.state},on:{mounted:t=>e.mount(r,t),unmounted:()=>e.mount(r)}})})),e._v(" "),e.linkingLine?t("line",e._b({},"line",e.linkingLine,!1)):e._e(),e._v(" "),e.selectRect?t("rect",e._b({},"rect",e.selectRect,!1)):e._e()],2),e._v(" "),t("div",{staticClass:"blocks"},e._l(e.blocks,(function(r){return t("Block",{key:r.id,attrs:{id:r.id,type:r.type,spec:r.spec,state:e.state,selected:r.selected,position:r.position,origin:r.origin,process_id:r.process_id,namespace:r.namespace,result:r.result,args:r.arguments,description:r.description},on:{update:(...t)=>e.updateBlock(r,...t),mounted:t=>e.mount(r,t),unmounted:()=>e.mount(r),move:e.startDragBlock}})})),1),e._v(" "),e.state.scale<.7||e.showZoomInfo?t("div",{staticClass:"zoomInfo"},[e.state.scale<.7?t("div",[e._v("\n Zoom in for more details.\n ")]):e._e(),e._v(" "),e.showZoomInfo?t("div",[e._v("\n Zoom with "),t("kbd",[e._v("STRG")]),e._v(" or "),t("kbd",[e._v("Meta")]),e._v(" key and the mouse wheel.\n ")]):e._e()]):e._e(),e._v(" "),e.parameterViewer?t("ParameterViewer",e._b({on:{close:function(t){e.parameterViewer=null}}},"ParameterViewer",e.parameterViewer,!1)):e._e()],1)}),[],!1,null,null,null));t.default=k.exports}}]); \ No newline at end of file diff --git a/assets/js/111.4b3744fc.js b/assets/js/111.ac5caffd.js similarity index 99% rename from assets/js/111.4b3744fc.js rename to assets/js/111.ac5caffd.js index a5e217702..446c467c6 100644 --- a/assets/js/111.4b3744fc.js +++ b/assets/js/111.ac5caffd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[111],{559:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"openeo-project-steering-committee"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-project-steering-committee"}},[e._v("#")]),e._v(" openEO Project Steering Committee")]),e._v(" "),t("p",[e._v("This document describes how the openEO Project Steering Committee determines membership, and makes decisions on openEO project issues. The openEO project is concerned with all repositories (software and specifications etc.) found under "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In brief the committee votes on proposals on "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/PSC/issues"),t("OutboundLink")],1),e._v(". Proposals are available for review for at least five business days, and a single veto is sufficient to delay progress though ultimately a majority of members can pass a proposal.")]),e._v(" "),t("h2",{attrs:{id:"members"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#members"}},[e._v("#")]),e._v(" Members")]),e._v(" "),t("p",[e._v("The list of members of the Project Steering Committee is:")]),e._v(" "),t("ul",[t("li",[e._v("Jeroen Dries ("),t("a",{attrs:{href:"https://github.com/jdries",target:"_blank",rel:"noopener noreferrer"}},[e._v("@jdries"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Alexander Jacob ("),t("a",{attrs:{href:"https://github.com/aljacob",target:"_blank",rel:"noopener noreferrer"}},[e._v("@aljacob"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Miha Kadunc ("),t("a",{attrs:{href:"https://github.com/mkadunc",target:"_blank",rel:"noopener noreferrer"}},[e._v("@mkadunc"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Matthias Mohr ("),t("strong",[e._v("chair")]),e._v(", "),t("a",{attrs:{href:"https://github.com/m-mohr",target:"_blank",rel:"noopener noreferrer"}},[e._v("@m-mohr"),t("OutboundLink")],1),e._v(", e-mail: openeo.psc@uni-muenster.de)")]),e._v(" "),t("li",[e._v("Markus Neteler ("),t("a",{attrs:{href:"https://github.com/neteler",target:"_blank",rel:"noopener noreferrer"}},[e._v("@neteler"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Edzer Pebesma ("),t("a",{attrs:{href:"https://github.com/edzer",target:"_blank",rel:"noopener noreferrer"}},[e._v("@edzer"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Benjamin Schumacher ("),t("a",{attrs:{href:"https://github.com/bschumac",target:"_blank",rel:"noopener noreferrer"}},[e._v("@bschumac"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("p",[e._v("The current list will be maintained by the openEO chair on this page and will be published to the openEO web pages, too.")]),e._v(" "),t("h2",{attrs:{id:"detailed-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#detailed-process"}},[e._v("#")]),e._v(" Detailed Process")]),e._v(" "),t("ol",[t("li",[e._v("Proposals are written up and submitted on "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/PSC/issues/new/choose"),t("OutboundLink")],1),e._v(" for discussion and voting, by any interested party, not just committee members.")]),e._v(" "),t("li",[e._v("Proposals need to be available for review for at least five business days before a final decision can be made. Public holidays count as business days.")]),e._v(" "),t("li",[e._v("Respondents may vote "),t("code",[e._v("+1")]),e._v(" to indicate support for the proposal and a willingness to support implementation.")]),e._v(" "),t("li",[e._v("Respondents may vote "),t("code",[e._v("-1")]),e._v(" to veto a proposal, but must provide clear reasoning and alternate approaches to resolving the problem within the five business days.")]),e._v(" "),t("li",[e._v("A vote of "),t("code",[e._v("-0")]),e._v(" indicates mild disagreement, but has no effect. A "),t("code",[e._v("0")]),e._v(" indicates no opinion. A "),t("code",[e._v("+0")]),e._v(" indicates mild support, but has no effect.")]),e._v(" "),t("li",[e._v("Anyone may comment on proposals on the list, but only members of the Project Steering Committee’s votes will be counted.")]),e._v(" "),t("li",[e._v("A proposal will be accepted if it receives +4 (including the proposer) and no vetoes (-1) or has not received enough votes in 20 business days.")]),e._v(" "),t("li",[e._v("If a proposal is vetoed, and it cannot be revised to satisfy all parties, then it can be resubmitted for an override vote in which a majority of all eligible voters indicating +1 is sufficient to pass it. Note that this is a majority of all committee members, not just those who actively vote.")]),e._v(" "),t("li",[e._v("Upon completion of discussion and voting the proposer should announce whether they are proceeding (proposal accepted) or are withdrawing their proposal (vetoed).")]),e._v(" "),t("li",[e._v("The Chair gets a vote.")]),e._v(" "),t("li",[e._v("The Chair is responsible for keeping track of who is a member of the Project Steering Committee.")]),e._v(" "),t("li",[e._v("Addition and removal of members from the committee, as well as selection of a Chair should be handled as a proposal to the committee.")]),e._v(" "),t("li",[e._v("The Chair adjudicates in cases of disputes about voting.")])]),e._v(" "),t("h3",{attrs:{id:"when-is-vote-required"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#when-is-vote-required"}},[e._v("#")]),e._v(" When is Vote Required?")]),e._v(" "),t("p",[e._v("Generally speaking, technical decisions should be made by consensus within openEO components. However, if a decision cannot be decided by consensus of the committers involved in the component, any committer can request the decision be brought to a vote of the openEO PSC. Technical decision that would be suitable for such a process include:")]),e._v(" "),t("ul",[t("li",[e._v("Any change to PSC membership (new members, removing inactive members)")]),e._v(" "),t("li",[e._v("Anything that could cause backward compatibility issues in normative specifications (e.g., API or process specifications).")]),e._v(" "),t("li",[e._v("Adding or changing substantial amounts of the normative specifications.")]),e._v(" "),t("li",[e._v("Issues of procedure (e.g. changes to these guidelines).")]),e._v(" "),t("li",[e._v("When stable releases should take place.")]),e._v(" "),t("li",[e._v("Strategic decisions regarding the project and anything that might be controversial.")])]),e._v(" "),t("h3",{attrs:{id:"final-remarks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#final-remarks"}},[e._v("#")]),e._v(" Final remarks")]),e._v(" "),t("ul",[t("li",[e._v("The Chair is the ultimate adjudicator if things break down.")]),e._v(" "),t("li",[e._v("The absolute majority rule can be used to override an obstructionist veto, but it is intended that in normal circumstances vetoers need to be convinced to withdraw their veto. We are trying to reach consensus.")]),e._v(" "),t("li",[e._v("Software components that at least two other software repositories under "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO"),t("OutboundLink")],1),e._v(" depend on, are encouraged to implement a review system for breaking changes (e.g. GitHub Pull Request Approvals) that require a certain number of approvals: 2 dependents require 1 approval, more than 2 dependents require 2 approvals. Exceptions for this must go through the PSC process.")])]),e._v(" "),t("h2",{attrs:{id:"committee-membership"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#committee-membership"}},[e._v("#")]),e._v(" Committee Membership")]),e._v(" "),t("h3",{attrs:{id:"adding-members"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-members"}},[e._v("#")]),e._v(" Adding Members")]),e._v(" "),t("p",[e._v("Anyone with a contribution to the "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO organization"),t("OutboundLink")],1),e._v(" may nominate someone for committee membership at any time. Only existing PSC committee members may vote on new members. Nominees must receive a majority vote from existing members to be added to the PSC.")]),e._v(" "),t("h3",{attrs:{id:"stepping-down"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stepping-down"}},[e._v("#")]),e._v(" Stepping Down")]),e._v(" "),t("p",[e._v("If for any reason a PSC member is not able to fully participate then they certainly are free to step down. If a member is not active (e.g., no voting or email participation) for a period of 12 months then the PSC reserves the right to seek nominations to fill that position. Should that person become active again then they would certainly be welcome, but would require a nomination.")]),e._v(" "),t("h2",{attrs:{id:"history"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#history"}},[e._v("#")]),e._v(" History")]),e._v(" "),t("p",[e._v("This document is based on the "),t("a",{attrs:{href:"https://gdal.org/development/rfc/rfc1_pmc.html#rfc-1",target:"_blank",rel:"noopener noreferrer"}},[e._v("GDAL Project Management Committee Guidelines"),t("OutboundLink")],1),e._v(" and was accepted by the openEO project board on October, 7 2020.")]),e._v(" "),t("p",[e._v("The following changes have been made thereafter: "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/compare/v1...main",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/PSC/compare/v1...main"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[111],{562:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"openeo-project-steering-committee"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-project-steering-committee"}},[e._v("#")]),e._v(" openEO Project Steering Committee")]),e._v(" "),t("p",[e._v("This document describes how the openEO Project Steering Committee determines membership, and makes decisions on openEO project issues. The openEO project is concerned with all repositories (software and specifications etc.) found under "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("In brief the committee votes on proposals on "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/PSC/issues"),t("OutboundLink")],1),e._v(". Proposals are available for review for at least five business days, and a single veto is sufficient to delay progress though ultimately a majority of members can pass a proposal.")]),e._v(" "),t("h2",{attrs:{id:"members"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#members"}},[e._v("#")]),e._v(" Members")]),e._v(" "),t("p",[e._v("The list of members of the Project Steering Committee is:")]),e._v(" "),t("ul",[t("li",[e._v("Jeroen Dries ("),t("a",{attrs:{href:"https://github.com/jdries",target:"_blank",rel:"noopener noreferrer"}},[e._v("@jdries"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Alexander Jacob ("),t("a",{attrs:{href:"https://github.com/aljacob",target:"_blank",rel:"noopener noreferrer"}},[e._v("@aljacob"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Miha Kadunc ("),t("a",{attrs:{href:"https://github.com/mkadunc",target:"_blank",rel:"noopener noreferrer"}},[e._v("@mkadunc"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Matthias Mohr ("),t("strong",[e._v("chair")]),e._v(", "),t("a",{attrs:{href:"https://github.com/m-mohr",target:"_blank",rel:"noopener noreferrer"}},[e._v("@m-mohr"),t("OutboundLink")],1),e._v(", e-mail: openeo.psc@uni-muenster.de)")]),e._v(" "),t("li",[e._v("Markus Neteler ("),t("a",{attrs:{href:"https://github.com/neteler",target:"_blank",rel:"noopener noreferrer"}},[e._v("@neteler"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Edzer Pebesma ("),t("a",{attrs:{href:"https://github.com/edzer",target:"_blank",rel:"noopener noreferrer"}},[e._v("@edzer"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Benjamin Schumacher ("),t("a",{attrs:{href:"https://github.com/bschumac",target:"_blank",rel:"noopener noreferrer"}},[e._v("@bschumac"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("p",[e._v("The current list will be maintained by the openEO chair on this page and will be published to the openEO web pages, too.")]),e._v(" "),t("h2",{attrs:{id:"detailed-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#detailed-process"}},[e._v("#")]),e._v(" Detailed Process")]),e._v(" "),t("ol",[t("li",[e._v("Proposals are written up and submitted on "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/PSC/issues/new/choose"),t("OutboundLink")],1),e._v(" for discussion and voting, by any interested party, not just committee members.")]),e._v(" "),t("li",[e._v("Proposals need to be available for review for at least five business days before a final decision can be made. Public holidays count as business days.")]),e._v(" "),t("li",[e._v("Respondents may vote "),t("code",[e._v("+1")]),e._v(" to indicate support for the proposal and a willingness to support implementation.")]),e._v(" "),t("li",[e._v("Respondents may vote "),t("code",[e._v("-1")]),e._v(" to veto a proposal, but must provide clear reasoning and alternate approaches to resolving the problem within the five business days.")]),e._v(" "),t("li",[e._v("A vote of "),t("code",[e._v("-0")]),e._v(" indicates mild disagreement, but has no effect. A "),t("code",[e._v("0")]),e._v(" indicates no opinion. A "),t("code",[e._v("+0")]),e._v(" indicates mild support, but has no effect.")]),e._v(" "),t("li",[e._v("Anyone may comment on proposals on the list, but only members of the Project Steering Committee’s votes will be counted.")]),e._v(" "),t("li",[e._v("A proposal will be accepted if it receives +4 (including the proposer) and no vetoes (-1) or has not received enough votes in 20 business days.")]),e._v(" "),t("li",[e._v("If a proposal is vetoed, and it cannot be revised to satisfy all parties, then it can be resubmitted for an override vote in which a majority of all eligible voters indicating +1 is sufficient to pass it. Note that this is a majority of all committee members, not just those who actively vote.")]),e._v(" "),t("li",[e._v("Upon completion of discussion and voting the proposer should announce whether they are proceeding (proposal accepted) or are withdrawing their proposal (vetoed).")]),e._v(" "),t("li",[e._v("The Chair gets a vote.")]),e._v(" "),t("li",[e._v("The Chair is responsible for keeping track of who is a member of the Project Steering Committee.")]),e._v(" "),t("li",[e._v("Addition and removal of members from the committee, as well as selection of a Chair should be handled as a proposal to the committee.")]),e._v(" "),t("li",[e._v("The Chair adjudicates in cases of disputes about voting.")])]),e._v(" "),t("h3",{attrs:{id:"when-is-vote-required"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#when-is-vote-required"}},[e._v("#")]),e._v(" When is Vote Required?")]),e._v(" "),t("p",[e._v("Generally speaking, technical decisions should be made by consensus within openEO components. However, if a decision cannot be decided by consensus of the committers involved in the component, any committer can request the decision be brought to a vote of the openEO PSC. Technical decision that would be suitable for such a process include:")]),e._v(" "),t("ul",[t("li",[e._v("Any change to PSC membership (new members, removing inactive members)")]),e._v(" "),t("li",[e._v("Anything that could cause backward compatibility issues in normative specifications (e.g., API or process specifications).")]),e._v(" "),t("li",[e._v("Adding or changing substantial amounts of the normative specifications.")]),e._v(" "),t("li",[e._v("Issues of procedure (e.g. changes to these guidelines).")]),e._v(" "),t("li",[e._v("When stable releases should take place.")]),e._v(" "),t("li",[e._v("Strategic decisions regarding the project and anything that might be controversial.")])]),e._v(" "),t("h3",{attrs:{id:"final-remarks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#final-remarks"}},[e._v("#")]),e._v(" Final remarks")]),e._v(" "),t("ul",[t("li",[e._v("The Chair is the ultimate adjudicator if things break down.")]),e._v(" "),t("li",[e._v("The absolute majority rule can be used to override an obstructionist veto, but it is intended that in normal circumstances vetoers need to be convinced to withdraw their veto. We are trying to reach consensus.")]),e._v(" "),t("li",[e._v("Software components that at least two other software repositories under "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO"),t("OutboundLink")],1),e._v(" depend on, are encouraged to implement a review system for breaking changes (e.g. GitHub Pull Request Approvals) that require a certain number of approvals: 2 dependents require 1 approval, more than 2 dependents require 2 approvals. Exceptions for this must go through the PSC process.")])]),e._v(" "),t("h2",{attrs:{id:"committee-membership"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#committee-membership"}},[e._v("#")]),e._v(" Committee Membership")]),e._v(" "),t("h3",{attrs:{id:"adding-members"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-members"}},[e._v("#")]),e._v(" Adding Members")]),e._v(" "),t("p",[e._v("Anyone with a contribution to the "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO organization"),t("OutboundLink")],1),e._v(" may nominate someone for committee membership at any time. Only existing PSC committee members may vote on new members. Nominees must receive a majority vote from existing members to be added to the PSC.")]),e._v(" "),t("h3",{attrs:{id:"stepping-down"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stepping-down"}},[e._v("#")]),e._v(" Stepping Down")]),e._v(" "),t("p",[e._v("If for any reason a PSC member is not able to fully participate then they certainly are free to step down. If a member is not active (e.g., no voting or email participation) for a period of 12 months then the PSC reserves the right to seek nominations to fill that position. Should that person become active again then they would certainly be welcome, but would require a nomination.")]),e._v(" "),t("h2",{attrs:{id:"history"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#history"}},[e._v("#")]),e._v(" History")]),e._v(" "),t("p",[e._v("This document is based on the "),t("a",{attrs:{href:"https://gdal.org/development/rfc/rfc1_pmc.html#rfc-1",target:"_blank",rel:"noopener noreferrer"}},[e._v("GDAL Project Management Committee Guidelines"),t("OutboundLink")],1),e._v(" and was accepted by the openEO project board on October, 7 2020.")]),e._v(" "),t("p",[e._v("The following changes have been made thereafter: "),t("a",{attrs:{href:"https://github.com/Open-EO/PSC/compare/v1...main",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/PSC/compare/v1...main"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/112.3fadda3d.js b/assets/js/112.350b20cf.js similarity index 99% rename from assets/js/112.3fadda3d.js rename to assets/js/112.350b20cf.js index f81f681b3..acb0f0d71 100644 --- a/assets/js/112.3fadda3d.js +++ b/assets/js/112.350b20cf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{560:function(e,r,t){"use strict";t.r(r);var n=t(4),o=Object(n.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"software"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#software"}},[e._v("#")]),e._v(" Software")]),e._v(" "),r("p",[e._v("All developed software is organized within the "),r("a",{attrs:{href:"https://github.com/open-eo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO GitHub organization"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"clients"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#clients"}},[e._v("#")]),e._v(" Clients")]),e._v(" "),r("p",[e._v("Software that allows remote sensers and other users to access the openEO back-ends:")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Client software")]),e._v(" "),r("th",[e._v("Package Manager / Hosted Version")]),e._v(" "),r("th",[e._v("GitHub")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("JavaScript/TypeScript library")]),e._v(" "),r("td",[e._v("npm: "),r("a",{attrs:{href:"https://www.npmjs.com/package/@openeo/js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("@openeo/js-client"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-js-client"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("Python library")]),e._v(" "),r("td",[e._v("PyPI: "),r("a",{attrs:{href:"https://pypi.org/project/openeo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),r("OutboundLink")],1),e._v(" / Conda Forge: "),r("a",{attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-python-client"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("QGIS plugin")]),e._v(" "),r("td",[e._v("QGIS plugin repository: "),r("a",{attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-qgis-plugin-master"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-qgis-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-qgis-plugin"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("R library")]),e._v(" "),r("td",[e._v("CRAN: "),r("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-r-client"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("Web Editor")]),e._v(" "),r("td",[r("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Hosted Version"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-web-editor"),r("OutboundLink")],1)])])])]),e._v(" "),r("p",[e._v("See the "),r("a",{attrs:{href:e.$site.themeConfig.docPath+"getting-started.html"}},[r("strong",[e._v("getting started guide for users")])]),e._v(" for more information.\nUsers considering to implement a new client library should read the "),r("a",{attrs:{href:e.$site.themeConfig.docPath+"developers/clients/getting-started.html"}},[r("strong",[e._v("getting started guide for client developers")])]),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"back-ends"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#back-ends"}},[e._v("#")]),e._v(" Back-ends")]),e._v(" "),r("p",[e._v("Data and infrastructure providers can host their own instance of the openEO API:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GeoPySpark (Geotrellis)"),r("OutboundLink")],1),e._v(" (by VITO) - has "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-integrationtests",target:"_blank",rel:"noopener noreferrer"}},[e._v("integration tests"),r("OutboundLink")],1),e._v(", requires "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-geotrellis-extensions",target:"_blank",rel:"noopener noreferrer"}},[e._v("GeoTrellis extensions"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google Earth Engine"),r("OutboundLink")],1),e._v(" (by WWU)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-grassgis-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GRASS GIS"),r("OutboundLink")],1),e._v(" (by mundialis)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-jeodpp-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("JEODPP"),r("OutboundLink")],1),e._v(" (by JRC)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/SARScripts/openeo_odc_driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open Data Cube"),r("OutboundLink")],1),e._v(" (by EURAC, funded by ESA)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-eodc-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Apache Airflow / eoDataReaders"),r("OutboundLink")],1),e._v(" (by EODC)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub"),r("OutboundLink")],1),e._v(" (by Sinergise)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-wcps-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("WCPS (rasdaman)"),r("OutboundLink")],1),e._v(" (by EURAC)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("R back-end"),r("OutboundLink")],1),e._v(" (by WWU) - discontinued until further notice (last version: 0.3)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/IBM/tensorlakehouse-openeo-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("TensorLakeHouse"),r("OutboundLink")],1),e._v(" (by IBM Research)")])]),e._v(" "),r("p",[e._v("See the "),r("a",{attrs:{href:e.$site.themeConfig.docPath+"developers/backends/getting-started.html"}},[r("strong",[e._v("getting started guide for back-end providers")])]),e._v(" for more information.")]),e._v(" "),r("p",[e._v("To start developing a new back-end driver, you may start with any of the common functionalities implemented in several programming languages:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-spring-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java (Spring) API Commons"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python API Commons"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-python",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Process Graph Parser"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-processgraphs",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript Process Graph Parser"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-python",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Processes"),r("OutboundLink")],1),e._v(" - many openEO processes implemented in Python")])]),e._v(" "),r("p",[e._v("Our approach to tackle language-agnostic user-defined functions can be found in the following repositories:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF Python reference implementation"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF R reference implementation"),r("OutboundLink")],1)])]),e._v(" "),r("h2",{attrs:{id:"specification"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#specification"}},[e._v("#")]),e._v(" Specification")]),e._v(" "),r("p",[e._v("The API specification is available in the "),r("strong",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-api",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API repository"),r("OutboundLink")],1)]),e._v(".\nThe process definitions are available in the "),r("strong",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO processes repository"),r("OutboundLink")],1)]),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"ecosystem"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#ecosystem"}},[e._v("#")]),e._v(" Ecosystem")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-backend-validator",target:"_blank",rel:"noopener noreferrer"}},[e._v("Back-end validator"),r("OutboundLink")],1),e._v(" - Validation for back-end implementations. "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-result-validation-engine",target:"_blank",rel:"noopener noreferrer"}},[e._v("Image-based validation of EO processing results"),r("OutboundLink")],1),e._v(" is also worked on.")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),r("OutboundLink")],1),e._v(" ("),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-hub",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),r("OutboundLink")],1),e._v(") - The central platform for openEO services.")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-docgen",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes DocGen"),r("OutboundLink")],1),e._v(" - A tool to generate a visual interface for openEO process definitions.")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-vue-components",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vue.js Components"),r("OutboundLink")],1),e._v(" - Common Vue.js 2 components for openEO")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-commons",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript Commons"),r("OutboundLink")],1),e._v(" - Common JavaScript functionality for openEO clients and back-ends")])])])}),[],!1,null,null,null);r.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{563:function(e,r,t){"use strict";t.r(r);var n=t(4),o=Object(n.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"software"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#software"}},[e._v("#")]),e._v(" Software")]),e._v(" "),r("p",[e._v("All developed software is organized within the "),r("a",{attrs:{href:"https://github.com/open-eo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO GitHub organization"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"clients"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#clients"}},[e._v("#")]),e._v(" Clients")]),e._v(" "),r("p",[e._v("Software that allows remote sensers and other users to access the openEO back-ends:")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Client software")]),e._v(" "),r("th",[e._v("Package Manager / Hosted Version")]),e._v(" "),r("th",[e._v("GitHub")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("JavaScript/TypeScript library")]),e._v(" "),r("td",[e._v("npm: "),r("a",{attrs:{href:"https://www.npmjs.com/package/@openeo/js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("@openeo/js-client"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-js-client"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("Python library")]),e._v(" "),r("td",[e._v("PyPI: "),r("a",{attrs:{href:"https://pypi.org/project/openeo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),r("OutboundLink")],1),e._v(" / Conda Forge: "),r("a",{attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-python-client"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("QGIS plugin")]),e._v(" "),r("td",[e._v("QGIS plugin repository: "),r("a",{attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-qgis-plugin-master"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-qgis-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-qgis-plugin"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("R library")]),e._v(" "),r("td",[e._v("CRAN: "),r("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-r-client"),r("OutboundLink")],1)])]),e._v(" "),r("tr",[r("td",[e._v("Web Editor")]),e._v(" "),r("td",[r("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Hosted Version"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-web-editor"),r("OutboundLink")],1)])])])]),e._v(" "),r("p",[e._v("See the "),r("a",{attrs:{href:e.$site.themeConfig.docPath+"getting-started.html"}},[r("strong",[e._v("getting started guide for users")])]),e._v(" for more information.\nUsers considering to implement a new client library should read the "),r("a",{attrs:{href:e.$site.themeConfig.docPath+"developers/clients/getting-started.html"}},[r("strong",[e._v("getting started guide for client developers")])]),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"back-ends"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#back-ends"}},[e._v("#")]),e._v(" Back-ends")]),e._v(" "),r("p",[e._v("Data and infrastructure providers can host their own instance of the openEO API:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GeoPySpark (Geotrellis)"),r("OutboundLink")],1),e._v(" (by VITO) - has "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-integrationtests",target:"_blank",rel:"noopener noreferrer"}},[e._v("integration tests"),r("OutboundLink")],1),e._v(", requires "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-geotrellis-extensions",target:"_blank",rel:"noopener noreferrer"}},[e._v("GeoTrellis extensions"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google Earth Engine"),r("OutboundLink")],1),e._v(" (by WWU)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-grassgis-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GRASS GIS"),r("OutboundLink")],1),e._v(" (by mundialis)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-jeodpp-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("JEODPP"),r("OutboundLink")],1),e._v(" (by JRC)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/SARScripts/openeo_odc_driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Open Data Cube"),r("OutboundLink")],1),e._v(" (by EURAC, funded by ESA)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-eodc-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Apache Airflow / eoDataReaders"),r("OutboundLink")],1),e._v(" (by EODC)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub"),r("OutboundLink")],1),e._v(" (by Sinergise)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-wcps-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("WCPS (rasdaman)"),r("OutboundLink")],1),e._v(" (by EURAC)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("R back-end"),r("OutboundLink")],1),e._v(" (by WWU) - discontinued until further notice (last version: 0.3)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/IBM/tensorlakehouse-openeo-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("TensorLakeHouse"),r("OutboundLink")],1),e._v(" (by IBM Research)")])]),e._v(" "),r("p",[e._v("See the "),r("a",{attrs:{href:e.$site.themeConfig.docPath+"developers/backends/getting-started.html"}},[r("strong",[e._v("getting started guide for back-end providers")])]),e._v(" for more information.")]),e._v(" "),r("p",[e._v("To start developing a new back-end driver, you may start with any of the common functionalities implemented in several programming languages:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-spring-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java (Spring) API Commons"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python API Commons"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-python",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Process Graph Parser"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-processgraphs",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript Process Graph Parser"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-python",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Processes"),r("OutboundLink")],1),e._v(" - many openEO processes implemented in Python")])]),e._v(" "),r("p",[e._v("Our approach to tackle language-agnostic user-defined functions can be found in the following repositories:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF Python reference implementation"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF R reference implementation"),r("OutboundLink")],1)])]),e._v(" "),r("h2",{attrs:{id:"specification"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#specification"}},[e._v("#")]),e._v(" Specification")]),e._v(" "),r("p",[e._v("The API specification is available in the "),r("strong",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-api",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API repository"),r("OutboundLink")],1)]),e._v(".\nThe process definitions are available in the "),r("strong",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO processes repository"),r("OutboundLink")],1)]),e._v(".")]),e._v(" "),r("h2",{attrs:{id:"ecosystem"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#ecosystem"}},[e._v("#")]),e._v(" Ecosystem")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-backend-validator",target:"_blank",rel:"noopener noreferrer"}},[e._v("Back-end validator"),r("OutboundLink")],1),e._v(" - Validation for back-end implementations. "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-result-validation-engine",target:"_blank",rel:"noopener noreferrer"}},[e._v("Image-based validation of EO processing results"),r("OutboundLink")],1),e._v(" is also worked on.")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),r("OutboundLink")],1),e._v(" ("),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-hub",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),r("OutboundLink")],1),e._v(") - The central platform for openEO services.")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-docgen",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes DocGen"),r("OutboundLink")],1),e._v(" - A tool to generate a visual interface for openEO process definitions.")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-vue-components",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vue.js Components"),r("OutboundLink")],1),e._v(" - Common Vue.js 2 components for openEO")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-commons",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript Commons"),r("OutboundLink")],1),e._v(" - Common JavaScript functionality for openEO clients and back-ends")])])])}),[],!1,null,null,null);r.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/12.2f8fa40f.js b/assets/js/12.ad6edf83.js similarity index 98% rename from assets/js/12.2f8fa40f.js rename to assets/js/12.ad6edf83.js index 3e048a806..aacd3e3f7 100644 --- a/assets/js/12.2f8fa40f.js +++ b/assets/js/12.ad6edf83.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12,3,16,17,25,29,37],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"j",(function(){return d})),n.d(e,"k",(function(){return f})),n.d(e,"c",(function(){return b}));const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var i=n(155),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(4),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},160:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},s=(n(161),n(4)),r=Object(s.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},163:function(t,e,n){},170:function(t,e,n){},173:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},175:function(t,e,n){"use strict";n(163)},176:function(t,e,n){"use strict";n.r(e);var i=n(201),s=n(181),r=n(155);function a(t,e){return"group"===e.type&&e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(r.e)(t,e.path))}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth"],data:()=>({openGroupIndex:0}),watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(r.e)(this.$route,t.regularPath)}}},l=n(4),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},180:function(t,e,n){"use strict";n.r(e);var i=n(159),s=n(160),r=n(50),a=n.n(r),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:s.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t}},l=(n(174),n(4)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},181:function(t,e,n){"use strict";n.r(e);var i=n(155);function s(t,e,n,i,s){const r={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(r.style={"padding-left":s+"rem"}),t("RouterLink",r,n)}function r(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(i.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,u,e.level-1),r(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(i.e)(a,u.path),h="auto"===u.type?p||u.children.some(t=>Object(i.e)(a,u.basePath+"#"+t.slug)):p,d="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,h),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),m=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[d,r(t,u.children,u.basePath,a,f)];if((h||m)&&u.headers&&!i.d.test(u.path)){return[d,r(t,Object(i.c)(u.headers),u.path,a,f)]}return d}},o=(n(175),n(4)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},184:function(t,e,n){"use strict";n(170)},190:function(t,e,n){"use strict";n(173)},191:function(t,e,n){},200:function(t,e,n){"use strict";n.r(e);var i=n(180),s={name:"NavLinks",components:{NavLink:n(159).default,DropdownLink:i.default},computed:{userLinks(){return this.$site.themeConfig.nav.map(t=>(t.userNav?(t.items=this.getNav("userNav"),t.index=Math.random()):t.devNav&&(t.items=this.getNav("devNav"),t.index=Math.random()),Object.assign(this.resolveNavLinkItem(t),{items:(t.items||[]).map(t=>this.resolveNavLinkItem(t))})))}},methods:{resolveNavLinkItem:t=>Object.assign(t,{type:t.items&&t.items.length?"links":"link"}),prepareNavLinks(t,e){if(Array.isArray(t))return t.map(t=>this.prepareNavLinks(t,e));var n=Object.assign({},t);for(var i in n)n[i]&&"object"==typeof n[i]?n[i]=this.prepareNavLinks(n[i],e):"link"!==i||n.link.match(/^(\/|[\w\d]+:)/i)||(n.link=e+n.link);return n},getNav(t){const{versions:e,defaultVersion:n}=this.$site.themeConfig;var i=e.findIndex(t=>this.$page.regularPath.startsWith(t.path));i<0&&(i=n);var s=this.prepareNavLinks(e[i][t],e[i].path);return s.push({text:"Versions",items:e.map(t=>({text:t.title,link:t.path}))}),s}}},r=(n(184),n(4)),a=Object(r.a)(s,(function(){var t=this._self._c;return this.userLinks.length?t("nav",{staticClass:"nav-links"},this._l(this.userLinks,(function(e){return t("div",{key:e.index||e.link,staticClass:"nav-item"},["links"===e.type?t("DropdownLink",{attrs:{item:e}}):t("NavLink",{attrs:{item:e}})],1)})),0):this._e()}),[],!1,null,null,null);e.default=a.exports},201:function(t,e,n){"use strict";n.r(e);var i=n(155),s={name:"SidebarGroup",components:{DropdownTransition:n(160).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(176).default},methods:{isActive:i.e}},r=(n(190),n(4)),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports},211:function(t,e,n){"use strict";n(191)},292:function(t,e,n){"use strict";n.r(e);var i=n(176),s=n(200),r={name:"Sidebar",components:{SidebarLinks:i.default,NavLinks:s.default},props:["items"]},a=(n(211),n(4)),o=Object(a.a)(r,(function(){var t=this._self._c;return t("aside",{staticClass:"sidebar"},[t("NavLinks"),this._v(" "),this._t("top"),this._v(" "),t("SidebarLinks",{attrs:{depth:0,items:this.items}}),this._v(" "),this._t("bottom")],2)}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12,3,16,17,25,30,38],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"j",(function(){return d})),n.d(e,"k",(function(){return f})),n.d(e,"c",(function(){return b}));const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var i=n(155),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(4),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},160:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},s=(n(161),n(4)),r=Object(s.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},163:function(t,e,n){},170:function(t,e,n){},173:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},175:function(t,e,n){"use strict";n(163)},176:function(t,e,n){"use strict";n.r(e);var i=n(201),s=n(181),r=n(155);function a(t,e){return"group"===e.type&&e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(r.e)(t,e.path))}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth"],data:()=>({openGroupIndex:0}),watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(r.e)(this.$route,t.regularPath)}}},l=n(4),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},180:function(t,e,n){"use strict";n.r(e);var i=n(159),s=n(160),r=n(50),a=n.n(r),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:s.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t}},l=(n(174),n(4)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},181:function(t,e,n){"use strict";n.r(e);var i=n(155);function s(t,e,n,i,s){const r={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(r.style={"padding-left":s+"rem"}),t("RouterLink",r,n)}function r(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(i.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,u,e.level-1),r(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(i.e)(a,u.path),h="auto"===u.type?p||u.children.some(t=>Object(i.e)(a,u.basePath+"#"+t.slug)):p,d="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,h),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),m=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[d,r(t,u.children,u.basePath,a,f)];if((h||m)&&u.headers&&!i.d.test(u.path)){return[d,r(t,Object(i.c)(u.headers),u.path,a,f)]}return d}},o=(n(175),n(4)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},184:function(t,e,n){"use strict";n(170)},190:function(t,e,n){"use strict";n(173)},191:function(t,e,n){},200:function(t,e,n){"use strict";n.r(e);var i=n(180),s={name:"NavLinks",components:{NavLink:n(159).default,DropdownLink:i.default},computed:{userLinks(){return this.$site.themeConfig.nav.map(t=>(t.userNav?(t.items=this.getNav("userNav"),t.index=Math.random()):t.devNav&&(t.items=this.getNav("devNav"),t.index=Math.random()),Object.assign(this.resolveNavLinkItem(t),{items:(t.items||[]).map(t=>this.resolveNavLinkItem(t))})))}},methods:{resolveNavLinkItem:t=>Object.assign(t,{type:t.items&&t.items.length?"links":"link"}),prepareNavLinks(t,e){if(Array.isArray(t))return t.map(t=>this.prepareNavLinks(t,e));var n=Object.assign({},t);for(var i in n)n[i]&&"object"==typeof n[i]?n[i]=this.prepareNavLinks(n[i],e):"link"!==i||n.link.match(/^(\/|[\w\d]+:)/i)||(n.link=e+n.link);return n},getNav(t){const{versions:e,defaultVersion:n}=this.$site.themeConfig;var i=e.findIndex(t=>this.$page.regularPath.startsWith(t.path));i<0&&(i=n);var s=this.prepareNavLinks(e[i][t],e[i].path);return s.push({text:"Versions",items:e.map(t=>({text:t.title,link:t.path}))}),s}}},r=(n(184),n(4)),a=Object(r.a)(s,(function(){var t=this._self._c;return this.userLinks.length?t("nav",{staticClass:"nav-links"},this._l(this.userLinks,(function(e){return t("div",{key:e.index||e.link,staticClass:"nav-item"},["links"===e.type?t("DropdownLink",{attrs:{item:e}}):t("NavLink",{attrs:{item:e}})],1)})),0):this._e()}),[],!1,null,null,null);e.default=a.exports},201:function(t,e,n){"use strict";n.r(e);var i=n(155),s={name:"SidebarGroup",components:{DropdownTransition:n(160).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(176).default},methods:{isActive:i.e}},r=(n(190),n(4)),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports},211:function(t,e,n){"use strict";n(191)},293:function(t,e,n){"use strict";n.r(e);var i=n(176),s=n(200),r={name:"Sidebar",components:{SidebarLinks:i.default,NavLinks:s.default},props:["items"]},a=(n(211),n(4)),o=Object(a.a)(r,(function(){var t=this._self._c;return t("aside",{staticClass:"sidebar"},[t("NavLinks"),this._v(" "),this._t("top"),this._v(" "),t("SidebarLinks",{attrs:{depth:0,items:this.items}}),this._v(" "),this._t("bottom")],2)}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/13.379b80bb.js b/assets/js/13.e06540fe.js similarity index 95% rename from assets/js/13.379b80bb.js rename to assets/js/13.e06540fe.js index b805183fe..4c8f1b3d8 100644 --- a/assets/js/13.379b80bb.js +++ b/assets/js/13.e06540fe.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{309:function(e,t,a){e.exports=a.p+"assets/img/dc_timeseries.c2c7a902.png"},310:function(e,t,a){e.exports=a.p+"assets/img/dc_flat.01dc91de.png"},311:function(e,t,a){e.exports=a.p+"assets/img/vector.201588fe.png"},312:function(e,t,a){e.exports=a.p+"assets/img/dc_filter.bdafa6d0.png"},313:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_unary.f69f840c.png"},314:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_kernel.4013a72c.png"},315:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_ts.4f9449f6.png"},316:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_dim_ts.c895aa81.png"},317:function(e,t,a){e.exports=a.p+"assets/img/dc_resample_time.987e797c.png"},318:function(e,t,a){e.exports=a.p+"assets/img/dc_resample_space.417f814b.png"},319:function(e,t,a){e.exports=a.p+"assets/img/dc_reduce.872f16c2.png"},320:function(e,t,a){e.exports=a.p+"assets/img/dc_aggregate_space.ae550945.png"},511:function(e,t,a){"use strict";a.r(t);var s=a(4),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#datacubes"}},[e._v("#")]),e._v(" Datacubes")]),e._v(" "),t("h2",{attrs:{id:"what-are-datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-are-datacubes"}},[e._v("#")]),e._v(" What are Datacubes?")]),e._v(" "),t("p",[e._v("Data is represented as datacubes in openEO, which are multi-dimensional arrays with additional information about their dimensionality. Datacubes can provide a nice and tidy interface for spatiotemporal data as well as for the operations you may want to execute on them. As they are arrays, it might be easiest to look at raster data as an example, even though datacubes can hold vector data as well. Our example data however consists of a 6x7 raster with 4 bands ["),t("code",[e._v("blue")]),e._v(", "),t("code",[e._v("green")]),e._v(", "),t("code",[e._v("red")]),e._v(", "),t("code",[e._v("near-infrared")]),e._v("] and 3 timesteps ["),t("code",[e._v("2020-10-01")]),e._v(", "),t("code",[e._v("2020-10-13")]),e._v(", "),t("code",[e._v("2020-10-25")]),e._v("], displayed here in an orderly, timeseries-like manner:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(309),alt:"Raster datacube timeseries: 12 imagery tiles are depicted, grouped by 3 dates along a timeline (time dimension). Each date has a blue, green, red and near-infrared band (bands dimension). Each single tile has the dimensions x and y (spatial dimensions)."}}),e._v(" "),t("figcaption",[e._v("An examplary raster datacube with 4 dimensions: x, y, bands and time.")])]),e._v(" "),t("p",[e._v("It is important to understand that datacubes are designed to make things easier for us, and are not literally a cube, meaning that the above plot is just as good a representation as any other. That is why we can switch the dimensions around and display them in whatever way we want, including the view below:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(310),alt:"Raster datacube flat representation: The 12 imagery tiles are now laid out flat as a 4 by 3 grid (bands by timesteps). All dimension labels are depicted (The timestamps, the band names and the x, y coordinates)."}}),e._v(" "),t("figcaption",[e._v("This is the 'raw' data collection that is our example datacube. The grayscale images are colored for understandability, and dimension labels are displayed.")])]),e._v(" "),t("p",[e._v("A vector datacube on the other hand could look like this:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(311),alt:"An examplary vector datacube with 3 dimensions: 2 geometries are given for the `geometries` dimension, along with 3 timesteps for the temporal dimension `time` and 4 bands in the `bands` dimension."}}),e._v(" "),t("figcaption",[e._v("An examplary vector datacube with 3 dimensions: 2 geometries are given for the "),t("code",[e._v("geometries")]),e._v(" dimension, along with 3 timesteps for the temporal dimension "),t("code",[e._v("time")]),e._v(" and 4 bands in the "),t("code",[e._v("bands")]),e._v(" dimension.")])]),e._v(" "),t("p",[t("a",{attrs:{href:"https://r-spatial.org/r/2022/09/12/vdc.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vector datacubes"),t("OutboundLink")],1),e._v(" and raster datacubes are common cases of datacubes in the EO domain.\nA raster datacube has at least two spatial dimensions (usually named "),t("code",[e._v("x")]),e._v(" and "),t("code",[e._v("y")]),e._v(") and a vector datacube has at least one geometry dimension (usually named "),t("code",[e._v("geometry")]),e._v(').\nThe purpose of these distinctions is simply to make it easier to describe "special" cases of datacubes, but you can also define other types such as a temporal datacube that has at least one temporal dimension (usually named '),t("code",[e._v("t")]),e._v(").")]),e._v(" "),t("p",[e._v("The following additional information are usually available for datacubes:")]),e._v(" "),t("ul",[t("li",[e._v("the dimensions (see "),t("a",{attrs:{href:"#dimensions"}},[e._v("below")]),e._v(")")]),e._v(" "),t("li",[e._v("a sampling method (see "),t("a",{attrs:{href:"#values-in-a-datacube"}},[e._v("below")]),e._v(")")]),e._v(" "),t("li",[e._v("a unit for the values")])]),e._v(" "),t("p",[e._v("All these information are usually provided through the datacube metadata.")]),e._v(" "),t("h2",{attrs:{id:"dimensions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dimensions"}},[e._v("#")]),e._v(" Dimensions")]),e._v(" "),t("p",[e._v("A dimension refers to a certain axis of a datacube. This includes all variables (e.g. bands), which are represented as dimensions. Our exemplary raster datacube has the spatial dimensions "),t("code",[e._v("x")]),e._v(" and "),t("code",[e._v("y")]),e._v(", and the temporal dimension "),t("code",[e._v("t")]),e._v(". Furthermore, it has a "),t("code",[e._v("bands")]),e._v(" dimension, extending into the realm of "),t("em",[e._v("what kind of information")]),e._v(" is contained in the cube.")]),e._v(" "),t("p",[e._v("The following properties are usually available for dimensions:")]),e._v(" "),t("ul",[t("li",[e._v("name")]),e._v(" "),t("li",[e._v("type (potential types include: spatial (raster or vector data), temporal and other data such as bands)")]),e._v(" "),t("li",[e._v("axis (for spatial dimensions) / number")]),e._v(" "),t("li",[e._v("labels (usually exposed through textual or numerical representations, in the metadata as nominal values and/or extents)")]),e._v(" "),t("li",[e._v("reference system / projection")]),e._v(" "),t("li",[e._v("resolution / step size")]),e._v(" "),t("li",[e._v("unit for the labels (either explicitly specified or implicitly provided by the reference system)")]),e._v(" "),t("li",[e._v("additional information specific to the dimension type (e.g. the geometry types for a dimension containing geometries)")])]),e._v(" "),t("p",[e._v("All these information are usually provided through the datacube metadata.")]),e._v(" "),t("p",[e._v("Here is an overview of the dimensions contained in our example raster datacube above:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("name")]),e._v(" "),t("th",[e._v("type")]),e._v(" "),t("th",[e._v("labels")]),e._v(" "),t("th",[e._v("resolution")]),e._v(" "),t("th",[e._v("reference system")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("1")]),e._v(" "),t("td",[t("code",[e._v("x")])]),e._v(" "),t("td",[e._v("spatial")]),e._v(" "),t("td",[t("code",[e._v("466380")]),e._v(", "),t("code",[e._v("466580")]),e._v(", "),t("code",[e._v("466780")]),e._v(", "),t("code",[e._v("466980")]),e._v(", "),t("code",[e._v("467180")]),e._v(", "),t("code",[e._v("467380")])]),e._v(" "),t("td",[e._v("200m")]),e._v(" "),t("td",[t("a",{attrs:{href:"https://epsg.io/32627",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPSG:32627"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("2")]),e._v(" "),t("td",[t("code",[e._v("y")])]),e._v(" "),t("td",[e._v("spatial")]),e._v(" "),t("td",[t("code",[e._v("7167130")]),e._v(", "),t("code",[e._v("7166930")]),e._v(", "),t("code",[e._v("7166730")]),e._v(", "),t("code",[e._v("7166530")]),e._v(", "),t("code",[e._v("7166330")]),e._v(", "),t("code",[e._v("7166130")]),e._v(", "),t("code",[e._v("7165930")])]),e._v(" "),t("td",[e._v("200m")]),e._v(" "),t("td",[t("a",{attrs:{href:"https://epsg.io/32627",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPSG:32627"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("3")]),e._v(" "),t("td",[t("code",[e._v("bands")])]),e._v(" "),t("td",[e._v("bands")]),e._v(" "),t("td",[t("code",[e._v("blue")]),e._v(", "),t("code",[e._v("green")]),e._v(", "),t("code",[e._v("red")]),e._v(", "),t("code",[e._v("nir")])]),e._v(" "),t("td",[e._v("4 bands")]),e._v(" "),t("td",[e._v("-")])]),e._v(" "),t("tr",[t("td",[e._v("4")]),e._v(" "),t("td",[t("code",[e._v("t")])]),e._v(" "),t("td",[e._v("temporal")]),e._v(" "),t("td",[t("code",[e._v("2020-10-01")]),e._v(", "),t("code",[e._v("2020-10-13")]),e._v(", "),t("code",[e._v("2020-10-25")])]),e._v(" "),t("td",[e._v("12 days")]),e._v(" "),t("td",[e._v("Gregorian calendar / UTC")])])])]),e._v(" "),t("p",[e._v('Dimension labels are usually either numerical or text (also known as "strings"), which also includes textual representations of timestamps or geometries for example.\nFor example, temporal labels are usually encoded as '),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/ISO_8601",target:"_blank",rel:"noopener noreferrer"}},[e._v("ISO 8601"),t("OutboundLink")],1),e._v(" compatible dates and/or times and similarly geometries can be encoded as "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry",target:"_blank",rel:"noopener noreferrer"}},[e._v("Well-known Text (WKT)"),t("OutboundLink")],1),e._v(" or be represented by their IDs.")]),e._v(" "),t("p",[e._v("Dimensions with a natural/inherent order (usually all temporal and spatial raster dimensions) are always sorted. Dimensions without inherent order (usually "),t("code",[e._v("bands")]),e._v("), retain the order in which they have been defined in metadata or processes (e.g. through "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_bands",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_bands")]),t("OutboundLink")],1),e._v("), with new labels simply being appended to the existing labels.")]),e._v(" "),t("p",[e._v("A geometry dimension is not included in the example raster datacube above and it is not used in the following examples, but to show how a vector dimension with two polygons could look like:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("name")]),e._v(" "),t("th",[e._v("type")]),e._v(" "),t("th",[e._v("labels")]),e._v(" "),t("th",[e._v("reference system")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[t("code",[e._v("geometry")])]),e._v(" "),t("td",[e._v("vector")]),e._v(" "),t("td",[t("code",[e._v("POLYGON((-122.4 37.6,-122.35 37.6,-122.35 37.64,-122.4 37.64,-122.4 37.6))")]),e._v(", "),t("code",[e._v("POLYGON((-122.51 37.5,-122.48 37.5,-122.48 37.52,-122.51 37.52,-122.51 37.5))")])]),e._v(" "),t("td",[t("a",{attrs:{href:"https://epsg.io/4326",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPSG:4326"),t("OutboundLink")],1)])])])]),e._v(" "),t("p",[e._v("A dimension with geometries can consist of points, linestrings, polygons, multi points, multi linestrings, or multi polygons.\nIt is not possible to mix geometry types, but the single geometry type with their corresponding multi type can be combined in a dimension (e.g. points and multi points).\nEmpty geometries (such as GeoJSON features with a "),t("code",[e._v("null")]),e._v(" geometry or GeoJSON geometries with an empty coordinates array) are allowed and can sometimes also be the result of certain vector operations such as a negative buffer.")]),e._v(" "),t("h3",{attrs:{id:"applying-processes-on-dimensions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applying-processes-on-dimensions"}},[e._v("#")]),e._v(" Applying Processes on Dimensions")]),e._v(" "),t("p",[e._v('Some processes are typically applied "along a dimension". You can imagine said dimension as an arrow and whatever is happening as a parallel process to that arrow. It simply means: "we focus on '),t("em",[e._v("this")]),e._v(' dimension right now".')]),e._v(" "),t("h3",{attrs:{id:"resolution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#resolution"}},[e._v("#")]),e._v(" Resolution")]),e._v(" "),t("p",[e._v("The resolution of a dimension gives information about what interval lies between observations. This is most obvious with the temporal resolution, where the intervals depict how often observations were made. Spatial resolution gives information about the pixel spacing, meaning how many 'real world meters' are contained in a pixel. The number of bands and their wavelength intervals give information about the spectral resolution.")]),e._v(" "),t("h3",{attrs:{id:"coordinate-reference-system-as-a-dimension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coordinate-reference-system-as-a-dimension"}},[e._v("#")]),e._v(" Coordinate Reference System as a Dimension")]),e._v(" "),t("p",[e._v("In the example above, "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" dimension values have a "),t("em",[e._v("unique")]),e._v(" relationship to world coordinates through their coordinate reference system (CRS). This implies that a single coordinate reference system is associated with these "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" dimensions. If we want to create a data cube from multiple tiles spanning different coordinate reference systems (e.g. Sentinel-2: different UTM zones), we would "),t("em",[e._v("have")]),e._v(" to resample/warp those to a single coordinate reference system. In many cases, this is wanted because we want to be able to "),t("em",[e._v("look")]),e._v(" at the result, meaning it is available in a single coordinate reference system.")]),e._v(" "),t("p",[e._v("Resampling is however costly, involves (some) data loss, and is in general not reversible. Suppose that we want to work only on the spectral and temporal dimensions of a data cube, and do not want to do any resampling. In that case, one could create one data cube for each coordinate reference system. An alternative would be to create one "),t("em",[e._v("single")]),e._v(" data cube containing all tiles that has an "),t("em",[e._v("additional dimension")]),e._v(" with the coordinate reference system. In that data cube, "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" no longer point to a unique world coordinate, because identical "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" coordinate pairs occur in each UTM zone. Now, only the combination ("),t("em",[e._v("x")]),e._v(", "),t("em",[e._v("y")]),e._v(", "),t("em",[e._v("crs")]),e._v(") has a unique relationship to the world coordinates.")]),e._v(" "),t("p",[e._v("On such a "),t("em",[e._v("crs-dimensioned data cube")]),e._v(", several operations make perfect sense, such as "),t("code",[e._v("apply")]),e._v(" or "),t("code",[e._v("reduce_dimension")]),e._v(" on spectral and/or temporal dimensions. A simple reduction over the "),t("code",[e._v("crs")]),e._v(" dimension, using "),t("em",[e._v("sum")]),e._v(" or "),t("em",[e._v("mean")]),e._v(' would typically not make sense. The "reduction" (removal) of the '),t("code",[e._v("crs")]),e._v(" dimension that is meaningful involves the resampling/warping of all sub-cubes for the "),t("code",[e._v("crs")]),e._v(" dimension to a single, common target coordinate reference system.")]),e._v(" "),t("h2",{attrs:{id:"values-in-a-datacube"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#values-in-a-datacube"}},[e._v("#")]),e._v(" Values in a datacube")]),e._v(" "),t("p",[e._v("openEO datacubes contain scalar values (e.g. strings, numbers or boolean values), with all other associated attributes stored in dimensions (e.g. coordinates or timestamps). Attributes such as the CRS or the sensor can also be turned into dimensions. Be advised that in such a case, the uniqueness of pixel coordinates may be affected. When usually, "),t("code",[e._v("(x, y)")]),e._v(" refers to a unique location, that changes to "),t("code",[e._v("(x, y, CRS)")]),e._v(" when "),t("code",[e._v("(x, y)")]),e._v(" values are reused in other coordinate reference systems (e.g. two neighboring UTM zones).")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Be Careful with Data Types")]),e._v(" "),t("p",[e._v("As stated above, datacubes only contain scalar values. However, implementations may differ in their ability to handle or convert them. Implementations may also not allow mixing data types in a datacube. For example, returning a boolean value for a reducer on a numerical datacube may result in an error on some back-ends. The recommendation is to not change the data type of values in a datacube unless the back-end supports it explicitly.")])]),e._v(" "),t("p",[e._v("Data cube values can be sampled in two different ways. The values are either area or point samples.")]),e._v(" "),t("ul",[t("li",[e._v("Area sampling aggregates measurements over defined regions, i.e. the grid cells for raster data or polygons/lines for vector data.")]),e._v(" "),t("li",[e._v("Point sampling collects data at specific locations, providing detailed information for specific points.")])]),e._v(" "),t("h2",{attrs:{id:"processes-on-datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes-on-datacubes"}},[e._v("#")]),e._v(" Processes on Datacubes")]),e._v(" "),t("p",[e._v("In the following part, the basic processes for manipulating datacubes are introduced.")]),e._v(" "),t("h3",{attrs:{id:"filter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#filter"}},[e._v("#")]),e._v(" Filter")]),e._v(" "),t("p",[e._v("When filtering data (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_spatial",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_spatial")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_temporal",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_temporal")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_bands",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_bands")]),t("OutboundLink")],1),e._v("), only the data that satisfies a condition is returned. For example, this condition could be a timestamp or interval, (a set of) coordinates, or specific bands. By applying filtering the datacube becomes smaller, according to the selected data.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Filtering vegetarian options from [corn, potato, pig] returns [corn, potato].\n"}},[t("code",[e._v("filter([🌽, 🥔, 🐷], isVegetarian) => [🌽, 🥔]")])])])]),e._v(" "),t("p",[e._v("In the image, the example datacube can be seen at the top with labeled dimensions. The filtering techniques are displayed separately below. On the left, the datacube is filtered temporally with the interval "),t("code",[e._v('["2020-10-15", "2020-10-27"]')]),e._v(". The result is a cube with only the rasters for the timestep that lies within that interval ("),t("code",[e._v('"2020-10-25"')]),e._v(") and unchanged bands and spatial dimensions. Likewise, the original cube is filtered for a specific band "),t("code",[e._v('["nir"]')]),e._v(" in the middle and a specific spatial region "),t("code",[e._v("[Polygon(...)]")]),e._v(" on the right.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(312),alt:"Datacube filtering: From the datacube 4 by 3 grid, arrows depict what happens if the grid is filtered. Temporal filtering results in data for one timestep with all four bands, filtering bands results in data with one band with all three timesteps, and spatial filtering results in all timesteps and bands being preserved, but all with a smaller area."}}),e._v(" "),t("figcaption",[e._v("Filtering the sample datacube. It is displayed at the top with dimensions labels. Filtered results are shown at the bottom.")])]),e._v(" "),t("h3",{attrs:{id:"apply"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#apply"}},[e._v("#")]),e._v(" Apply")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("apply*")]),e._v(" functions (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#apply",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#apply_neighborhood",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply_neighborhood")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#apply_dimension",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply_dimension")]),t("OutboundLink")],1),e._v(") employ a process on the datacube that calculates new pixel values for each pixel, based on "),t("code",[e._v("n")]),e._v(" other pixels. Please note that several programming languages use the name "),t("code",[e._v("map")]),e._v(" instead of "),t("code",[e._v("apply")]),e._v(", but they describe the same type of function.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Applying the process 'cook' to [corn, potato, pig] returns [popcorn, fries, meat]."}},[t("code",[e._v("apply([🌽, 🥔, 🐷], cook) => [🍿, 🍟, 🍖]")])])])]),e._v(" "),t("p",[e._v("For the case "),t("code",[e._v("n = 1")]),e._v(" this is called a unary function and means that only the pixel itself is considered when calculating the new pixel value. A prominent example is the "),t("code",[e._v("absolute()")]),e._v(" function, calculating the absolute value of the input pixel value.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(313),alt:"Datacube apply unary: 3 example tiles hold values below and above 0. after applying the process 'absolute', all values in the three example tiles have changed to their absolute values above 0."}}),e._v(" "),t("figcaption",[e._v("Applying an unary process. Only the pixel itself is considered for calculating the new pixel value.")])]),e._v(" "),t("p",[e._v("If "),t("code",[e._v("n")]),e._v(" is larger than 1, the function is called n-ary. In practice, this means that the pixel neighbourhood is taken into account to calculate the new pixel value. Such neighbourhoods can be of spatial and/or temporal nature. A spatial function works on a kernel that weights the surrounding pixels (e.g. smoothing values with nearby observations), a temporal function works on a time series at a certain pixel location (e.g. smoothing values over time). Combinations of types to n-dimensional neighbourhoods are also possible.")]),e._v(" "),t("p",[e._v("In the example below, an example weighted kernel (shown in the middle) is applied to the cube (via "),t("a",{attrs:{href:"https://processes.openeo.org/#apply_kernel",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply_kernel")]),t("OutboundLink")],1),e._v("). To avoid edge effects (affecting pixels on the edge of the image with less neighbours), a padding has been added in the background.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(314),alt:"Datacube apply spatial kernel: Three example tiles hold some values with a lot of variance. A spatial kernel (a cell plus it's 4 direct neighbours) is applied to all pixels, and the result appears to be spatially smoothed, with less variance."}}),e._v(" "),t("figcaption",[e._v("Applying a spatial kernel. For calculating each new pixel value, the defined weighted neighbourhood is used.")])]),e._v(" "),t("p",[e._v("Of course this also works for temporal neighbourhoods (timeseries), considering neighbours before and after a pixel. To be able to show the effect, two timesteps were added in this example figure. A moving average of window size 3 is then applied, meaning that for each pixel the average is calculated out of the previous, the next, and the timestep in question (t"),t("sub",[e._v("n-1")]),e._v(", t"),t("sub",[e._v("n")]),e._v(" and t"),t("sub",[e._v("n+1")]),e._v("). No padding was added which is why we observe edge effects (NA values are returned for t"),t("sub",[e._v("1")]),e._v(" and t"),t("sub",[e._v("5")]),e._v(", because their temporal neighbourhood is missing input timesteps).")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(315),alt:"Datacube apply temporal moving average: Smoothing is applied to 5 example tiles by calculating the mean of 3 timesteps of every single pixel. The resulting tiles for the timestamps look much more alike."}}),e._v(" "),t("figcaption",[e._v("Applying a moving average (temporal smoothing) by averaging the direct temporal neighbourhoods of pixels. No padding is used, which leads to edge effects.")])]),e._v(" "),t("p",[e._v("Alternatively, a process can also be applied along a dimension of the datacube, meaning the input is no longer a neighbourhood of some sort but all pixels along that dimension ("),t("code",[e._v("n")]),e._v(" equals the complete dimension). If a process is applied along the "),t("code",[e._v("time")]),e._v(" dimension (e.g. a breakpoint detection), the complete pixel timeseries are the input. If a process is applied along the "),t("code",[e._v("spatial")]),e._v(" dimensions (e.g. a "),t("code",[e._v("mean")]),e._v("), all pixels of an image are the input. The process is then applied to all pixels along that dimension and the dimension continues to exist. This is in contrast to "),t("a",{attrs:{href:"#reduce"}},[e._v("reduce")]),e._v(". In the image below, a "),t("code",[e._v("mean")]),e._v(" is applied to the "),t("code",[e._v("time")]),e._v(" dimension. An example pixel timeseries is highlighted by a green line and processed step-by-step.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(316),alt:"Datacube apply dimension time: The mean of all 5 timesteps is calculated for every single pixel. The resulting 5 tiles look exaclty the same, as they have been averaged."}}),e._v(" "),t("figcaption",[e._v("Applying a mean to the temporal dimension.")])]),e._v(" "),t("h3",{attrs:{id:"resample"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#resample"}},[e._v("#")]),e._v(" Resample")]),e._v(" "),t("p",[e._v("In a resampling processes (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#resample_cube_spatial",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("resample_cube_spatial")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#resample_cube_temporal",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("resample_cube_temporal")]),t("OutboundLink")],1),e._v("), the "),t("em",[e._v("layout")]),e._v(" of a certain dimension is changed into another "),t("em",[e._v("layout")]),e._v(", most likely also changing the resolution of that dimension. This is done by mapping values of the source (old) datacube to the new layout of the target (new) datacube. During that process, resolutions can be "),t("em",[e._v("upscaled")]),e._v(" or "),t("em",[e._v("downscaled")]),e._v(" (also called "),t("em",[e._v("upsampling")]),e._v(" and "),t("em",[e._v("downsampling")]),e._v("), depending on whether they have a finer or a coarser spacing afterwards. A function is then needed to translate the existing data into the new resolution. A prominent example is to reproject a datacube into the coordinate reference system of another datacube, for example in order to merge the two cubes.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Downscaling a raster image (to infinity) returns one pixel."}},[t("code",[e._v("resample(🖼️, downscale) => 🟦")])])]),e._v(" "),t("p",[t("span",{attrs:{title:"Reprojecting a globe results into a map."}},[t("code",[e._v("resample(🌍, reproject) => 🗺️")])])])]),e._v(" "),t("p",[e._v("The first figure gives an overview of temporal resampling. How exactly the input timesteps are rescaled to the output timesteps depends on the resampling function.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(317),alt:"Datacube temporal resampling (up and down): Downsampling: To a timeline-representation of the example tiles, another timeline with only 2 steps at different dates is applied. The result has tiles only at those new timesteps. In Upsampling, the existing 3 timesteps are sampled into 5 result timesteps."}}),e._v(" "),t("figcaption",[e._v("Temporal downsampling is seen on the left, upsampling on the right. The temporal layout that the cubes are resampled to is displayed in the middle.")])]),e._v(" "),t("p",[e._v("The second figure displays spatial resampling. Observe how in the upsampling process, the output datacube has not gained in information value. The resulting grid still carries the same pixel information, but in higher spatial resolution. Other upsampling methods may yield smoother results, e.g. by using interpolation.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(318),alt:"Datacube spatial resampling (up and down): Downsampling: The resulting tiles have a lower spatial resolution than the input tiles. Upsampling: The resulting tiles have a higher spatial resolution than the input tiles, but contain the same image than before (no information added)."}}),e._v(" "),t("figcaption",[e._v("Spatial resampling. The geometry which the input cube is resampled to is displayed in the middle. The output cube then contains the same information, but in the resampled spatial layout.")])]),e._v(" "),t("h3",{attrs:{id:"reduce"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reduce"}},[e._v("#")]),e._v(" Reduce")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://processes.openeo.org/#reduce_dimension",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("reduce_dimension")]),t("OutboundLink")],1),e._v(" process "),t("em",[e._v("collapses")]),e._v(" a whole dimension of the datacube. It does so by using some sort of "),t("strong",[e._v("reducer")]),e._v(", which is a function that calculates a single result from an amount of values, as e.g. "),t("code",[e._v("mean()")]),e._v(", "),t("code",[e._v("min()")]),e._v(" and "),t("code",[e._v("max()")]),e._v(" are. For example we can reduce the time dimension ("),t("code",[e._v("t")]),e._v(") of a timeseries by calculating the mean value of all timesteps for each pixel. We are left with a cube that has no time dimension, because all values of that dimension are compressed into a single mean value. The same goes for e.g. the spatial dimensions: If we calculate the mean along the "),t("code",[e._v("x")]),e._v(" and "),t("code",[e._v("y")]),e._v(" dimensions, we are left without any spatial dimensions, but a mean value for each instance that previously was a raster is returned. In the image below, the dimensions that are reduced are crossed out in the result.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Reducing [mixed greens, cucumber, tomato, onion] returns a salad."}},[t("code",[e._v("reduce([🥬, 🥒, 🍅, 🧅], prepare) => 🥗")])])])]),e._v(" "),t("p",[e._v("Think of it as a waste press that does math instead of using brute force. Given a representation of our example datacube, let's see how it is affected.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(319),alt:"Datacube reduce: Three arrows depict what happens to the 12 example tiles, if they are reduced: Reducing timesteps leads to four tiles (one for each band), and the time dimension is deleted. Reducing bands lead to one tile per timestep, and the bands dimension is deleted. Reducing spatially leads to the original 4 by 3 bands by time layout, but the result has no spatial dimension and thus, the tiles have been turned into single values, per tile."}}),e._v(" "),t("figcaption",[e._v("Overview of reducing the sample datacube. Dimensions that are reduced are crossed out in the result images. Their information value has been compressed by a reducer function.")])]),e._v(" "),t("h3",{attrs:{id:"aggregate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#aggregate"}},[e._v("#")]),e._v(" Aggregate")]),e._v(" "),t("p",[e._v("An aggregation of a datacube can be thought of as a grouped reduce. That means it consists of two steps:")]),e._v(" "),t("ol",[t("li",[e._v("Grouping via a grouping variable, i.e. spatial geometries or temporal intervals")]),e._v(" "),t("li",[e._v("Reducing these groups along the grouped dimension with a certain reducer function, e.g. calculating the mean pixel value per polygon or the maximum pixel values per month")])]),e._v(" "),t("p",[e._v("While the layout of the reduced dimension is changed, other dimensions keep their resolution and geometry. But in contrast to pure "),t("code",[e._v("reduce")]),e._v(", the dimensions along which the reducer function is applied still exist after the operation.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Aggregating different family representations with 3, 2 and 4 members with the function 'countFamilyMembers' returns [3, 2, 4]."}},[t("code",[e._v("aggregate(👪 👩‍👦 👨‍👩‍👦‍👦, countFamilyMembers) => [3️⃣, 2️⃣, 4️⃣]")])])])]),e._v(" "),t("p",[e._v("A temporal aggregation (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#aggregate_temporal",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("aggregate_temporal")]),t("OutboundLink")],1),e._v(") is similar to the downsampling process, as it can be seen in the according image above. Intervals for grouping can either be set manually, or periods can be chosen: monthly, yearly, etc. All timesteps in an interval are then collapsed via a reducer function ("),t("code",[e._v("mean")]),e._v(", "),t("code",[e._v("max")]),e._v(", etc.) and assigned to the given new labels.")]),e._v(" "),t("p",[e._v("A spatial aggregation (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#aggregate_spatial",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("aggregate_spatial")]),t("OutboundLink")],1),e._v(") works in a similar manner. Polygons, lines and points can be selected for grouping. Their spatial dimension is then reduced by a given process and thus, a vector cube is returned. The vector cube then has dimensions containing features, attributes and time. In the graphic below, the grouping is only shown for the first timestep.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(320),alt:"Datacube spatial aggregation: A line and a polygon are selected from the original example tiles. The pixels covered by these geometries are aggregated and the result consists no longer of imagery tiles but of an array with values for 2 geometries by 4 bands by 3 timesteps."}}),e._v(" "),t("figcaption",[e._v("When aggregating spatially, pixels are grouped (cut out) based on geometries, and then collapsed with a reducer function. A vector datacube is returned (as shown with dimensions names and labels). Please note that this visualization shows aggregation on a data cube with four dimensions, but "),t("code",[e._v("aggregate_spatial")]),e._v(" specifically can only handle data cubes with three dimensions as of now.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{303:function(e,t,a){e.exports=a.p+"assets/img/dc_timeseries.c2c7a902.png"},304:function(e,t,a){e.exports=a.p+"assets/img/dc_flat.01dc91de.png"},305:function(e,t,a){e.exports=a.p+"assets/img/vector.201588fe.png"},306:function(e,t,a){e.exports=a.p+"assets/img/dc_filter.bdafa6d0.png"},307:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_unary.f69f840c.png"},308:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_kernel.4013a72c.png"},309:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_ts.4f9449f6.png"},310:function(e,t,a){e.exports=a.p+"assets/img/dc_apply_dim_ts.c895aa81.png"},311:function(e,t,a){e.exports=a.p+"assets/img/dc_resample_time.987e797c.png"},312:function(e,t,a){e.exports=a.p+"assets/img/dc_resample_space.417f814b.png"},313:function(e,t,a){e.exports=a.p+"assets/img/dc_reduce.872f16c2.png"},314:function(e,t,a){e.exports=a.p+"assets/img/dc_aggregate_space.ae550945.png"},512:function(e,t,a){"use strict";a.r(t);var s=a(4),i=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#datacubes"}},[e._v("#")]),e._v(" Datacubes")]),e._v(" "),t("h2",{attrs:{id:"what-are-datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-are-datacubes"}},[e._v("#")]),e._v(" What are Datacubes?")]),e._v(" "),t("p",[e._v("Data is represented as datacubes in openEO, which are multi-dimensional arrays with additional information about their dimensionality. Datacubes can provide a nice and tidy interface for spatiotemporal data as well as for the operations you may want to execute on them. As they are arrays, it might be easiest to look at raster data as an example, even though datacubes can hold vector data as well. Our example data however consists of a 6x7 raster with 4 bands ["),t("code",[e._v("blue")]),e._v(", "),t("code",[e._v("green")]),e._v(", "),t("code",[e._v("red")]),e._v(", "),t("code",[e._v("near-infrared")]),e._v("] and 3 timesteps ["),t("code",[e._v("2020-10-01")]),e._v(", "),t("code",[e._v("2020-10-13")]),e._v(", "),t("code",[e._v("2020-10-25")]),e._v("], displayed here in an orderly, timeseries-like manner:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(303),alt:"Raster datacube timeseries: 12 imagery tiles are depicted, grouped by 3 dates along a timeline (time dimension). Each date has a blue, green, red and near-infrared band (bands dimension). Each single tile has the dimensions x and y (spatial dimensions)."}}),e._v(" "),t("figcaption",[e._v("An examplary raster datacube with 4 dimensions: x, y, bands and time.")])]),e._v(" "),t("p",[e._v("It is important to understand that datacubes are designed to make things easier for us, and are not literally a cube, meaning that the above plot is just as good a representation as any other. That is why we can switch the dimensions around and display them in whatever way we want, including the view below:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(304),alt:"Raster datacube flat representation: The 12 imagery tiles are now laid out flat as a 4 by 3 grid (bands by timesteps). All dimension labels are depicted (The timestamps, the band names and the x, y coordinates)."}}),e._v(" "),t("figcaption",[e._v("This is the 'raw' data collection that is our example datacube. The grayscale images are colored for understandability, and dimension labels are displayed.")])]),e._v(" "),t("p",[e._v("A vector datacube on the other hand could look like this:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(305),alt:"An examplary vector datacube with 3 dimensions: 2 geometries are given for the `geometries` dimension, along with 3 timesteps for the temporal dimension `time` and 4 bands in the `bands` dimension."}}),e._v(" "),t("figcaption",[e._v("An examplary vector datacube with 3 dimensions: 2 geometries are given for the "),t("code",[e._v("geometries")]),e._v(" dimension, along with 3 timesteps for the temporal dimension "),t("code",[e._v("time")]),e._v(" and 4 bands in the "),t("code",[e._v("bands")]),e._v(" dimension.")])]),e._v(" "),t("p",[t("a",{attrs:{href:"https://r-spatial.org/r/2022/09/12/vdc.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Vector datacubes"),t("OutboundLink")],1),e._v(" and raster datacubes are common cases of datacubes in the EO domain.\nA raster datacube has at least two spatial dimensions (usually named "),t("code",[e._v("x")]),e._v(" and "),t("code",[e._v("y")]),e._v(") and a vector datacube has at least one geometry dimension (usually named "),t("code",[e._v("geometry")]),e._v(').\nThe purpose of these distinctions is simply to make it easier to describe "special" cases of datacubes, but you can also define other types such as a temporal datacube that has at least one temporal dimension (usually named '),t("code",[e._v("t")]),e._v(").")]),e._v(" "),t("p",[e._v("The following additional information are usually available for datacubes:")]),e._v(" "),t("ul",[t("li",[e._v("the dimensions (see "),t("a",{attrs:{href:"#dimensions"}},[e._v("below")]),e._v(")")]),e._v(" "),t("li",[e._v("a sampling method (see "),t("a",{attrs:{href:"#values-in-a-datacube"}},[e._v("below")]),e._v(")")]),e._v(" "),t("li",[e._v("a unit for the values")])]),e._v(" "),t("p",[e._v("All these information are usually provided through the datacube metadata.")]),e._v(" "),t("h2",{attrs:{id:"dimensions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dimensions"}},[e._v("#")]),e._v(" Dimensions")]),e._v(" "),t("p",[e._v("A dimension refers to a certain axis of a datacube. This includes all variables (e.g. bands), which are represented as dimensions. Our exemplary raster datacube has the spatial dimensions "),t("code",[e._v("x")]),e._v(" and "),t("code",[e._v("y")]),e._v(", and the temporal dimension "),t("code",[e._v("t")]),e._v(". Furthermore, it has a "),t("code",[e._v("bands")]),e._v(" dimension, extending into the realm of "),t("em",[e._v("what kind of information")]),e._v(" is contained in the cube.")]),e._v(" "),t("p",[e._v("The following properties are usually available for dimensions:")]),e._v(" "),t("ul",[t("li",[e._v("name")]),e._v(" "),t("li",[e._v("type (potential types include: spatial (raster or vector data), temporal and other data such as bands)")]),e._v(" "),t("li",[e._v("axis (for spatial dimensions) / number")]),e._v(" "),t("li",[e._v("labels (usually exposed through textual or numerical representations, in the metadata as nominal values and/or extents)")]),e._v(" "),t("li",[e._v("reference system / projection")]),e._v(" "),t("li",[e._v("resolution / step size")]),e._v(" "),t("li",[e._v("unit for the labels (either explicitly specified or implicitly provided by the reference system)")]),e._v(" "),t("li",[e._v("additional information specific to the dimension type (e.g. the geometry types for a dimension containing geometries)")])]),e._v(" "),t("p",[e._v("All these information are usually provided through the datacube metadata.")]),e._v(" "),t("p",[e._v("Here is an overview of the dimensions contained in our example raster datacube above:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("#")]),e._v(" "),t("th",[e._v("name")]),e._v(" "),t("th",[e._v("type")]),e._v(" "),t("th",[e._v("labels")]),e._v(" "),t("th",[e._v("resolution")]),e._v(" "),t("th",[e._v("reference system")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("1")]),e._v(" "),t("td",[t("code",[e._v("x")])]),e._v(" "),t("td",[e._v("spatial")]),e._v(" "),t("td",[t("code",[e._v("466380")]),e._v(", "),t("code",[e._v("466580")]),e._v(", "),t("code",[e._v("466780")]),e._v(", "),t("code",[e._v("466980")]),e._v(", "),t("code",[e._v("467180")]),e._v(", "),t("code",[e._v("467380")])]),e._v(" "),t("td",[e._v("200m")]),e._v(" "),t("td",[t("a",{attrs:{href:"https://epsg.io/32627",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPSG:32627"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("2")]),e._v(" "),t("td",[t("code",[e._v("y")])]),e._v(" "),t("td",[e._v("spatial")]),e._v(" "),t("td",[t("code",[e._v("7167130")]),e._v(", "),t("code",[e._v("7166930")]),e._v(", "),t("code",[e._v("7166730")]),e._v(", "),t("code",[e._v("7166530")]),e._v(", "),t("code",[e._v("7166330")]),e._v(", "),t("code",[e._v("7166130")]),e._v(", "),t("code",[e._v("7165930")])]),e._v(" "),t("td",[e._v("200m")]),e._v(" "),t("td",[t("a",{attrs:{href:"https://epsg.io/32627",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPSG:32627"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("3")]),e._v(" "),t("td",[t("code",[e._v("bands")])]),e._v(" "),t("td",[e._v("bands")]),e._v(" "),t("td",[t("code",[e._v("blue")]),e._v(", "),t("code",[e._v("green")]),e._v(", "),t("code",[e._v("red")]),e._v(", "),t("code",[e._v("nir")])]),e._v(" "),t("td",[e._v("4 bands")]),e._v(" "),t("td",[e._v("-")])]),e._v(" "),t("tr",[t("td",[e._v("4")]),e._v(" "),t("td",[t("code",[e._v("t")])]),e._v(" "),t("td",[e._v("temporal")]),e._v(" "),t("td",[t("code",[e._v("2020-10-01")]),e._v(", "),t("code",[e._v("2020-10-13")]),e._v(", "),t("code",[e._v("2020-10-25")])]),e._v(" "),t("td",[e._v("12 days")]),e._v(" "),t("td",[e._v("Gregorian calendar / UTC")])])])]),e._v(" "),t("p",[e._v('Dimension labels are usually either numerical or text (also known as "strings"), which also includes textual representations of timestamps or geometries for example.\nFor example, temporal labels are usually encoded as '),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/ISO_8601",target:"_blank",rel:"noopener noreferrer"}},[e._v("ISO 8601"),t("OutboundLink")],1),e._v(" compatible dates and/or times and similarly geometries can be encoded as "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry",target:"_blank",rel:"noopener noreferrer"}},[e._v("Well-known Text (WKT)"),t("OutboundLink")],1),e._v(" or be represented by their IDs.")]),e._v(" "),t("p",[e._v("Dimensions with a natural/inherent order (usually all temporal and spatial raster dimensions) are always sorted. Dimensions without inherent order (usually "),t("code",[e._v("bands")]),e._v("), retain the order in which they have been defined in metadata or processes (e.g. through "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_bands",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_bands")]),t("OutboundLink")],1),e._v("), with new labels simply being appended to the existing labels.")]),e._v(" "),t("p",[e._v("A geometry dimension is not included in the example raster datacube above and it is not used in the following examples, but to show how a vector dimension with two polygons could look like:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("name")]),e._v(" "),t("th",[e._v("type")]),e._v(" "),t("th",[e._v("labels")]),e._v(" "),t("th",[e._v("reference system")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[t("code",[e._v("geometry")])]),e._v(" "),t("td",[e._v("vector")]),e._v(" "),t("td",[t("code",[e._v("POLYGON((-122.4 37.6,-122.35 37.6,-122.35 37.64,-122.4 37.64,-122.4 37.6))")]),e._v(", "),t("code",[e._v("POLYGON((-122.51 37.5,-122.48 37.5,-122.48 37.52,-122.51 37.52,-122.51 37.5))")])]),e._v(" "),t("td",[t("a",{attrs:{href:"https://epsg.io/4326",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPSG:4326"),t("OutboundLink")],1)])])])]),e._v(" "),t("p",[e._v("A dimension with geometries can consist of points, linestrings, polygons, multi points, multi linestrings, or multi polygons.\nIt is not possible to mix geometry types, but the single geometry type with their corresponding multi type can be combined in a dimension (e.g. points and multi points).\nEmpty geometries (such as GeoJSON features with a "),t("code",[e._v("null")]),e._v(" geometry or GeoJSON geometries with an empty coordinates array) are allowed and can sometimes also be the result of certain vector operations such as a negative buffer.")]),e._v(" "),t("h3",{attrs:{id:"applying-processes-on-dimensions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applying-processes-on-dimensions"}},[e._v("#")]),e._v(" Applying Processes on Dimensions")]),e._v(" "),t("p",[e._v('Some processes are typically applied "along a dimension". You can imagine said dimension as an arrow and whatever is happening as a parallel process to that arrow. It simply means: "we focus on '),t("em",[e._v("this")]),e._v(' dimension right now".')]),e._v(" "),t("h3",{attrs:{id:"resolution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#resolution"}},[e._v("#")]),e._v(" Resolution")]),e._v(" "),t("p",[e._v("The resolution of a dimension gives information about what interval lies between observations. This is most obvious with the temporal resolution, where the intervals depict how often observations were made. Spatial resolution gives information about the pixel spacing, meaning how many 'real world meters' are contained in a pixel. The number of bands and their wavelength intervals give information about the spectral resolution.")]),e._v(" "),t("h3",{attrs:{id:"coordinate-reference-system-as-a-dimension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coordinate-reference-system-as-a-dimension"}},[e._v("#")]),e._v(" Coordinate Reference System as a Dimension")]),e._v(" "),t("p",[e._v("In the example above, "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" dimension values have a "),t("em",[e._v("unique")]),e._v(" relationship to world coordinates through their coordinate reference system (CRS). This implies that a single coordinate reference system is associated with these "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" dimensions. If we want to create a data cube from multiple tiles spanning different coordinate reference systems (e.g. Sentinel-2: different UTM zones), we would "),t("em",[e._v("have")]),e._v(" to resample/warp those to a single coordinate reference system. In many cases, this is wanted because we want to be able to "),t("em",[e._v("look")]),e._v(" at the result, meaning it is available in a single coordinate reference system.")]),e._v(" "),t("p",[e._v("Resampling is however costly, involves (some) data loss, and is in general not reversible. Suppose that we want to work only on the spectral and temporal dimensions of a data cube, and do not want to do any resampling. In that case, one could create one data cube for each coordinate reference system. An alternative would be to create one "),t("em",[e._v("single")]),e._v(" data cube containing all tiles that has an "),t("em",[e._v("additional dimension")]),e._v(" with the coordinate reference system. In that data cube, "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" no longer point to a unique world coordinate, because identical "),t("em",[e._v("x")]),e._v(" and "),t("em",[e._v("y")]),e._v(" coordinate pairs occur in each UTM zone. Now, only the combination ("),t("em",[e._v("x")]),e._v(", "),t("em",[e._v("y")]),e._v(", "),t("em",[e._v("crs")]),e._v(") has a unique relationship to the world coordinates.")]),e._v(" "),t("p",[e._v("On such a "),t("em",[e._v("crs-dimensioned data cube")]),e._v(", several operations make perfect sense, such as "),t("code",[e._v("apply")]),e._v(" or "),t("code",[e._v("reduce_dimension")]),e._v(" on spectral and/or temporal dimensions. A simple reduction over the "),t("code",[e._v("crs")]),e._v(" dimension, using "),t("em",[e._v("sum")]),e._v(" or "),t("em",[e._v("mean")]),e._v(' would typically not make sense. The "reduction" (removal) of the '),t("code",[e._v("crs")]),e._v(" dimension that is meaningful involves the resampling/warping of all sub-cubes for the "),t("code",[e._v("crs")]),e._v(" dimension to a single, common target coordinate reference system.")]),e._v(" "),t("h2",{attrs:{id:"values-in-a-datacube"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#values-in-a-datacube"}},[e._v("#")]),e._v(" Values in a datacube")]),e._v(" "),t("p",[e._v("openEO datacubes contain scalar values (e.g. strings, numbers or boolean values), with all other associated attributes stored in dimensions (e.g. coordinates or timestamps). Attributes such as the CRS or the sensor can also be turned into dimensions. Be advised that in such a case, the uniqueness of pixel coordinates may be affected. When usually, "),t("code",[e._v("(x, y)")]),e._v(" refers to a unique location, that changes to "),t("code",[e._v("(x, y, CRS)")]),e._v(" when "),t("code",[e._v("(x, y)")]),e._v(" values are reused in other coordinate reference systems (e.g. two neighboring UTM zones).")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Be Careful with Data Types")]),e._v(" "),t("p",[e._v("As stated above, datacubes only contain scalar values. However, implementations may differ in their ability to handle or convert them. Implementations may also not allow mixing data types in a datacube. For example, returning a boolean value for a reducer on a numerical datacube may result in an error on some back-ends. The recommendation is to not change the data type of values in a datacube unless the back-end supports it explicitly.")])]),e._v(" "),t("p",[e._v("Data cube values can be sampled in two different ways. The values are either area or point samples.")]),e._v(" "),t("ul",[t("li",[e._v("Area sampling aggregates measurements over defined regions, i.e. the grid cells for raster data or polygons/lines for vector data.")]),e._v(" "),t("li",[e._v("Point sampling collects data at specific locations, providing detailed information for specific points.")])]),e._v(" "),t("h2",{attrs:{id:"processes-on-datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes-on-datacubes"}},[e._v("#")]),e._v(" Processes on Datacubes")]),e._v(" "),t("p",[e._v("In the following part, the basic processes for manipulating datacubes are introduced.")]),e._v(" "),t("h3",{attrs:{id:"filter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#filter"}},[e._v("#")]),e._v(" Filter")]),e._v(" "),t("p",[e._v("When filtering data (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_spatial",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_spatial")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_temporal",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_temporal")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#filter_bands",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("filter_bands")]),t("OutboundLink")],1),e._v("), only the data that satisfies a condition is returned. For example, this condition could be a timestamp or interval, (a set of) coordinates, or specific bands. By applying filtering the datacube becomes smaller, according to the selected data.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Filtering vegetarian options from [corn, potato, pig] returns [corn, potato].\n"}},[t("code",[e._v("filter([🌽, 🥔, 🐷], isVegetarian) => [🌽, 🥔]")])])])]),e._v(" "),t("p",[e._v("In the image, the example datacube can be seen at the top with labeled dimensions. The filtering techniques are displayed separately below. On the left, the datacube is filtered temporally with the interval "),t("code",[e._v('["2020-10-15", "2020-10-27"]')]),e._v(". The result is a cube with only the rasters for the timestep that lies within that interval ("),t("code",[e._v('"2020-10-25"')]),e._v(") and unchanged bands and spatial dimensions. Likewise, the original cube is filtered for a specific band "),t("code",[e._v('["nir"]')]),e._v(" in the middle and a specific spatial region "),t("code",[e._v("[Polygon(...)]")]),e._v(" on the right.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(306),alt:"Datacube filtering: From the datacube 4 by 3 grid, arrows depict what happens if the grid is filtered. Temporal filtering results in data for one timestep with all four bands, filtering bands results in data with one band with all three timesteps, and spatial filtering results in all timesteps and bands being preserved, but all with a smaller area."}}),e._v(" "),t("figcaption",[e._v("Filtering the sample datacube. It is displayed at the top with dimensions labels. Filtered results are shown at the bottom.")])]),e._v(" "),t("h3",{attrs:{id:"apply"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#apply"}},[e._v("#")]),e._v(" Apply")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("apply*")]),e._v(" functions (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#apply",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#apply_neighborhood",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply_neighborhood")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#apply_dimension",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply_dimension")]),t("OutboundLink")],1),e._v(") employ a process on the datacube that calculates new pixel values for each pixel, based on "),t("code",[e._v("n")]),e._v(" other pixels. Please note that several programming languages use the name "),t("code",[e._v("map")]),e._v(" instead of "),t("code",[e._v("apply")]),e._v(", but they describe the same type of function.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Applying the process 'cook' to [corn, potato, pig] returns [popcorn, fries, meat]."}},[t("code",[e._v("apply([🌽, 🥔, 🐷], cook) => [🍿, 🍟, 🍖]")])])])]),e._v(" "),t("p",[e._v("For the case "),t("code",[e._v("n = 1")]),e._v(" this is called a unary function and means that only the pixel itself is considered when calculating the new pixel value. A prominent example is the "),t("code",[e._v("absolute()")]),e._v(" function, calculating the absolute value of the input pixel value.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(307),alt:"Datacube apply unary: 3 example tiles hold values below and above 0. after applying the process 'absolute', all values in the three example tiles have changed to their absolute values above 0."}}),e._v(" "),t("figcaption",[e._v("Applying an unary process. Only the pixel itself is considered for calculating the new pixel value.")])]),e._v(" "),t("p",[e._v("If "),t("code",[e._v("n")]),e._v(" is larger than 1, the function is called n-ary. In practice, this means that the pixel neighbourhood is taken into account to calculate the new pixel value. Such neighbourhoods can be of spatial and/or temporal nature. A spatial function works on a kernel that weights the surrounding pixels (e.g. smoothing values with nearby observations), a temporal function works on a time series at a certain pixel location (e.g. smoothing values over time). Combinations of types to n-dimensional neighbourhoods are also possible.")]),e._v(" "),t("p",[e._v("In the example below, an example weighted kernel (shown in the middle) is applied to the cube (via "),t("a",{attrs:{href:"https://processes.openeo.org/#apply_kernel",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("apply_kernel")]),t("OutboundLink")],1),e._v("). To avoid edge effects (affecting pixels on the edge of the image with less neighbours), a padding has been added in the background.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(308),alt:"Datacube apply spatial kernel: Three example tiles hold some values with a lot of variance. A spatial kernel (a cell plus it's 4 direct neighbours) is applied to all pixels, and the result appears to be spatially smoothed, with less variance."}}),e._v(" "),t("figcaption",[e._v("Applying a spatial kernel. For calculating each new pixel value, the defined weighted neighbourhood is used.")])]),e._v(" "),t("p",[e._v("Of course this also works for temporal neighbourhoods (timeseries), considering neighbours before and after a pixel. To be able to show the effect, two timesteps were added in this example figure. A moving average of window size 3 is then applied, meaning that for each pixel the average is calculated out of the previous, the next, and the timestep in question (t"),t("sub",[e._v("n-1")]),e._v(", t"),t("sub",[e._v("n")]),e._v(" and t"),t("sub",[e._v("n+1")]),e._v("). No padding was added which is why we observe edge effects (NA values are returned for t"),t("sub",[e._v("1")]),e._v(" and t"),t("sub",[e._v("5")]),e._v(", because their temporal neighbourhood is missing input timesteps).")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(309),alt:"Datacube apply temporal moving average: Smoothing is applied to 5 example tiles by calculating the mean of 3 timesteps of every single pixel. The resulting tiles for the timestamps look much more alike."}}),e._v(" "),t("figcaption",[e._v("Applying a moving average (temporal smoothing) by averaging the direct temporal neighbourhoods of pixels. No padding is used, which leads to edge effects.")])]),e._v(" "),t("p",[e._v("Alternatively, a process can also be applied along a dimension of the datacube, meaning the input is no longer a neighbourhood of some sort but all pixels along that dimension ("),t("code",[e._v("n")]),e._v(" equals the complete dimension). If a process is applied along the "),t("code",[e._v("time")]),e._v(" dimension (e.g. a breakpoint detection), the complete pixel timeseries are the input. If a process is applied along the "),t("code",[e._v("spatial")]),e._v(" dimensions (e.g. a "),t("code",[e._v("mean")]),e._v("), all pixels of an image are the input. The process is then applied to all pixels along that dimension and the dimension continues to exist. This is in contrast to "),t("a",{attrs:{href:"#reduce"}},[e._v("reduce")]),e._v(". In the image below, a "),t("code",[e._v("mean")]),e._v(" is applied to the "),t("code",[e._v("time")]),e._v(" dimension. An example pixel timeseries is highlighted by a green line and processed step-by-step.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(310),alt:"Datacube apply dimension time: The mean of all 5 timesteps is calculated for every single pixel. The resulting 5 tiles look exaclty the same, as they have been averaged."}}),e._v(" "),t("figcaption",[e._v("Applying a mean to the temporal dimension.")])]),e._v(" "),t("h3",{attrs:{id:"resample"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#resample"}},[e._v("#")]),e._v(" Resample")]),e._v(" "),t("p",[e._v("In a resampling processes (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#resample_cube_spatial",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("resample_cube_spatial")]),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://processes.openeo.org/#resample_cube_temporal",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("resample_cube_temporal")]),t("OutboundLink")],1),e._v("), the "),t("em",[e._v("layout")]),e._v(" of a certain dimension is changed into another "),t("em",[e._v("layout")]),e._v(", most likely also changing the resolution of that dimension. This is done by mapping values of the source (old) datacube to the new layout of the target (new) datacube. During that process, resolutions can be "),t("em",[e._v("upscaled")]),e._v(" or "),t("em",[e._v("downscaled")]),e._v(" (also called "),t("em",[e._v("upsampling")]),e._v(" and "),t("em",[e._v("downsampling")]),e._v("), depending on whether they have a finer or a coarser spacing afterwards. A function is then needed to translate the existing data into the new resolution. A prominent example is to reproject a datacube into the coordinate reference system of another datacube, for example in order to merge the two cubes.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Downscaling a raster image (to infinity) returns one pixel."}},[t("code",[e._v("resample(🖼️, downscale) => 🟦")])])]),e._v(" "),t("p",[t("span",{attrs:{title:"Reprojecting a globe results into a map."}},[t("code",[e._v("resample(🌍, reproject) => 🗺️")])])])]),e._v(" "),t("p",[e._v("The first figure gives an overview of temporal resampling. How exactly the input timesteps are rescaled to the output timesteps depends on the resampling function.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(311),alt:"Datacube temporal resampling (up and down): Downsampling: To a timeline-representation of the example tiles, another timeline with only 2 steps at different dates is applied. The result has tiles only at those new timesteps. In Upsampling, the existing 3 timesteps are sampled into 5 result timesteps."}}),e._v(" "),t("figcaption",[e._v("Temporal downsampling is seen on the left, upsampling on the right. The temporal layout that the cubes are resampled to is displayed in the middle.")])]),e._v(" "),t("p",[e._v("The second figure displays spatial resampling. Observe how in the upsampling process, the output datacube has not gained in information value. The resulting grid still carries the same pixel information, but in higher spatial resolution. Other upsampling methods may yield smoother results, e.g. by using interpolation.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(312),alt:"Datacube spatial resampling (up and down): Downsampling: The resulting tiles have a lower spatial resolution than the input tiles. Upsampling: The resulting tiles have a higher spatial resolution than the input tiles, but contain the same image than before (no information added)."}}),e._v(" "),t("figcaption",[e._v("Spatial resampling. The geometry which the input cube is resampled to is displayed in the middle. The output cube then contains the same information, but in the resampled spatial layout.")])]),e._v(" "),t("h3",{attrs:{id:"reduce"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reduce"}},[e._v("#")]),e._v(" Reduce")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://processes.openeo.org/#reduce_dimension",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("reduce_dimension")]),t("OutboundLink")],1),e._v(" process "),t("em",[e._v("collapses")]),e._v(" a whole dimension of the datacube. It does so by using some sort of "),t("strong",[e._v("reducer")]),e._v(", which is a function that calculates a single result from an amount of values, as e.g. "),t("code",[e._v("mean()")]),e._v(", "),t("code",[e._v("min()")]),e._v(" and "),t("code",[e._v("max()")]),e._v(" are. For example we can reduce the time dimension ("),t("code",[e._v("t")]),e._v(") of a timeseries by calculating the mean value of all timesteps for each pixel. We are left with a cube that has no time dimension, because all values of that dimension are compressed into a single mean value. The same goes for e.g. the spatial dimensions: If we calculate the mean along the "),t("code",[e._v("x")]),e._v(" and "),t("code",[e._v("y")]),e._v(" dimensions, we are left without any spatial dimensions, but a mean value for each instance that previously was a raster is returned. In the image below, the dimensions that are reduced are crossed out in the result.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Reducing [mixed greens, cucumber, tomato, onion] returns a salad."}},[t("code",[e._v("reduce([🥬, 🥒, 🍅, 🧅], prepare) => 🥗")])])])]),e._v(" "),t("p",[e._v("Think of it as a waste press that does math instead of using brute force. Given a representation of our example datacube, let's see how it is affected.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(313),alt:"Datacube reduce: Three arrows depict what happens to the 12 example tiles, if they are reduced: Reducing timesteps leads to four tiles (one for each band), and the time dimension is deleted. Reducing bands lead to one tile per timestep, and the bands dimension is deleted. Reducing spatially leads to the original 4 by 3 bands by time layout, but the result has no spatial dimension and thus, the tiles have been turned into single values, per tile."}}),e._v(" "),t("figcaption",[e._v("Overview of reducing the sample datacube. Dimensions that are reduced are crossed out in the result images. Their information value has been compressed by a reducer function.")])]),e._v(" "),t("h3",{attrs:{id:"aggregate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#aggregate"}},[e._v("#")]),e._v(" Aggregate")]),e._v(" "),t("p",[e._v("An aggregation of a datacube can be thought of as a grouped reduce. That means it consists of two steps:")]),e._v(" "),t("ol",[t("li",[e._v("Grouping via a grouping variable, i.e. spatial geometries or temporal intervals")]),e._v(" "),t("li",[e._v("Reducing these groups along the grouped dimension with a certain reducer function, e.g. calculating the mean pixel value per polygon or the maximum pixel values per month")])]),e._v(" "),t("p",[e._v("While the layout of the reduced dimension is changed, other dimensions keep their resolution and geometry. But in contrast to pure "),t("code",[e._v("reduce")]),e._v(", the dimensions along which the reducer function is applied still exist after the operation.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Simplified")]),e._v(" "),t("p",[t("span",{attrs:{title:"Aggregating different family representations with 3, 2 and 4 members with the function 'countFamilyMembers' returns [3, 2, 4]."}},[t("code",[e._v("aggregate(👪 👩‍👦 👨‍👩‍👦‍👦, countFamilyMembers) => [3️⃣, 2️⃣, 4️⃣]")])])])]),e._v(" "),t("p",[e._v("A temporal aggregation (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#aggregate_temporal",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("aggregate_temporal")]),t("OutboundLink")],1),e._v(") is similar to the downsampling process, as it can be seen in the according image above. Intervals for grouping can either be set manually, or periods can be chosen: monthly, yearly, etc. All timesteps in an interval are then collapsed via a reducer function ("),t("code",[e._v("mean")]),e._v(", "),t("code",[e._v("max")]),e._v(", etc.) and assigned to the given new labels.")]),e._v(" "),t("p",[e._v("A spatial aggregation (e.g. "),t("a",{attrs:{href:"https://processes.openeo.org/#aggregate_spatial",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("aggregate_spatial")]),t("OutboundLink")],1),e._v(") works in a similar manner. Polygons, lines and points can be selected for grouping. Their spatial dimension is then reduced by a given process and thus, a vector cube is returned. The vector cube then has dimensions containing features, attributes and time. In the graphic below, the grouping is only shown for the first timestep.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(314),alt:"Datacube spatial aggregation: A line and a polygon are selected from the original example tiles. The pixels covered by these geometries are aggregated and the result consists no longer of imagery tiles but of an array with values for 2 geometries by 4 bands by 3 timesteps."}}),e._v(" "),t("figcaption",[e._v("When aggregating spatially, pixels are grouped (cut out) based on geometries, and then collapsed with a reducer function. A vector datacube is returned (as shown with dimensions names and labels). Please note that this visualization shows aggregation on a data cube with four dimensions, but "),t("code",[e._v("aggregate_spatial")]),e._v(" specifically can only handle data cubes with three dimensions as of now.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/14.e7a67dc1.js b/assets/js/14.256f3323.js similarity index 99% rename from assets/js/14.e7a67dc1.js rename to assets/js/14.256f3323.js index 35da212c7..a217c6a69 100644 --- a/assets/js/14.e7a67dc1.js +++ b/assets/js/14.256f3323.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14,21,24],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"j",(function(){return d})),n.d(e,"k",(function(){return h})),n.d(e,"c",(function(){return v}));const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function p(t){if(u(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return a.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function d(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},167:function(t,e){t.exports=function(t){return null==t}},171:function(t,e,n){},172:function(t,e,n){},186:function(t,e,n){"use strict";n(171)},187:function(t,e,n){var r=n(6),i=n(1),a=n(5);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},188:function(t,e,n){"use strict";n(172)},189:function(t,e,n){},205:function(t,e,n){"use strict";n.r(e);var r=n(167),i=n.n(r),a=n(155),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=i()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:r="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,r,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,r,i){if(/bitbucket.org/.test(t)){return(a.i.test(e)?e:t).replace(a.a,"")+"/src"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i+`?mode=edit&spa=0&at=${r}&fileviewer=file-view-default`}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}}},o=(n(186),n(4)),u=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v("\n "+t._s(t.editLinkText)+"\n "),e("OutboundLink")],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e(),t._v(" "),e("div",{staticClass:"license"},[t._v("\n This documentation is licensed under the\n "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo.org/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t._v("\n Apache License, Version 2.0\n "),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=u.exports},206:function(t,e,n){"use strict";n.r(e);var r=n(155),i=n(187),a=n.n(i),s=n(167),o=n.n(s),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return l(c.PREV,this)},next(){return l(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function l(t,{$themeConfig:e,$page:n,$route:i,$site:s,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:l,getPageLinkConfig:p}=t,f=l(e),d=p(n),h=o()(d)?f:d;return!1===h?void 0:a()(h)?Object(r.j)(s.pages,h,i.path):c(n,u)}function p(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;rfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},167:function(t,e){t.exports=function(t){return null==t}},171:function(t,e,n){},172:function(t,e,n){},186:function(t,e,n){"use strict";n(171)},187:function(t,e,n){var r=n(6),i=n(1),a=n(5);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},188:function(t,e,n){"use strict";n(172)},189:function(t,e,n){},205:function(t,e,n){"use strict";n.r(e);var r=n(167),i=n.n(r),a=n(155),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=i()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:r="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,r,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,r,i){if(/bitbucket.org/.test(t)){return(a.i.test(e)?e:t).replace(a.a,"")+"/src"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i+`?mode=edit&spa=0&at=${r}&fileviewer=file-view-default`}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}}},o=(n(186),n(4)),u=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v("\n "+t._s(t.editLinkText)+"\n "),e("OutboundLink")],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e(),t._v(" "),e("div",{staticClass:"license"},[t._v("\n This documentation is licensed under the\n "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo.org/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t._v("\n Apache License, Version 2.0\n "),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=u.exports},206:function(t,e,n){"use strict";n.r(e);var r=n(155),i=n(187),a=n.n(i),s=n(167),o=n.n(s),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return l(c.PREV,this)},next(){return l(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function l(t,{$themeConfig:e,$page:n,$route:i,$site:s,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:l,getPageLinkConfig:p}=t,f=l(e),d=p(n),h=o()(d)?f:d;return!1===h?void 0:a()(h)?Object(r.j)(s.pages,h,i.path):c(n,u)}function p(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;r Manage and Install Plugins). Note that you have to activate the option to show experimental\nplugins (Settings -> Show also experimental plugins). After that, you can search for\n"OpenEO", install and activate the plugin.')]),e._v(" "),t("li",[e._v("The "),t("strong",[e._v("latest version")]),e._v(" is accessible at the\n"),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-qgis-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub repository"),t("OutboundLink")],1),e._v('. First, download the repository as zip archive.\nNow, open the plugin manager of QGIS (Plugins -> Manage and Install Plugins) and select "Install from ZIP".\nThere you can browse for the downloaded zip archive, install and activate it.')])]),e._v(" "),t("p",[e._v("This tutorial shows the capabilities of version 0.9.2. Make sure you have installed at least that version by checking in\nthe plugin manager.")]),e._v(" "),t("p",[e._v("After successfully installing and activating the plugin, the openEO logo should be part of the toolbar:")]),e._v(" "),t("p",[t("img",{attrs:{src:o(324),alt:"QGIS Plugin Icon"}})]),e._v(" "),t("p",[e._v("Simply click on the icon to start the plugin.")]),e._v(" "),t("h2",{attrs:{id:"connecting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting"}},[e._v("#")]),e._v(" Connecting")]),e._v(" "),t("p",[e._v("The first window you see when starting the plugin is a login dialog, since you can only access your jobs at the backend\nif you are authenticated. The backend dropdown menu contains the available openEO backends from\nthe "),t("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),t("OutboundLink")],1),e._v('. By default, the plugin chooses the latest compatible version from the\nselected provider. If you want to connect to a specific version of a backend, you need to uncheck\nthe checkbox labeled "Only Latest versions". You can also manually type a backend url into the selection\nfield, in case it is not registered at our hub yet.')]),e._v(" "),t("p",[t("img",{attrs:{src:o(325),alt:"QGIS Login Dialog"}})]),e._v(" "),t("p",[e._v("Now that you have chosen a backend, you can log in with your username and password provided by the backend.\nNote that the QGIS plugin only supports Basic authentication and not "),t("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" yet.\nBackends that do not support this authentication can not be accessed via this plugin at the moment.")]),e._v(" "),t("p",[e._v("If logged in successfully, the main window of the plugin appears with three tabs ("),t("strong",[e._v("Backend Info")]),e._v(", "),t("strong",[e._v("Jobs")]),e._v(", "),t("strong",[e._v("Services")]),e._v(").\nThe following sections will go through the capabilities of these tabs.")]),e._v(" "),t("h2",{attrs:{id:"exploring-a-backend"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-backend"}},[e._v("#")]),e._v(" Exploring a backend")]),e._v(" "),t("p",[e._v("The first tab shows information about the backend and the available collections and processes.\nOn the top, there is a basic description about the backend you are connected to.\nNext, you can choose a collection in the drop down menu to see a description of that dataset.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(326),alt:"QGIS Backend Info"}})]),e._v(" "),t("p",[e._v("On the bottom, you can use the drop down menu to choose one of the available processes from the backend.\nAfter selection, the parameters of the process are listed in the table below. The first column contains the\nparameter name, which is required if bold and otherwise optional.\nThe second column shows the type of the parameter (e.g. number) and the third column a short description.\nTo learn more about the process, you can click on the info button next to the drop down menu\n(marked red in the figure above). The return type of the process is written next to the info box. If you want to get an\noverview of all processes of openEO you might visit the "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[e._v("official processes page")]),e._v(", but note that not all backends\nwill implement all processes listed there, whereas only available processes of the backend are in the QGIS plugin.")],1),e._v(" "),t("h2",{attrs:{id:"job-management"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#job-management"}},[e._v("#")]),e._v(" Job Management")]),e._v(" "),t("p",[e._v('The "Jobs" tab lists all of your '),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[e._v("jobs")]),e._v("\nat the backend. In openEO a job describes what the backend needs to process\n(e.g. by defining a "),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[e._v("process graph")]),e._v(") as well as\nadditional meta-information (e.g. title, creation date). The first two columns show the title and the creation date of\nthe job. The other elements of the table are numbered in the screenshot and described in the following.")],1),e._v(" "),t("p",[t("img",{attrs:{src:o(327),alt:"QGIS Jobs"}})]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Status")]),e._v(' - Shows the current lifecycle state of the job. The first status of a job is "created",\nif it got created at the backend, but not executed yet. After the job gets executed it will be\n"queued" if the backend plans to executes it, but has not started yet. If the execution started but hasn\'t finished yet,\nit has the status of "running". Last but not least it will have either "canceled", if it was stopped during execution,\n"finished" if the execution was successfully or "error", if an error occurred during execution.')]),e._v(" "),t("li",[t("strong",[e._v("Execute")]),e._v(' - By clicking on the "Play" button, the plugin will start the execution of the job at the backend.\nAlready finished jobs are executed again. The icon of the button will change if the job is in the "running" state,\nso that it looks like a "Stop" button, which will cancel the job execution.')]),e._v(" "),t("li",[t("strong",[e._v("Display")]),e._v(' - By clicking on the "Eye" button, the plugin downloads the resulting image(s) of the job from the backend\nand creates a new layer in QGIS named after the title and the creation date of the image. Note that if the result\nis not geo referenced, you might get a dialog from QGIS to choose a coordinate reference system, therefore it is\nrecommended to choose GeoTiff as job output format if available at the backend.')]),e._v(" "),t("li",[t("strong",[e._v("Save")]),e._v(' - By clicking on the "Download" button, you can navigate to the folder where you want to store the\nresulting image(s) of the job and the plugin will download it there.')]),e._v(" "),t("li",[t("strong",[e._v("Adapt")]),e._v(' - By clicking on the "Pencil" button a new dialog appears, where you can adapt the job title and\ndescription as well as the processes and extent of the job. How this works in detail is described in the following sections.')]),e._v(" "),t("li",[t("strong",[e._v("Information")]),e._v(' - By clicking on the "Info" button a window with additional information about the job appears.\nIt contains information like a description, a cost plan etc., of course only if this information is provided by the\nbackend. If the backend provides a logging output, it is also part of this info window.')]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(' - By clicking on the "Trash" button the job gets deleted from the backend, after being asked if you are\nreally sure about it.')]),e._v(" "),t("li",[t("strong",[e._v("Load Job from openEO Hub")]),e._v(" - At the moment it is recommended to not use this feature, since the exchange of\nprocess graphs in the OpenEO Hub is under development.")]),e._v(" "),t("li",[t("strong",[e._v("Create new Job in Web Editor")]),e._v(" - This button opens the "),t("a",{attrs:{href:"https://editor.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO web editor"),t("OutboundLink")],1),e._v(" in your\nsystem browser, so that you can create a new job using it. This is the recommended way for creating a new job, since it has\na graphical and therefore more convenient way of doing so.")]),e._v(" "),t("li",[t("strong",[e._v("Create new Job")]),e._v(" - You can create a job from scratch using this button.\nMore information in the next sections.")]),e._v(" "),t("li",[t("strong",[e._v("Refresh Table")]),e._v(" - This button refreshes the list of jobs manually, in general the list will refresh every few\nseconds. If you do not want to automatically refresh the list (it might cause some lags if the connection to the\nbackend is low) you can do so by deactivating the checkbox next to the refresh button.")]),e._v(" "),t("li",[t("strong",[e._v("User Manual")]),e._v(" - This button opens your browser with this introduction page.")])]),e._v(" "),t("h3",{attrs:{id:"creating-new-jobs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-new-jobs"}},[e._v("#")]),e._v(" Creating new Jobs")]),e._v(" "),t("p",[e._v("There are three approaches to create a new job using this plugin, depending on whether you want to start from scratch or just\nchange existing jobs:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("From scratch with web editor")]),e._v(" - As described in the job table overview above, there is a button (no. 9) that opens\nyour web browser with the "),t("a",{attrs:{href:"https://editor.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO web editor"),t("OutboundLink")],1),e._v(". It is the recommended way to create a new job\nfrom scratch, since it has a very convenient graphical user interface. It also shows the process graph in a neat graph\nbased manner for a better understanding of how processes are connected.")]),e._v(" "),t("li",[t("strong",[e._v("From scratch with QGIS")]),e._v(' - If you want to use the QGIS plugin, you can create a new job using the\nbutton (no. 10) of the job overview dialog. It opens the job adaption window (more details in the section below).\nIn the beginning the job has already a "load_collection" process as a starting point.')]),e._v(" "),t("li",[t("strong",[e._v("From existing Job")]),e._v(" - You can create a new job by adapting\none of your existing jobs at the backend. You can e.g. create a new job with a different spatial extent, or\nadding a few processes to the original one. To do so, you need to click on the edit button in the job overview window (no. 5)")])]),e._v(" "),t("h3",{attrs:{id:"adapting-existing-jobs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adapting-existing-jobs"}},[e._v("#")]),e._v(" Adapting existing Jobs")]),e._v(" "),t("p",[e._v("In this section you'll get an overview of the job adaption workflow using the job adaption window.\nHow you get there was described in the previous section.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(328),alt:"QGIS Adapting Job"}})]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Job Title")]),e._v(" - Here you can write the title of the job. It is recommended to choose it in a way that\nmakes you identify the job in a list more easily.")]),e._v(" "),t("li",[t("strong",[e._v("Job Description")]),e._v(" - You can describe the job in more detail in this field (e.g. what is calculated and how).")]),e._v(" "),t("li",[t("strong",[e._v("Process Graph Table")]),e._v(" - In the process graph table you can see a list of all processes used by the job.\nThe first column contains the identifier of the process node, so a unique identifier of the process throughout the\nwhole process graph (e.g. loadcollection1). Most openEO clients generate these identifiers automatically. We define a\nprocess node (or just node) as one element of the process graph, so a single executed process."),t("br"),e._v('\nIn the second column you can see the name/identifier of the process (e.g. load_collection), which needs to be one of the\nprocesses that the backend provides. The third column shows the node identifier of the predecessor node.\nFor example, "loadcollection1" in the second row means that the output of the node with id "loadcollection1" is the input\nof the node with id "reducedimension1". In other words the process of the second row uses the output of the process of\nthe first row and is therefore executed after the first process.')]),e._v(" "),t("li",[t("strong",[e._v("Process Edit")]),e._v(' - When pressing on the "pencil" button, the process of the same row is loaded into the process\ntable on the right (see no. 6). On this table you can adapt the arguments of the chosen process and therefore configure\nits behaviour.')]),e._v(" "),t("li",[t("strong",[e._v("Delete Process")]),e._v(' - Clicking on the "trash" button deletes the selected process from the process graph.\nNote that other processes, which have this process as predecessor might fail after the deletion.')]),e._v(" "),t("li",[t("strong",[e._v("Undo Changes")]),e._v(" - Press this button if you want to undo all your changes on the job.")]),e._v(" "),t("li",[t("strong",[e._v("Raw Graph")]),e._v(' - Press this button to see the raw process graph (JSON format) in a pop up window. Changes to the\nprocess graph are also applied if you click "Apply". Therefore, you can also copy and paste here a complete process graph'),t("br"),e._v("\ninto the QGIS plugin.")]),e._v(" "),t("li",[t("strong",[e._v("Add Process")]),e._v(' - If you want to add a new process to the process graph you can select one at the drop down menu\n(see "Select a process") and press the button labeled "Add Process". The text field on the right will be the new node id\nand it is autogenerated after selecting a process, but can also be manually defined by typing it into the text field. Note\nthat it has to be unique within the job, otherwise the plugin shows an error message.\nOnce added, the id can not be modified.')]),e._v(" "),t("li",[t("strong",[e._v("Process Table")]),e._v(" - In this table you see all arguments of the currently selected process, the expected type and\nthe current value. If the name of the argument is bold, it is a required argument, hence it must be set.\nYou can edit the values of the arguments directly in the text field of the value column. For some arguments the plugin\nprovides helper function in the fourth column of the process table (e.g. drop down menu of all available collections in\nthe first row)")]),e._v(" "),t("li",[t("strong",[e._v("Process Argument Helper")]),e._v(" - For some arguments of a process, the QGIS Plugin provides helper functions to make the\nadaption of the arguments easier. This is the case, if the field of the fourth column in the process table is\nnot empty.")]),e._v(" "),t("li",[t("strong",[e._v("Result Process")]),e._v(' - This checkbox needs to be checked on the last process of the process graph. It tells the\nbackend that the result of the checked process is the output of the job (usually a "save_result" process). Note that\nonly one process of the process graph can be a result node. If you create a sub process graph in the process graph\n(e.g. when using apply or reduce), it also needs to have exactly one resulting process.')]),e._v(" "),t("li",[t("strong",[e._v("Clone Process")]),e._v(' - When clicking on this button, a clone of the currently selected node gets created and loaded\ninto the process table on the right. Note that clicking on this button does not add it to the job already, so you need to\npress on the "Add Process" button to do so.')]),e._v(" "),t("li",[t("strong",[e._v("Save Process")]),e._v(" - Changes on the process arguments are not stored in the process graph until this button is pressed.\nYou can see if there are unsaved changes if this button is enabled, otherwise it is disabled (see screenshot).")]),e._v(" "),t("li",[t("strong",[e._v("Manage Job")]),e._v(' - In this section of the adaption dialog, there are three options to handle changes on the job.\nFirst, by pressing on "Adapt Job" the selected job will be adapted to the changes you did and no new job will be created.\nSecond, by pressing on "Create New Job" a new job will be created at the backend, so if you have selected a job before\nfor the adaption, it will stay unchanged and your changes will just be applied to the newly created job.\nThird, the "Cancel" button closes the job adaption dialog with your changes having no effect. The same behaviour applies\nby closing the dialog.')])]),e._v(" "),t("h4",{attrs:{id:"process-argument-helper"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#process-argument-helper"}},[e._v("#")]),e._v(" Process Argument Helper")]),e._v(" "),t("p",[e._v("For some process arguments the QGIS plugin provides helper functions for a more convenient editing.\nThis section provides a list of the available helper functions and how to use them:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Collection Id")]),e._v(' - Whenever an argument expects a collection id (e.g. "load_collection" process), the plugin shows a\ndrop down menu with all available collections of the backend. There you can select one and it will be put into the\narguments value.')]),e._v(" "),t("li",[t("strong",[e._v("Spatial Extent")]),e._v(" - Edit buttons of arguments which expect a spatial extent (e.g. geojson, bounding-box) open a\nspatial extent dialog:")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(329),alt:"QGIS Edit spatial extent"}})]),e._v(" "),t("p",[e._v('On the bottom you can edit the spatial extent manually in the text box. In the drop down menu on the top you can choose\nhow to select the spatial extent. You can get the extent of the current layer, the extent of a shape file, the extent of\nthe current QGIS map canvas, by drawing a rectangle on the QGIS map canvas or by drawing a polygon on the QGIS map\ncanvas. The drawings start after clicking on the "Draw Extent" button, so that your curser becomes a cross to draw on\nthe map. After pressing the "OK" button, the extent string in the text field is set to the process argument and the\nwindow closes.')]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Temporal Extent")]),e._v(" - If an argument expects a start and end date, the edit button opens a calendar dialog:")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(330),alt:"QGIS Edit temporal extent"}})]),e._v(" "),t("p",[e._v("The left calendar sets the start date and the right calendar the end date.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Band selection")]),e._v(" - If an argument expects a selection of bands, the edit button opens the following dialog to choose\nfrom the bands available at the selected collection. Note that it always lists all bands of the collection even if some\nbands are filtered by previous processes and therefore not available in the datacube anymore.")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(331),alt:"QGIS Edit band selection"}})]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Process Graph Node")]),e._v(' - If an argument expects a raster data cube, a drop down menu will appear on the edit column.\nThere you can choose from existing process graph nodes (e.g. "loadcollection1") It uses the output of the given node\nidentifier as input of the process argument.')]),e._v(" "),t("li",[t("strong",[e._v("Sub Process Graph")]),e._v(" - Some processes need a whole (sub-)process graph as input value (e.g. apply or reduce\nprocesses). When clicking on the edit button, the plugin opens a new adaption window, which looks similar to the job\nadaption window, but shows the sub process graph:")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(332),alt:"QGIS Edit sub process graph"}})]),e._v(" "),t("p",[e._v('In this window you can adapt the sub process graph in the same way as the original process graph. After pressing on\n"Adapt", the changes are written to the original job. Process arguments, which do not have special editing fields,\nhave a "Proc-Param" button. If pressed it will forward the input data of the parent node\n(so the one with the subgraph as attribute) to the selected argument (see screenshot "data" argument). Note that the\nsub process graph also needs to have at least one result node.')]),e._v(" "),t("h2",{attrs:{id:"service-management"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#service-management"}},[e._v("#")]),e._v(" Service Management")]),e._v(" "),t("p",[e._v('The "Services" tab lists all of your '),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[e._v("secondary web services")]),e._v("\nat the backend. In openEO a secondary service has a process graph like a job, but depending on the service type it is\npossible for the user to change the viewing extent dynamically. The first two columns shows the title, the description\nand the date and time it got created at the backend.\nThe other elements of this window are numbered at the screenshot below and described in the following.")],1),e._v(" "),t("p",[t("img",{attrs:{src:o(333),alt:"QGIS Services"}})]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Display")]),e._v(' - When clicking on the "Eye", the secondary service gets loaded into a new QGIS layer, named after the\nservice. QGIS now fetches the result of the processing into the current extent of the QGIS map canvas. Note that it will\nload the whole screen at once, so it might take a while.')]),e._v(" "),t("li",[t("strong",[e._v("Information")]),e._v(" - Clicking on the Infobox, shows detailed information about the service.")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(" - Clicking on the delete button removes the service from the backend.")]),e._v(" "),t("li",[t("strong",[e._v("Create from job")]),e._v(' - By clicking on this button you can create a new service from one of your jobs. It will create a\nservice with the same process graph as the selected job, but the extent will be dynamically loaded via the service. By\nclicking on the button a new dialog pops up. On the creation dialog you can set a title and a description text, but note\nthat they are optional. Nevertheless, you have to select a job and choose a type of secondary service. The drop down\nmenu of the service types contains only the ones supported by your backend. By clicking on "Create Service" the\nplugin creates the service on the backend, so you should be able to see it on the table. Note that the list of jobs\ncontains only successfully executed jobs (e.g. with "finished" status). By clicking on "Raw Graph"\n'),t("img",{attrs:{src:o(334),alt:"QGIS Create Services from job"}})]),e._v(" "),t("li",[t("strong",[e._v("Create from web editor")]),e._v(" - Similarly to the job table overview, this button opens your web browser with\nthe "),t("a",{attrs:{href:"https://editor.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO web editor"),t("OutboundLink")],1),e._v(". There you can create new services via the editor or from your jobs.")]),e._v(" "),t("li",[t("strong",[e._v("Refresh Table")]),e._v(" - Similar to the jobs table, this button refreshes the list of services manually, in general the list will refresh every few\nseconds. If you do not want to automatically refresh the list (it might cause some lags if the connection to the\nbackend is low) you can do so by deactivating the checkbox next to the refresh button.")]),e._v(" "),t("li",[t("strong",[e._v("Create from web editor")]),e._v(" - This button opens your browser with this introduction page.")])]),e._v(" "),t("h2",{attrs:{id:"additional-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[e._v("#")]),e._v(" Additional Information")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-qgis-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github Repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank",rel:"noopener noreferrer"}},[e._v("QGIS Plugin Page"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{325:function(e,t,o){e.exports=o.p+"assets/img/qgis_button.2b5f39a5.png"},326:function(e,t,o){e.exports=o.p+"assets/img/login_dialog.424c4b4e.png"},327:function(e,t,o){e.exports=o.p+"assets/img/backend_info.a00e7a1d.png"},328:function(e,t,o){e.exports=o.p+"assets/img/jobs.fef9e692.png"},329:function(e,t,o){e.exports=o.p+"assets/img/adapt_job.64ea4b55.png"},330:function(e,t,o){e.exports=o.p+"assets/img/edit_spatial.23df03fa.png"},331:function(e,t,o){e.exports=o.p+"assets/img/edit_temporal.609c87e2.png"},332:function(e,t,o){e.exports=o.p+"assets/img/edit_bands.d9ed77a5.png"},333:function(e,t,o){e.exports=o.p+"assets/img/edit_subpg.c7fbfd4d.png"},334:function(e,t,o){e.exports=o.p+"assets/img/services.a958fd61.png"},335:function(e,t,o){e.exports=o.p+"assets/img/services_create.0881f2cd.png"},533:function(e,t,o){"use strict";o.r(t);var n=o(4),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"qgis-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#qgis-plugin"}},[e._v("#")]),e._v(" QGIS Plugin")]),e._v(" "),t("p",[e._v("The openEO QGIS plugin enables exploring openEO backends as well as execute and modify your jobs at an backend\nwithin QGIS. The plugin can load the results of a job execution to the QGIS map, so that the user can make further\nanalyses and visualisation steps.")]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("p",[e._v("There are two different versions of the QGIS Plugin available:")]),e._v(" "),t("ol",[t("li",[e._v("The "),t("strong",[e._v("latest stable version")]),e._v(' is accessible in the plugin\nmanager of QGIS (Plugins -> Manage and Install Plugins). Note that you have to activate the option to show experimental\nplugins (Settings -> Show also experimental plugins). After that, you can search for\n"OpenEO", install and activate the plugin.')]),e._v(" "),t("li",[e._v("The "),t("strong",[e._v("latest version")]),e._v(" is accessible at the\n"),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-qgis-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub repository"),t("OutboundLink")],1),e._v('. First, download the repository as zip archive.\nNow, open the plugin manager of QGIS (Plugins -> Manage and Install Plugins) and select "Install from ZIP".\nThere you can browse for the downloaded zip archive, install and activate it.')])]),e._v(" "),t("p",[e._v("This tutorial shows the capabilities of version 0.9.2. Make sure you have installed at least that version by checking in\nthe plugin manager.")]),e._v(" "),t("p",[e._v("After successfully installing and activating the plugin, the openEO logo should be part of the toolbar:")]),e._v(" "),t("p",[t("img",{attrs:{src:o(325),alt:"QGIS Plugin Icon"}})]),e._v(" "),t("p",[e._v("Simply click on the icon to start the plugin.")]),e._v(" "),t("h2",{attrs:{id:"connecting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting"}},[e._v("#")]),e._v(" Connecting")]),e._v(" "),t("p",[e._v("The first window you see when starting the plugin is a login dialog, since you can only access your jobs at the backend\nif you are authenticated. The backend dropdown menu contains the available openEO backends from\nthe "),t("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),t("OutboundLink")],1),e._v('. By default, the plugin chooses the latest compatible version from the\nselected provider. If you want to connect to a specific version of a backend, you need to uncheck\nthe checkbox labeled "Only Latest versions". You can also manually type a backend url into the selection\nfield, in case it is not registered at our hub yet.')]),e._v(" "),t("p",[t("img",{attrs:{src:o(326),alt:"QGIS Login Dialog"}})]),e._v(" "),t("p",[e._v("Now that you have chosen a backend, you can log in with your username and password provided by the backend.\nNote that the QGIS plugin only supports Basic authentication and not "),t("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" yet.\nBackends that do not support this authentication can not be accessed via this plugin at the moment.")]),e._v(" "),t("p",[e._v("If logged in successfully, the main window of the plugin appears with three tabs ("),t("strong",[e._v("Backend Info")]),e._v(", "),t("strong",[e._v("Jobs")]),e._v(", "),t("strong",[e._v("Services")]),e._v(").\nThe following sections will go through the capabilities of these tabs.")]),e._v(" "),t("h2",{attrs:{id:"exploring-a-backend"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-backend"}},[e._v("#")]),e._v(" Exploring a backend")]),e._v(" "),t("p",[e._v("The first tab shows information about the backend and the available collections and processes.\nOn the top, there is a basic description about the backend you are connected to.\nNext, you can choose a collection in the drop down menu to see a description of that dataset.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(327),alt:"QGIS Backend Info"}})]),e._v(" "),t("p",[e._v("On the bottom, you can use the drop down menu to choose one of the available processes from the backend.\nAfter selection, the parameters of the process are listed in the table below. The first column contains the\nparameter name, which is required if bold and otherwise optional.\nThe second column shows the type of the parameter (e.g. number) and the third column a short description.\nTo learn more about the process, you can click on the info button next to the drop down menu\n(marked red in the figure above). The return type of the process is written next to the info box. If you want to get an\noverview of all processes of openEO you might visit the "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[e._v("official processes page")]),e._v(", but note that not all backends\nwill implement all processes listed there, whereas only available processes of the backend are in the QGIS plugin.")],1),e._v(" "),t("h2",{attrs:{id:"job-management"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#job-management"}},[e._v("#")]),e._v(" Job Management")]),e._v(" "),t("p",[e._v('The "Jobs" tab lists all of your '),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[e._v("jobs")]),e._v("\nat the backend. In openEO a job describes what the backend needs to process\n(e.g. by defining a "),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[e._v("process graph")]),e._v(") as well as\nadditional meta-information (e.g. title, creation date). The first two columns show the title and the creation date of\nthe job. The other elements of the table are numbered in the screenshot and described in the following.")],1),e._v(" "),t("p",[t("img",{attrs:{src:o(328),alt:"QGIS Jobs"}})]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Status")]),e._v(' - Shows the current lifecycle state of the job. The first status of a job is "created",\nif it got created at the backend, but not executed yet. After the job gets executed it will be\n"queued" if the backend plans to executes it, but has not started yet. If the execution started but hasn\'t finished yet,\nit has the status of "running". Last but not least it will have either "canceled", if it was stopped during execution,\n"finished" if the execution was successfully or "error", if an error occurred during execution.')]),e._v(" "),t("li",[t("strong",[e._v("Execute")]),e._v(' - By clicking on the "Play" button, the plugin will start the execution of the job at the backend.\nAlready finished jobs are executed again. The icon of the button will change if the job is in the "running" state,\nso that it looks like a "Stop" button, which will cancel the job execution.')]),e._v(" "),t("li",[t("strong",[e._v("Display")]),e._v(' - By clicking on the "Eye" button, the plugin downloads the resulting image(s) of the job from the backend\nand creates a new layer in QGIS named after the title and the creation date of the image. Note that if the result\nis not geo referenced, you might get a dialog from QGIS to choose a coordinate reference system, therefore it is\nrecommended to choose GeoTiff as job output format if available at the backend.')]),e._v(" "),t("li",[t("strong",[e._v("Save")]),e._v(' - By clicking on the "Download" button, you can navigate to the folder where you want to store the\nresulting image(s) of the job and the plugin will download it there.')]),e._v(" "),t("li",[t("strong",[e._v("Adapt")]),e._v(' - By clicking on the "Pencil" button a new dialog appears, where you can adapt the job title and\ndescription as well as the processes and extent of the job. How this works in detail is described in the following sections.')]),e._v(" "),t("li",[t("strong",[e._v("Information")]),e._v(' - By clicking on the "Info" button a window with additional information about the job appears.\nIt contains information like a description, a cost plan etc., of course only if this information is provided by the\nbackend. If the backend provides a logging output, it is also part of this info window.')]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(' - By clicking on the "Trash" button the job gets deleted from the backend, after being asked if you are\nreally sure about it.')]),e._v(" "),t("li",[t("strong",[e._v("Load Job from openEO Hub")]),e._v(" - At the moment it is recommended to not use this feature, since the exchange of\nprocess graphs in the OpenEO Hub is under development.")]),e._v(" "),t("li",[t("strong",[e._v("Create new Job in Web Editor")]),e._v(" - This button opens the "),t("a",{attrs:{href:"https://editor.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO web editor"),t("OutboundLink")],1),e._v(" in your\nsystem browser, so that you can create a new job using it. This is the recommended way for creating a new job, since it has\na graphical and therefore more convenient way of doing so.")]),e._v(" "),t("li",[t("strong",[e._v("Create new Job")]),e._v(" - You can create a job from scratch using this button.\nMore information in the next sections.")]),e._v(" "),t("li",[t("strong",[e._v("Refresh Table")]),e._v(" - This button refreshes the list of jobs manually, in general the list will refresh every few\nseconds. If you do not want to automatically refresh the list (it might cause some lags if the connection to the\nbackend is low) you can do so by deactivating the checkbox next to the refresh button.")]),e._v(" "),t("li",[t("strong",[e._v("User Manual")]),e._v(" - This button opens your browser with this introduction page.")])]),e._v(" "),t("h3",{attrs:{id:"creating-new-jobs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-new-jobs"}},[e._v("#")]),e._v(" Creating new Jobs")]),e._v(" "),t("p",[e._v("There are three approaches to create a new job using this plugin, depending on whether you want to start from scratch or just\nchange existing jobs:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("From scratch with web editor")]),e._v(" - As described in the job table overview above, there is a button (no. 9) that opens\nyour web browser with the "),t("a",{attrs:{href:"https://editor.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO web editor"),t("OutboundLink")],1),e._v(". It is the recommended way to create a new job\nfrom scratch, since it has a very convenient graphical user interface. It also shows the process graph in a neat graph\nbased manner for a better understanding of how processes are connected.")]),e._v(" "),t("li",[t("strong",[e._v("From scratch with QGIS")]),e._v(' - If you want to use the QGIS plugin, you can create a new job using the\nbutton (no. 10) of the job overview dialog. It opens the job adaption window (more details in the section below).\nIn the beginning the job has already a "load_collection" process as a starting point.')]),e._v(" "),t("li",[t("strong",[e._v("From existing Job")]),e._v(" - You can create a new job by adapting\none of your existing jobs at the backend. You can e.g. create a new job with a different spatial extent, or\nadding a few processes to the original one. To do so, you need to click on the edit button in the job overview window (no. 5)")])]),e._v(" "),t("h3",{attrs:{id:"adapting-existing-jobs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adapting-existing-jobs"}},[e._v("#")]),e._v(" Adapting existing Jobs")]),e._v(" "),t("p",[e._v("In this section you'll get an overview of the job adaption workflow using the job adaption window.\nHow you get there was described in the previous section.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(329),alt:"QGIS Adapting Job"}})]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Job Title")]),e._v(" - Here you can write the title of the job. It is recommended to choose it in a way that\nmakes you identify the job in a list more easily.")]),e._v(" "),t("li",[t("strong",[e._v("Job Description")]),e._v(" - You can describe the job in more detail in this field (e.g. what is calculated and how).")]),e._v(" "),t("li",[t("strong",[e._v("Process Graph Table")]),e._v(" - In the process graph table you can see a list of all processes used by the job.\nThe first column contains the identifier of the process node, so a unique identifier of the process throughout the\nwhole process graph (e.g. loadcollection1). Most openEO clients generate these identifiers automatically. We define a\nprocess node (or just node) as one element of the process graph, so a single executed process."),t("br"),e._v('\nIn the second column you can see the name/identifier of the process (e.g. load_collection), which needs to be one of the\nprocesses that the backend provides. The third column shows the node identifier of the predecessor node.\nFor example, "loadcollection1" in the second row means that the output of the node with id "loadcollection1" is the input\nof the node with id "reducedimension1". In other words the process of the second row uses the output of the process of\nthe first row and is therefore executed after the first process.')]),e._v(" "),t("li",[t("strong",[e._v("Process Edit")]),e._v(' - When pressing on the "pencil" button, the process of the same row is loaded into the process\ntable on the right (see no. 6). On this table you can adapt the arguments of the chosen process and therefore configure\nits behaviour.')]),e._v(" "),t("li",[t("strong",[e._v("Delete Process")]),e._v(' - Clicking on the "trash" button deletes the selected process from the process graph.\nNote that other processes, which have this process as predecessor might fail after the deletion.')]),e._v(" "),t("li",[t("strong",[e._v("Undo Changes")]),e._v(" - Press this button if you want to undo all your changes on the job.")]),e._v(" "),t("li",[t("strong",[e._v("Raw Graph")]),e._v(' - Press this button to see the raw process graph (JSON format) in a pop up window. Changes to the\nprocess graph are also applied if you click "Apply". Therefore, you can also copy and paste here a complete process graph'),t("br"),e._v("\ninto the QGIS plugin.")]),e._v(" "),t("li",[t("strong",[e._v("Add Process")]),e._v(' - If you want to add a new process to the process graph you can select one at the drop down menu\n(see "Select a process") and press the button labeled "Add Process". The text field on the right will be the new node id\nand it is autogenerated after selecting a process, but can also be manually defined by typing it into the text field. Note\nthat it has to be unique within the job, otherwise the plugin shows an error message.\nOnce added, the id can not be modified.')]),e._v(" "),t("li",[t("strong",[e._v("Process Table")]),e._v(" - In this table you see all arguments of the currently selected process, the expected type and\nthe current value. If the name of the argument is bold, it is a required argument, hence it must be set.\nYou can edit the values of the arguments directly in the text field of the value column. For some arguments the plugin\nprovides helper function in the fourth column of the process table (e.g. drop down menu of all available collections in\nthe first row)")]),e._v(" "),t("li",[t("strong",[e._v("Process Argument Helper")]),e._v(" - For some arguments of a process, the QGIS Plugin provides helper functions to make the\nadaption of the arguments easier. This is the case, if the field of the fourth column in the process table is\nnot empty.")]),e._v(" "),t("li",[t("strong",[e._v("Result Process")]),e._v(' - This checkbox needs to be checked on the last process of the process graph. It tells the\nbackend that the result of the checked process is the output of the job (usually a "save_result" process). Note that\nonly one process of the process graph can be a result node. If you create a sub process graph in the process graph\n(e.g. when using apply or reduce), it also needs to have exactly one resulting process.')]),e._v(" "),t("li",[t("strong",[e._v("Clone Process")]),e._v(' - When clicking on this button, a clone of the currently selected node gets created and loaded\ninto the process table on the right. Note that clicking on this button does not add it to the job already, so you need to\npress on the "Add Process" button to do so.')]),e._v(" "),t("li",[t("strong",[e._v("Save Process")]),e._v(" - Changes on the process arguments are not stored in the process graph until this button is pressed.\nYou can see if there are unsaved changes if this button is enabled, otherwise it is disabled (see screenshot).")]),e._v(" "),t("li",[t("strong",[e._v("Manage Job")]),e._v(' - In this section of the adaption dialog, there are three options to handle changes on the job.\nFirst, by pressing on "Adapt Job" the selected job will be adapted to the changes you did and no new job will be created.\nSecond, by pressing on "Create New Job" a new job will be created at the backend, so if you have selected a job before\nfor the adaption, it will stay unchanged and your changes will just be applied to the newly created job.\nThird, the "Cancel" button closes the job adaption dialog with your changes having no effect. The same behaviour applies\nby closing the dialog.')])]),e._v(" "),t("h4",{attrs:{id:"process-argument-helper"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#process-argument-helper"}},[e._v("#")]),e._v(" Process Argument Helper")]),e._v(" "),t("p",[e._v("For some process arguments the QGIS plugin provides helper functions for a more convenient editing.\nThis section provides a list of the available helper functions and how to use them:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Collection Id")]),e._v(' - Whenever an argument expects a collection id (e.g. "load_collection" process), the plugin shows a\ndrop down menu with all available collections of the backend. There you can select one and it will be put into the\narguments value.')]),e._v(" "),t("li",[t("strong",[e._v("Spatial Extent")]),e._v(" - Edit buttons of arguments which expect a spatial extent (e.g. geojson, bounding-box) open a\nspatial extent dialog:")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(330),alt:"QGIS Edit spatial extent"}})]),e._v(" "),t("p",[e._v('On the bottom you can edit the spatial extent manually in the text box. In the drop down menu on the top you can choose\nhow to select the spatial extent. You can get the extent of the current layer, the extent of a shape file, the extent of\nthe current QGIS map canvas, by drawing a rectangle on the QGIS map canvas or by drawing a polygon on the QGIS map\ncanvas. The drawings start after clicking on the "Draw Extent" button, so that your curser becomes a cross to draw on\nthe map. After pressing the "OK" button, the extent string in the text field is set to the process argument and the\nwindow closes.')]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Temporal Extent")]),e._v(" - If an argument expects a start and end date, the edit button opens a calendar dialog:")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(331),alt:"QGIS Edit temporal extent"}})]),e._v(" "),t("p",[e._v("The left calendar sets the start date and the right calendar the end date.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Band selection")]),e._v(" - If an argument expects a selection of bands, the edit button opens the following dialog to choose\nfrom the bands available at the selected collection. Note that it always lists all bands of the collection even if some\nbands are filtered by previous processes and therefore not available in the datacube anymore.")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(332),alt:"QGIS Edit band selection"}})]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Process Graph Node")]),e._v(' - If an argument expects a raster data cube, a drop down menu will appear on the edit column.\nThere you can choose from existing process graph nodes (e.g. "loadcollection1") It uses the output of the given node\nidentifier as input of the process argument.')]),e._v(" "),t("li",[t("strong",[e._v("Sub Process Graph")]),e._v(" - Some processes need a whole (sub-)process graph as input value (e.g. apply or reduce\nprocesses). When clicking on the edit button, the plugin opens a new adaption window, which looks similar to the job\nadaption window, but shows the sub process graph:")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(333),alt:"QGIS Edit sub process graph"}})]),e._v(" "),t("p",[e._v('In this window you can adapt the sub process graph in the same way as the original process graph. After pressing on\n"Adapt", the changes are written to the original job. Process arguments, which do not have special editing fields,\nhave a "Proc-Param" button. If pressed it will forward the input data of the parent node\n(so the one with the subgraph as attribute) to the selected argument (see screenshot "data" argument). Note that the\nsub process graph also needs to have at least one result node.')]),e._v(" "),t("h2",{attrs:{id:"service-management"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#service-management"}},[e._v("#")]),e._v(" Service Management")]),e._v(" "),t("p",[e._v('The "Services" tab lists all of your '),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[e._v("secondary web services")]),e._v("\nat the backend. In openEO a secondary service has a process graph like a job, but depending on the service type it is\npossible for the user to change the viewing extent dynamically. The first two columns shows the title, the description\nand the date and time it got created at the backend.\nThe other elements of this window are numbered at the screenshot below and described in the following.")],1),e._v(" "),t("p",[t("img",{attrs:{src:o(334),alt:"QGIS Services"}})]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Display")]),e._v(' - When clicking on the "Eye", the secondary service gets loaded into a new QGIS layer, named after the\nservice. QGIS now fetches the result of the processing into the current extent of the QGIS map canvas. Note that it will\nload the whole screen at once, so it might take a while.')]),e._v(" "),t("li",[t("strong",[e._v("Information")]),e._v(" - Clicking on the Infobox, shows detailed information about the service.")]),e._v(" "),t("li",[t("strong",[e._v("Delete")]),e._v(" - Clicking on the delete button removes the service from the backend.")]),e._v(" "),t("li",[t("strong",[e._v("Create from job")]),e._v(' - By clicking on this button you can create a new service from one of your jobs. It will create a\nservice with the same process graph as the selected job, but the extent will be dynamically loaded via the service. By\nclicking on the button a new dialog pops up. On the creation dialog you can set a title and a description text, but note\nthat they are optional. Nevertheless, you have to select a job and choose a type of secondary service. The drop down\nmenu of the service types contains only the ones supported by your backend. By clicking on "Create Service" the\nplugin creates the service on the backend, so you should be able to see it on the table. Note that the list of jobs\ncontains only successfully executed jobs (e.g. with "finished" status). By clicking on "Raw Graph"\n'),t("img",{attrs:{src:o(335),alt:"QGIS Create Services from job"}})]),e._v(" "),t("li",[t("strong",[e._v("Create from web editor")]),e._v(" - Similarly to the job table overview, this button opens your web browser with\nthe "),t("a",{attrs:{href:"https://editor.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO web editor"),t("OutboundLink")],1),e._v(". There you can create new services via the editor or from your jobs.")]),e._v(" "),t("li",[t("strong",[e._v("Refresh Table")]),e._v(" - Similar to the jobs table, this button refreshes the list of services manually, in general the list will refresh every few\nseconds. If you do not want to automatically refresh the list (it might cause some lags if the connection to the\nbackend is low) you can do so by deactivating the checkbox next to the refresh button.")]),e._v(" "),t("li",[t("strong",[e._v("Create from web editor")]),e._v(" - This button opens your browser with this introduction page.")])]),e._v(" "),t("h2",{attrs:{id:"additional-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[e._v("#")]),e._v(" Additional Information")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-qgis-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github Repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank",rel:"noopener noreferrer"}},[e._v("QGIS Plugin Page"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/16.730ecf31.js b/assets/js/16.1076d9e7.js similarity index 99% rename from assets/js/16.730ecf31.js rename to assets/js/16.1076d9e7.js index bed8bcb19..c7c4efec2 100644 --- a/assets/js/16.730ecf31.js +++ b/assets/js/16.1076d9e7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16,17,29,37],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"j",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return v}));const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function u(t){return a.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(u(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return s.test(r)?t:r+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var i=n(155),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(4),a=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},160:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(161),n(4)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},170:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},180:function(t,e,n){"use strict";n.r(e);var i=n(159),r=n(160),s=n(50),a=n.n(s),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t}},u=(n(174),n(4)),l=Object(u.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=l.exports},184:function(t,e,n){"use strict";n(170)},200:function(t,e,n){"use strict";n.r(e);var i=n(180),r={name:"NavLinks",components:{NavLink:n(159).default,DropdownLink:i.default},computed:{userLinks(){return this.$site.themeConfig.nav.map(t=>(t.userNav?(t.items=this.getNav("userNav"),t.index=Math.random()):t.devNav&&(t.items=this.getNav("devNav"),t.index=Math.random()),Object.assign(this.resolveNavLinkItem(t),{items:(t.items||[]).map(t=>this.resolveNavLinkItem(t))})))}},methods:{resolveNavLinkItem:t=>Object.assign(t,{type:t.items&&t.items.length?"links":"link"}),prepareNavLinks(t,e){if(Array.isArray(t))return t.map(t=>this.prepareNavLinks(t,e));var n=Object.assign({},t);for(var i in n)n[i]&&"object"==typeof n[i]?n[i]=this.prepareNavLinks(n[i],e):"link"!==i||n.link.match(/^(\/|[\w\d]+:)/i)||(n.link=e+n.link);return n},getNav(t){const{versions:e,defaultVersion:n}=this.$site.themeConfig;var i=e.findIndex(t=>this.$page.regularPath.startsWith(t.path));i<0&&(i=n);var r=this.prepareNavLinks(e[i][t],e[i].path);return r.push({text:"Versions",items:e.map(t=>({text:t.title,link:t.path}))}),r}}},s=(n(184),n(4)),a=Object(s.a)(r,(function(){var t=this._self._c;return this.userLinks.length?t("nav",{staticClass:"nav-links"},this._l(this.userLinks,(function(e){return t("div",{key:e.index||e.link,staticClass:"nav-item"},["links"===e.type?t("DropdownLink",{attrs:{item:e}}):t("NavLink",{attrs:{item:e}})],1)})),0):this._e()}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[16,17,30,38],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"j",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return v}));const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function u(t){return a.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(u(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return s.test(r)?t:r+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var i=n(155),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(4),a=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},160:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(161),n(4)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},170:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},180:function(t,e,n){"use strict";n.r(e);var i=n(159),r=n(160),s=n(50),a=n.n(s),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t}},u=(n(174),n(4)),l=Object(u.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=l.exports},184:function(t,e,n){"use strict";n(170)},200:function(t,e,n){"use strict";n.r(e);var i=n(180),r={name:"NavLinks",components:{NavLink:n(159).default,DropdownLink:i.default},computed:{userLinks(){return this.$site.themeConfig.nav.map(t=>(t.userNav?(t.items=this.getNav("userNav"),t.index=Math.random()):t.devNav&&(t.items=this.getNav("devNav"),t.index=Math.random()),Object.assign(this.resolveNavLinkItem(t),{items:(t.items||[]).map(t=>this.resolveNavLinkItem(t))})))}},methods:{resolveNavLinkItem:t=>Object.assign(t,{type:t.items&&t.items.length?"links":"link"}),prepareNavLinks(t,e){if(Array.isArray(t))return t.map(t=>this.prepareNavLinks(t,e));var n=Object.assign({},t);for(var i in n)n[i]&&"object"==typeof n[i]?n[i]=this.prepareNavLinks(n[i],e):"link"!==i||n.link.match(/^(\/|[\w\d]+:)/i)||(n.link=e+n.link);return n},getNav(t){const{versions:e,defaultVersion:n}=this.$site.themeConfig;var i=e.findIndex(t=>this.$page.regularPath.startsWith(t.path));i<0&&(i=n);var r=this.prepareNavLinks(e[i][t],e[i].path);return r.push({text:"Versions",items:e.map(t=>({text:t.title,link:t.path}))}),r}}},s=(n(184),n(4)),a=Object(s.a)(r,(function(){var t=this._self._c;return this.userLinks.length?t("nav",{staticClass:"nav-links"},this._l(this.userLinks,(function(e){return t("div",{key:e.index||e.link,staticClass:"nav-item"},["links"===e.type?t("DropdownLink",{attrs:{item:e}}):t("NavLink",{attrs:{item:e}})],1)})),0):this._e()}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/17.16a736ce.js b/assets/js/17.5fbd2901.js similarity index 98% rename from assets/js/17.16a736ce.js rename to assets/js/17.5fbd2901.js index 4d217fd3a..ab8ccd531 100644 --- a/assets/js/17.16a736ce.js +++ b/assets/js/17.5fbd2901.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17,29,37],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"j",(function(){return h})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return b}));const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(i,"").replace(r,"")}function u(t){return o.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(u(t))return t;const e=t.match(i),n=e?e[0]:"",r=a(t);return s.test(r)?t:r+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return a(t.path)===a(e)}function h(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return h(n,e,i);if(Array.isArray(e))return Object.assign(h(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var i=n(155),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(4),o=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},160:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(161),n(4)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},180:function(t,e,n){"use strict";n.r(e);var i=n(159),r=n(160),s=n(50),o=n.n(s),a={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t}},u=(n(174),n(4)),l=Object(u.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17,30,38],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"j",(function(){return h})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return b}));const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(i,"").replace(r,"")}function u(t){return o.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(u(t))return t;const e=t.match(i),n=e?e[0]:"",r=a(t);return s.test(r)?t:r+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return a(t.path)===a(e)}function h(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return h(n,e,i);if(Array.isArray(e))return Object.assign(h(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},159:function(t,e,n){"use strict";n.r(e);var i=n(155),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(4),o=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},160:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(161),n(4)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},161:function(t,e,n){"use strict";n(158)},162:function(t,e,n){},174:function(t,e,n){"use strict";n(162)},180:function(t,e,n){"use strict";n.r(e);var i=n(159),r=n(160),s=n(50),o=n.n(s),a={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t}},u=(n(174),n(4)),l=Object(u.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/18.9138ef67.js b/assets/js/18.131835dc.js similarity index 99% rename from assets/js/18.9138ef67.js rename to assets/js/18.131835dc.js index 495e47b0a..d02a97994 100644 --- a/assets/js/18.9138ef67.js +++ b/assets/js/18.131835dc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{302:function(t,s,a){t.exports=a.p+"assets/img/urk_scaling.1f27c164.jpg"},303:function(t,s,a){t.exports=a.p+"assets/img/urk.e6564348.jpg"},304:function(t,s,a){t.exports=a.p+"assets/img/pellworm_248.29ad280d.jpg"},305:function(t,s,a){t.exports=a.p+"assets/img/pellworm_ndvi.36c775d8.jpg"},306:function(t,s,a){t.exports=a.p+"assets/img/pellworm_threshold.be97c121.jpg"},307:function(t,s,a){t.exports=a.p+"assets/img/pellworm_s1.acf74ce7.jpg"},308:function(t,s,a){t.exports=a.p+"assets/img/pellworm_kernels.d12dda41.jpg"},510:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"openeo-cookbook"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#openeo-cookbook"}},[t._v("#")]),t._v(" openEO Cookbook")]),t._v(" "),s("p",[t._v("This is the openEO cookbook that you can refer to to get a first idea on how to solve problems with openEO in the three client languages Python, R and JavaScript. It describes how to implement simple use cases in a pragmatic way.")]),t._v(" "),s("p",[t._v("Please refer to the getting started guides for "),s("RouterLink",{attrs:{to:"/documentation/1.0/javascript/"}},[t._v("JavaScript")]),t._v(", "),s("RouterLink",{attrs:{to:"/documentation/1.0/python/"}},[t._v("Python")]),t._v(" and "),s("RouterLink",{attrs:{to:"/documentation/1.0/r/"}},[t._v("R")]),t._v(" if you have never worked with one of the openEO client libraries before. This guide requires you to have a basic idea of how to establish a connection to a back-end and how to explore that back-end.")],1),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("References")]),t._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("openEO processes documentation")])],1),t._v(" "),s("li",[s("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(" to discover back-ends with available data and processes")]),t._v(" "),s("li",[s("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Web Editor"),s("OutboundLink")],1),t._v(" to visually build and execute processing workflows")])]),t._v(" "),s("hr"),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaScript client documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("R client documentation"),s("OutboundLink")],1)])])]),t._v(" "),s("h2",{attrs:{id:"chapter-1"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chapter-1"}},[t._v("#")]),t._v(" Chapter 1")]),t._v(" "),s("p",[t._v("In this chapter, we want to explore the different output formats that are possible with openEO. For that, we load and filter a collection (a datacube) of satellite data and calculate the temporal mean of that data. Different steps (e.g. a linear scaling) are done to prepare for the data to be output in one of the formats: Raster or text data.")]),t._v(" "),s("p",[t._v("Throughout this guide, code examples for all three client languages are given. Select your preferred language with the code switcher on the right-hand side to set all examples to that language.")]),t._v(" "),s("h3",{attrs:{id:"connecting-to-a-back-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#connecting-to-a-back-end"}},[t._v("#")]),t._v(" Connecting to a back-end")]),t._v(" "),s("p",[t._v("Click the link below to see how to connect to a back-end (via OpenID Connect). You can call the connection object "),s("code",[t._v("con")]),t._v(" as it is done in all following code, to avoid confusion throughout the rest of the tutorials.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("p",[s("RouterLink",{attrs:{to:"/documentation/1.0/python/#openid-connect-authentication"}},[t._v("Getting started: Authentication")])],1)]},proxy:!0},{key:"r",fn:function(){return[s("p",[s("RouterLink",{attrs:{to:"/documentation/1.0/r/#openid-connect-authentication"}},[t._v("Getting started: Authentication")])],1)]},proxy:!0},{key:"js",fn:function(){return[s("p",[s("RouterLink",{attrs:{to:"/documentation/1.0/javascript/#openid-connect-authentication"}},[t._v("Getting started: Authentication")])],1)]},proxy:!0}])}),t._v(" "),s("p",[t._v("In R and JavaScript it is very useful to assign a graph-building helper object to a variable, to easily access all openEO processes and add them to the process graph that you will be building. These objects will be used throughout this guide. In Python, it also helps to import a helper object, even though we'll need it less often.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# import ProcessBuilder functions")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ProcessBuilder\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" Many functions in "),s("em",[t._v("child processes")]),t._v(" (see below), are instances of this "),s("code",[t._v("ProcessBuilder")]),t._v(" import.")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# assign the graph-building helper object to "p" for easy access to all openEO processes, see > ?processes()')]),t._v("\np "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In all R code, "),s("code",[t._v("p")]),t._v(" is used to select openEO processes.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// assign the graph-building helper object to "builder" for easy access to all openEO processes')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In all JavaScript code, "),s("code",[t._v("builder")]),t._v(" is used to select openEO processes.")])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"input-load-collection"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#input-load-collection"}},[t._v("#")]),t._v(" Input: "),s("code",[t._v("load_collection")])]),t._v(" "),s("p",[t._v("Before loading a collection, we need to find out the exact name of a collection we want to use (back-end-specific, see references "),s("a",{attrs:{href:"#openeo-cookbook"}},[t._v("at the top")]),t._v("). We assign the spatial and temporal extent to variables, so that we can re-use them on other collections we might want to load. Let's look for a Sentinel 2 (preprocessed level 2A preferably) collection and load the green, red and a near-infrared band (bands 3, 4 and 8).")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Collection and Band Names")]),t._v(" "),s("p",[t._v("The names of collections and bands differ between back-ends. So always check the collection description for the correct names. The differences might be subtle, e.g. "),s("code",[t._v("B8")]),t._v(" vs. "),s("code",[t._v("B08")]),t._v(".")])]),t._v(" "),s("p",[t._v("We'll name our collection very explicitly "),s("code",[t._v("cube_s2_b348")]),t._v(" as to not get confused later on.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# make dictionary, containing bounding box")]),t._v("\nurk "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.5661")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6457")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.7298")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.7335")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# make list, containing the temporal interval")]),t._v("\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load first datacube")]),t._v("\ncube_s2_b348 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2_SR"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" urk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create variables for loading collection")]),t._v("\nurk "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.5661")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6457")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.7298")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.7335")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load first datacube")]),t._v("\ncube_s2_b348 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2_SR"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" urk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// make spatial and temporal extent")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" urk "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.5661")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6457")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.7298")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.7335")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// load first cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b348 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2_SR"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n urk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" JavaScript doesn't use parameter names (like Python and R), so the parameters need to be in the order that they are defined in the "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("openEO processes documentation")]),t._v(".")],1)]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"filter-bands-filter-bands"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#filter-bands-filter-bands"}},[t._v("#")]),t._v(" Filter Bands: "),s("code",[t._v("filter_bands")])]),t._v(" "),s("p",[t._v("To go through the desired output formats, we'll need one collection with three bands, and one collection with only one band. Here we use "),s("code",[t._v("filter_bands")]),t._v(", when of course we could also just define a separate collection via "),s("code",[t._v("load_collection")]),t._v(". As our input datacube already has the required three bands, we filter it for a single band to create an additional datacube with the same spatial and temporal extent, but with only one band (band 8).")]),t._v(" "),s("p",[t._v("We'll name this one "),s("code",[t._v("cube_s2_b8")]),t._v(" to distinguish it from the original "),s("code",[t._v("cube_s2_b348")]),t._v(".")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# filter for band 8")]),t._v("\ncube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# filter for band 8")]),t._v("\ncube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// filter for band 8")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"temporal-mean-reduce-dimension"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#temporal-mean-reduce-dimension"}},[t._v("#")]),t._v(" Temporal Mean: "),s("code",[t._v("reduce_dimension")])]),t._v(" "),s("p",[t._v("As we don't want to download the raw collection of satellite data, we need to reduce that data somehow. That means, we want to get rid of one dimension. Let's say we calculate a "),s("code",[t._v("mean")]),t._v(" over all timesteps, and then drop the temporal dimension (as it's empty then anyway, see explanation in the "),s("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html#reduce"}},[t._v("datacube guide")]),t._v("). This can be done via "),s("code",[t._v("reduce_dimension()")]),t._v(". The function requires a reducer, in our case a "),s("code",[t._v("mean")]),t._v(" process, and the dimension over which to reduce, given as a string ("),s("code",[t._v('"t"')]),t._v(").")],1),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Child Processes")]),t._v(" "),s("p",[t._v("Here, we need to define a child process: A function that is called by (or passed to) another function, and then works on a subset of the datacube (somewhat similar to the concept of callbacks in JavaScript). In this case: We want "),s("code",[t._v("reduce_dimension")]),t._v(" to use the "),s("code",[t._v("mean")]),t._v(" function to average all timesteps of each pixel. Not any function can be used like this, it must be defined by openEO, of course.")]),t._v(" "),s("p",[t._v("All clients have more or less different specifics when defining a child process. As you can observe directly below, one way to define one is to define the function directly inside the parent process.")]),t._v(" "),s("p",[t._v("For a more clean way to define a child process, see the chapter below.")])]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce all timesteps")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# mean_time() is a shortcut function")]),t._v("\ncube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively, 'reduce_dimension' can be used")]),t._v("\ncube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# additionally, reduce second collection")]),t._v("\ncube_s2_b348_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In python, the child process can be a string.")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce dimension, first collection")]),t._v("\ncube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce, second collection")]),t._v("\ncube_s2_b348_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In R, we can select a child process from the "),s("code",[t._v("p")]),t._v(" helper object.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// reduce dimension")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// second collection")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b348_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In JavaScript, arrow functions can be used as child processes.")])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"scale-all-pixels-linearly-apply-linear-scale-range"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scale-all-pixels-linearly-apply-linear-scale-range"}},[t._v("#")]),t._v(" Scale All Pixels Linearly: "),s("code",[t._v("apply")]),t._v(", "),s("code",[t._v("linear_scale_range")])]),t._v(" "),s("p",[t._v("To create a PNG output, we need to scale the satellite data we have down to the 8bit range of a PNG image. For this, the scale range of our imagery has to be known. For Sentinel 2 over urban and agricultural areas, we can use "),s("code",[t._v("6000")]),t._v(" as a maximum.")]),t._v(" "),s("p",[t._v("We'll use the process "),s("code",[t._v("linear_scale_range")]),t._v(". It takes a number and the four borders of the intervals as input. Because it works on a number and not a datacube as all processes discussed so far, we need to nest the process into an "),s("code",[t._v("apply")]),t._v(", once again defining a child process. "),s("code",[t._v("apply")]),t._v(" applies a unary process to all pixels of a datacube.")]),t._v(" "),s("p",[t._v("This time we'll also define our child processes externally, as to not get confused in too much code nesting.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define child process, use ProcessBuilder")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale_function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" ProcessBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("linear_scale_range"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply scale_function to all pixels")]),t._v("\ncube_s2_b348_red_lin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("scale_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Resource:")]),t._v(" Refer to the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html#processes-with-child-callbacks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client documentation"),s("OutboundLink")],1),t._v(" to learn more about child processes in Python.")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define child process")]),t._v("\nscale_function "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("linear_scale_range"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inputMin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inputMax "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMax "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply scale range to all pixels")]),t._v("\ncube_s2_b348_red_lin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" scale_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define child process (long way)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("scale_function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("linear_scale_range")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we could also use an arrow function here to abbreviate")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// var scale_function = (x, context, child) => child.linear_scale_range(x, 0, 6000, 0, 255)")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// apply child process to all pixels")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b348_red_lin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" Given the two ways of defining a child process above, we can see that in the long way, the builder is available as "),s("code",[t._v("this")]),t._v(", while in arrow functions, it has to be passed as the last argument (here called "),s("code",[t._v("child")]),t._v(").")])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(302),alt:"A comparison between an unscaled and a scaled raster is shown. Unscaled values are much larger, sclaed values much closer together and all below 255."}}),t._v(" "),s("figcaption",[t._v("A part of our original image is displayed here, to observe the effect of applying a linear scale: Original (thus unscaled) imagery is seen on the left, and scaled values on the right.")])]),t._v(" "),s("h3",{attrs:{id:"spatial-aggregation-aggregate-spatial"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#spatial-aggregation-aggregate-spatial"}},[t._v("#")]),t._v(" Spatial Aggregation: "),s("code",[t._v("aggregate_spatial")])]),t._v(" "),s("p",[t._v('To look at text output formats we first need to "de-spatialize" our data. Or put another way: If we\'re interested in e.g. timeseries of various geometries, text output might be very interesting for us.')]),t._v(" "),s("p",[t._v("To aggregate over certain geometries, we use the process "),s("code",[t._v("aggregate_spatial")]),t._v(". It takes valid GeoJSON as input. We can pass a GeoJSON "),s("code",[t._v("FeatureCollection")]),t._v(" in Python and JavaScript, but we need to introduce two packages in R, "),s("code",[t._v("sf")]),t._v(" and "),s("code",[t._v("geojsonsf")]),t._v(", to convert the "),s("code",[t._v("FeatureCollection")]),t._v(" "),s("code",[t._v("string")]),t._v(" to a "),s("code",[t._v("simple feature collection")]),t._v(".")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# polygons as (geojson) dict")]),t._v("\npolygons "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FeatureCollection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"features"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.629441738128662")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68157281641395")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.633561611175536")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.67787822078012")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.6201934814453125")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68429152697491")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.628776550292969")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.683719180920846")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# aggregate spatial")]),t._v("\ncube_s2_b8_agg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_spatial"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("geometries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" polygons"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively, the python client has a shortcut function for this special case")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# cube_s2_b8_agg = cube_s2_b8.polygonal_mean_timeseries(polygon = polygons)")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load sf and geojsonsf")]),t._v("\nlibrary"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlibrary"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("geojsonsf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create string containing the geojson FeatureCollection")]),t._v("\npolygons_string "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.636715888977051, 52.6807532675943 ], [ 5.629441738128662, 52.68157281641395 ], [ 5.633561611175536, 52.67787822078012 ], [ 5.636715888977051, 52.6807532675943 ] ] ] } }, { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.622982978820801, 52.68595649102906 ], [ 5.6201934814453125, 52.68429152697491 ], [ 5.628776550292969, 52.683719180920846 ], [ 5.622982978820801, 52.68595649102906 ] ] ] } } ]}\'')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# convert to sf object")]),t._v("\npolygons "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" geojson_sf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("polygons_string"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# add any attribute as a workaround, empty simple features are not accepted")]),t._v("\npolygons"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("anAttribute "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# aggregate spatially")]),t._v("\ncube_s2_b8_agg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("aggregate_spatial"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" geometries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" polygons"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" At the time of writing this, empty simple features are not accepted and produce an error. To work around this issue, simply add a random attribute to the "),s("code",[t._v("sf")]),t._v(" object. Above we are assigning the (randomly chosen) values "),s("code",[t._v("4")]),t._v(" and "),s("code",[t._v("5")]),t._v(" to the two polygons in the collection.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define polygons as geojson")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" polygons "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FeatureCollection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"features"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.629441738128662")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68157281641395")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.633561611175536")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.67787822078012")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.6201934814453125")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68429152697491")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.628776550292969")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.683719180920846")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// aggregate spatial")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b8_agg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("aggregate_spatial")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" polygons"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"output-save-result"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#output-save-result"}},[t._v("#")]),t._v(" Output: "),s("code",[t._v("save_result")])]),t._v(" "),s("p",[t._v("To get a result, we first need to create a "),s("code",[t._v("save_result")]),t._v(" node, in which we state the desired output format and potential parameters, both dependent on the back-end you are connected to. The output formats and their parameters can e.g. be explored via the Web Editor along with available processes and collections.")]),t._v(" "),s("p",[t._v("We then proceed to send that job to the back-end, "),s("em",[t._v("without executing it")]),t._v(". Refer to the getting started guides on how to process results as batch or synchronous jobs. The way it is stated here allows us to log in to the Web Editor and look at, change, and execute the job from there.")]),t._v(" "),s("h4",{attrs:{id:"raster-formats-gtiff-netcdf"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#raster-formats-gtiff-netcdf"}},[t._v("#")]),t._v(" Raster Formats: GTiff, NetCDF")]),t._v(" "),s("p",[t._v("In the example, GeoTiff files are produced. Refer to the back-end for the available formats, options, and their correct naming. Check the "),s("a",{attrs:{href:"#raster-formats-png"}},[t._v("PNG section")]),t._v(" for passing options.")]),t._v(" "),s("p",[t._v("Different from the creation of a PNG image, the raster format doesn't need scaling and the original datacube can be downloaded as is. However, we need to be careful with the dimensionality of the datacube: How a 4+ - dimensional datacube is handled when converted to a raster format is back-end dependent. That is why we "),s("a",{attrs:{href:"#temporal-mean-reduce-dimension"}},[t._v("made sure")]),t._v(" that our cube would only contain one additional dimension, apart from the spatial "),s("code",[t._v("x")]),t._v(" and "),s("code",[t._v("y")]),t._v(".")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save using save_result, give format as string")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end, do not execute")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_GTiff_py"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# use list_file_formats() to be able to choose from a list")]),t._v("\nformats "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list_file_formats"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save using save_result, give format via list")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("GTiff"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_GTiff_r"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save using save_result, give fomat as string")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// send job to back-end, but don't execute yet; set title")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_GTiff_js"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h4",{attrs:{id:"raster-formats-png"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#raster-formats-png"}},[t._v("#")]),t._v(" Raster Formats: PNG")]),t._v(" "),s("p",[t._v("For a PNG output, we'll use the datacube with the bands 3, 4 and 8 (green, red and near-infrared) that we've been working on simultaneously with the datacube used above. As we have scaled the data down to 8bit using a "),s("a",{attrs:{href:"#scale-all-pixels-linearly-apply-linear-scale-range"}},[t._v("linear scale")]),t._v(", nothing stands in the way of downloading the data as PNG.")]),t._v(" "),s("p",[t._v("We want to produce a false-color composite highlighting the vegetation in red (as seen below the code). For that, we want to assign the infrared band ("),s("code",[t._v("B8")]),t._v(") to the red channel, the red band ("),s("code",[t._v("B4")]),t._v(") to the green channel and the green band ("),s("code",[t._v("B3")]),t._v(") to the blue channel. Some back-ends may offer to pass along this desired band order as it is shown below. Check with the back-end for available options.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("If no options can be passed, handling of the bands for PNG output is internal and should be documented by the back-end. You might also be able to tell how this is done by how your PNG looks: As explained in the "),s("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html#dimensions"}},[t._v("datacube guide")]),t._v(", the order of the "),s("code",[t._v("bands")]),t._v(" dimension is defined when the values are loaded or altered (in our example: "),s("code",[t._v("filter_bands")]),t._v("). As we filter bands in the order "),s("code",[t._v('"B3", "B4", "B8"')]),t._v(" vegetation might be highlighted in blue, given that the back-end uses the input order for the RGB channels.")],1),t._v(" "),s("p",[s("strong",[t._v("The example below uses the "),s("code",[t._v("PNG")]),t._v(" file format as defined by the Google Earth Engine back-end so the parameters "),s("code",[t._v("red")]),t._v(", "),s("code",[t._v("green")]),t._v(" and "),s("code",[t._v("blue")]),t._v(" may not be available on another back-end.")]),t._v(" Make sure to check the file format documentation for your back-end.")])]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result cube as PNG")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red_lin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PNG"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"green"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_PNG_py"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In python, options are passed as a dictionary")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# use list_file_formats() to be able to choose from a list")]),t._v("\nformats "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list_file_formats"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result as PNG")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red_lin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("PNG"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n options "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" green"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blue"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_PNG_r"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In R, options are passed as a list.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save result as PNG")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348_red_lin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PNG"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("red")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("green")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("blue")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// send job to back-end")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_PNG_js"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In JavaScript, options are passed as objects.")])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(303),alt:"Example PNG: false color composite highlighting vegetation in red."}}),t._v(" "),s("figcaption",[t._v("Image above: Example PNG output with the vegetation highlighted in red.")])]),t._v(" "),s("h4",{attrs:{id:"text-formats-json-csv"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#text-formats-json-csv"}},[t._v("#")]),t._v(" Text Formats: JSON, CSV")]),t._v(" "),s("p",[t._v("We can now save the timeseries in the "),s("a",{attrs:{href:"#spatial-aggregation-aggregate-spatial"}},[t._v("aggregated")]),t._v(" datacube as e.g. JSON.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result cube as JSON")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_agg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timeseries_as_JSON_py"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# use list_file_formats() to be able to choose from a list")]),t._v("\nformats "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list_file_formats"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result as JSON")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_agg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("JSON"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timeseries_as_JSON_r"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" Because the R client rounds coordinates to four digits, slightly different results are received in comparison to the other clients.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save as CSV")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8_agg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// send job to back-end")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timeseries_as_JSON_js"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"output-process-as-json"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#output-process-as-json"}},[t._v("#")]),t._v(" Output: Process as JSON")]),t._v(" "),s("p",[t._v("In some cases we want to export the JSON representation of a process we created. If you followed one of the examples above, then your end node is called "),s("code",[t._v("res")]),t._v(". If not, replace that with whatever you called your process end node.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("process "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# if needed, write JSON to file, e.g.:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("open")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./process.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"w"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" tfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n tfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("write"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# convert process to JSON")]),t._v("\nprocess_json "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" toJSON"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("as"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Process"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# if needed, write JSON to file, e.g.:")]),t._v("\ncat"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process_json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" file "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./process.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// set last node as result = true so it is recognized as the result node")]),t._v("\nres"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n\nprocess "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toJSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if needed, write JSON to file, e.g.:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" fs "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'fs'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nfs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeFileSync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./process.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" The code to store a file only works with NodeJS. Browsers can't write files to disk.")])]},proxy:!0}])}),t._v(" "),s("h2",{attrs:{id:"chapter-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chapter-2"}},[t._v("#")]),t._v(" Chapter 2")]),t._v(" "),s("p",[t._v("In this second part of the cookbook, things are a bit less linear. We'll explore bandmath, masking and "),s("code",[t._v("apply_*")]),t._v(" functionality, only that these steps are less interconnected than in the first chapter.")]),t._v(" "),s("p",[t._v("As usual we'll load a collection to work with (Sentinel 2, bands "),s("code",[t._v("2")]),t._v(", "),s("code",[t._v("4")]),t._v(", "),s("code",[t._v("8")]),t._v(" and "),s("code",[t._v("SCL")]),t._v("). Let's call it "),s("code",[t._v("cube_s2")]),t._v(". We pre-select a time frame of which we know it only contains one Sentinel 2 scene, so that we're not bothered with multiple timesteps (the collection still contains a time dimension, but with only one timestep in it, so that it can be ignored). The extent has been chosen to provide results that are suitable to show the effect of the processes used, while being considerably small and thus fast to compute. If you want to minimize processing time you are of course free to use much smaller AOIs.")]),t._v(" "),s("p",[t._v("To be able to download and look at the results, refer to the "),s("a",{attrs:{href:"#raster-formats-gtiff-netcdf"}},[t._v("output section of chapter 1")]),t._v(". Most of the images in this tutorial were all downloaded as GTiff and plotted with R.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("pellworm "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.5464")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.4473")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.0724")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.5685")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ncube_s2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL2_L2A_SENTINELHUB"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pellworm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("pellworm "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.5464")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.4473")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.0724")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.5685")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncube_s2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL2_L2A_SENTINELHUB"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pellworm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" pellworm "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.5464")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.4473")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.0724")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.5685")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL2_L2A_SENTINELHUB"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n pellworm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(304),alt:"The AOI around Pellworm is shown as a false color RGB. RGB = red, nir and blue"}}),t._v(" "),s("figcaption",[t._v("This is a false color image of our area of interest for this chapter. The bands 4, 8 and 2 have been assigned to the RGB channels without any further processing. The surrounding area of the island Pellworm is shown at low tide.\n")])]),t._v(" "),s("h3",{attrs:{id:"bandmath"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#bandmath"}},[t._v("#")]),t._v(" Bandmath")]),t._v(" "),s("p",[t._v("Bandmath refers to computations that involve multiple bands, like indices (Normalized Difference Vegetation Index, Normalized Burn Ratio etc.).")]),t._v(" "),s("p",[t._v("In openEO, this goes along with using for example "),s("code",[t._v("reduce_dimension")]),t._v(" over the "),s("code",[t._v("bands")]),t._v(" dimension. In this process, a new pixel value is calculated from the values of different bands using a given formula (the actual bandmath), to then eliminate the "),s("code",[t._v("bands")]),t._v(" dimension alltogether. If e.g. a cube contains a "),s("code",[t._v("red")]),t._v(" and a "),s("code",[t._v("nir")]),t._v(" band in its "),s("code",[t._v("bands")]),t._v(" dimension and we reduce said dimension with a formula for the NDVI, that cube afterwards contains NDVI values, but no "),s("code",[t._v("bands")]),t._v(" dimension anymore.")]),t._v(" "),s("p",[t._v("In the following we'll observe a thorough explanation of how to calculate an NDVI. That section covers different ways (depending on the client) to set up such a process in openEO. Afterwards, we'll see how an EVI is computed in a quicker, less thorough example.")]),t._v(" "),s("h4",{attrs:{id:"example-1-ndvi"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-1-ndvi"}},[t._v("#")]),t._v(" Example 1: NDVI")]),t._v(" "),s("p",[t._v("As mentioned above, bandmath is about reducing the "),s("code",[t._v("bands")]),t._v(" dimension with a child process (a formula) that gives us the desired output. In "),s("a",{attrs:{href:"#chapter-1"}},[t._v("chapter one")]),t._v(", we already saw different ways of defining a child process: a) We learned how to use a simple "),s("code",[t._v("mean")]),t._v(" to "),s("RouterLink",{attrs:{to:"/documentation/1.0/cookbook/#temporal-mean-reduce-dimension"}},[t._v("reduce the time dimension")]),t._v(", and b) we saw how to access and use the openEO defined "),s("code",[t._v("linear_scale_range")]),t._v(" function "),s("RouterLink",{attrs:{to:"/documentation/1.0/cookbook/#scale-all-pixels-linearly-apply-linear-scale-range"}},[t._v("to scale all pixels linearly")]),t._v(".")],1),t._v(" "),s("p",[t._v("In this chapter, we'll reiterate these techniques and discuss some subtleties and alternatives. It is up to you to choose one that works best. Special to the NDVI is, given that it is "),s("em",[t._v("the")]),t._v(" most common use case, that openEO has predefined processes that cover the math for us and only need to be given the correct input. There even is a function "),s("code",[t._v("ndvi")]),t._v(" that masks all details and only takes a datacube and the bandnames as input. Further down we'll dig into what this "),s("code",[t._v("ndvi")]),t._v(" process actually masks, how we can reproduce that manually, and thus how we could formulate other bandmath functions, apart from an NDVI.")]),t._v(" "),s("p",[t._v("By using the openEO defined "),s("strong",[s("code",[t._v("ndvi")]),t._v(" function")]),t._v(", calculating an NDVI becomes pretty straightforward. The process can detect the red and near-infrared band based on metadata and doesn't need bandname input (but band names can be passed to calculate other normalized differences). Also, by supplying the optional parameter "),s("code",[t._v("target_band")]),t._v(" we can decide if we want to get a reduced cube with NDVI values and no "),s("code",[t._v("bands")]),t._v(" dimension as result, or if we want to append the new NDVI band to the existing bands of our input cube. If we choose the latter, we only need to supply a name for that new NDVI band.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or name bands explicitly + append the result band to the existing cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# cube_s2_ndvi_bands = cube_s2.ndvi(nir = "B08", red = "B04", target_band = "NDVI")')]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or name bands explicitly + append the result band to the existing cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# cube_s2_nvdi_bands <- p$ndvi(data = cube_s2, nir = "B08", red = "B04", target_band = "NDVI")')]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ndvi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or name bands explicitly + append the result band to the existing cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// cube_s2_ndvi_bands = builder.ndvi(cube_s2, "B08", "B04", "NDVI")')]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v("For the purpose of understanding, we'll stick with our NDVI example to explore different ways of defining bandmath in openEO. That gives you the knowledge to define other processes, not just NDVIs. The first method is available in all clients: "),s("strong",[t._v("Defining a function")]),t._v(" and passing it to a process, e.g. "),s("code",[t._v("reduce_dimension")]),t._v(". If available, other possibilities are discussed afterwards.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Important: Check Band Indices and Bandnames!")]),t._v(" "),s("p",[t._v("Be careful when handling the names or array indices of bands. While names differ across back-ends, indices can be mixed up easily when some other band is deleted from the input collection. Python and JavaScript have 0-based indices, R indices are 1-based. So double check which bands you're actually using.")])]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# necessary imports")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" array_element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" normalized_difference\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define an NDVI function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ndvi_function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array_element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# array_element takes either an index ..")]),t._v("\n B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array_element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" label "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or a label")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ndvi = (B08 - B04) / (B08 + B04) # implement NDVI as formula ..")]),t._v("\n ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" normalized_difference"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# or use the openEO "normalized_difference" process')]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ndvi\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# supply the defined function to a reduce_dimension process, set dimension = "bands"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What we see above:")]),t._v(" "),s("ul",[s("li",[t._v("access specific bands inside the child process: "),s("code",[t._v("array_element")]),t._v(" (supply data and index/label)")]),t._v(" "),s("li",[t._v("call openEO defined functions inside the child process by importing it: "),s("code",[t._v("from openeo.processes import normalized_difference")])]),t._v(" "),s("li",[t._v("write math as formula inside the child process: "),s("code",[t._v("ndvi = (B08 - B04) / (B08 + B04)")])])]),t._v(" "),s("p",[t._v("The python client also holds a second possibility to do the above. It has a "),s("strong",[t._v("function "),s("code",[t._v("band")])]),t._v(" that does "),s("code",[t._v("array_element")]),t._v(" and "),s("code",[t._v('reduce_dimension(dimension = "bands")')]),t._v(" for us. When using it, we can type out the NDVI formula right in the script (since "),s("code",[t._v(".band")]),t._v(" reduced the cube for us).")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type math formula")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define an NDVI function")]),t._v("\nndvi_function "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we can supply an index (1-based in R) ..")]),t._v("\n B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or a label")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ndvi <- (B08 - B04) / (B08 + B04) # implement NDVI as formula ..")]),t._v("\n ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("normalized_difference"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# or use the openEO "normalized_difference" process')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ndvi <- p$normalized_difference(data[2], data[3]) # or shorten all in one line")]),t._v("\n\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# supply the defined function to a reduce_dimension process, set dimension = "bands"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What we see above:")]),t._v(" "),s("ul",[s("li",[t._v("access specific bands inside the child process by using array subset: "),s("code",[t._v("data[index]")]),t._v(" or "),s("code",[t._v('data["bandname"]')])]),t._v(" "),s("li",[t._v("call openEO defined functions inside the child process by calling it via the "),s("code",[t._v("p")]),t._v(" processes environment: "),s("code",[t._v("p$normalized_difference")])]),t._v(" "),s("li",[t._v("write math as formulas inside the child process: "),s("code",[t._v("ndvi <- (B08 - B04) / (B08 + B04)")])])]),t._v(" "),s("p",[t._v("In R, there are no other ways to define a child process than through defining a function as seen above.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define NDVI function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("ndvi_function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B04")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// use array operator to extract bands")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B08")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or supply label")]),t._v("\n\n ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("normalized_difference")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B04")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// use "this" to access openEO processes inside this function')]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ndvi = this.normalized_difference(data["B08"], data["B04"]) // or shorten it all into one line')]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ndvi\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// supply the defined function to a reduce_dimension process, set dimension = "bands"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ndvi_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What we see above:")]),t._v(" "),s("ul",[s("li",[t._v("access specific bands inside the child process by using array subset: "),s("code",[t._v("data[index]")]),t._v(" or "),s("code",[t._v('data["bandname"]')])]),t._v(" "),s("li",[t._v("call openEO defined functions inside the child process by calling it via "),s("code",[t._v("this")])])]),t._v(" "),s("p",[t._v("We note that JavaScript doesn't support just typing out math functions as R and Python do. But the JS client has another, even simpler way of defining quick bandmath: "),s("strong",[t._v("using "),s("code",[t._v("new Formula")])]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// using "New Formula()", both $index and $label are valid as seen here, $1 refers to B04')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"($B08 - $1) / ($B08 + $1)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We see that using "),s("code",[t._v('new Formula("")')]),t._v(" is much faster than defining a whole child process. We use "),s("code",[t._v("$")]),t._v(" to access bands (works with "),s("code",[t._v("$indices")]),t._v(" or "),s("code",[t._v("$bandnames")]),t._v("). If we want to use openEO defined processes, there's also the "),s("strong",[t._v("arrow function")]),t._v(" to still be able to do that in-line.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// using an arrow function to call openeo process "normalized_difference"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("normalized_difference")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In an arrow function, we can use array subsets again.")]),t._v(" "),s("p",[t._v("To sum up: Although "),s("code",[t._v("new Formula")]),t._v(" is probably the most straightforward way of calculating an NDVI, it is up to you to decide on a method that suits your use-case.")])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(305),alt:"NDVI image of the AOI"}}),t._v(" "),s("figcaption",[t._v("A correctly calculated NDVI would look as displayed here (scaled linearly).")])]),t._v(" "),s("h4",{attrs:{id:"example-2-evi"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-2-evi"}},[t._v("#")]),t._v(" Example 2: EVI")]),t._v(" "),s("p",[t._v("The formula for the Enhanced Vegetation Index is a bit more complicated than the NDVI one and contains constants. But we also don't necessarily need an openEO defined function and can concentrate on implementing a more complex formula. Here's the most efficient way to do this, per client.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# extract and reduce all bands via "band"')]),t._v("\nB02 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# write formula")]),t._v("\ncube_s2_evi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" B02"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# in R, there's no shorter way to define bandmath")]),t._v("\nevi_ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n b2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n b4 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" b4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" b4 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" b2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce_dimension bands with the defined formula")]),t._v("\ncube_s2_evi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" evi_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "new Formula" is the quickest way to provide a bandmath formula')]),t._v("\ncube_s2_evi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(2.5 * ($B08 - $B04)) / (($B08 + 6 * $B04 - 7.5 * $B02) + 1)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"masks-mask"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#masks-mask"}},[t._v("#")]),t._v(" Masks: "),s("code",[t._v("mask")])]),t._v(" "),s("p",[t._v("Masking generally refers to excluding (or replacing) specific areas from an image. This is usually done by providing a boolean mask that detemines which pixels to replace with a no-data value, and which to leave as they are. In the following we will consider two cases: a) Creating a mask from classification classes and b) creating a mask by thresholding an image.")]),t._v(" "),s("h4",{attrs:{id:"mask-out-specific-values"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mask-out-specific-values"}},[t._v("#")]),t._v(" Mask Out Specific Values")]),t._v(" "),s("p",[t._v("In some cases we want to mask our data with other data. A common example is to mask out clouds, which optical satellites can not see through. Some Sentinel 2 collections provide the "),s("code",[t._v("SCL")]),t._v(" classification band (see the table of classes "),s("a",{attrs:{href:"https://sentinels.copernicus.eu/web/sentinel/technical-guides/sentinel-2-msi/level-2a/algorithm",target:"_blank",rel:"noopener noreferrer"}},[t._v("at the bottom here"),s("OutboundLink")],1),t._v("), providing a representation coded into land cover classes. In this classification, vegetation is coded as "),s("code",[t._v("4")]),t._v(" and non-vegetation as "),s("code",[t._v("5")]),t._v(", while e.g. clouds are coded as "),s("code",[t._v("8")]),t._v(" to "),s("code",[t._v("10")]),t._v(".")]),t._v(" "),s("p",[t._v("In the following, we're building a mask using some logical operations as a child process while reducing the dimension "),s("code",[t._v("bands")]),t._v(". As explained at "),s("a",{attrs:{href:"#example-1-ndvi"}},[t._v("Example 1: NDVI")]),t._v(" this is done to be left with a cube that has no dimension "),s("code",[t._v("bands")]),t._v(". In R and JavaScript, we write a function "),s("code",[t._v("filter_")]),t._v(" that turns the values of the "),s("code",[t._v("SCL")]),t._v(" band into "),s("code",[t._v("0")]),t._v("s (for (non-) vegetation) and "),s("code",[t._v("1")]),t._v("s (for all others), and ignores all other bands. During "),s("code",[t._v("mask")]),t._v(", all "),s("code",[t._v("1")]),t._v("s (i.e. "),s("code",[t._v("TRUE")]),t._v(") pixels will be replaced, and as we don't define a replacement they will simply be set to "),s("code",[t._v("null")]),t._v(". In Python, in-line logical operations can be used.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get classification band")]),t._v("\nSCL "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we want to mask all other values, so NOT (4 OR 5)")]),t._v("\ncube_s2_mask "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("~")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("SCL "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("SCL "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# masking")]),t._v("\ncube_s2_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define filter function to create mask")]),t._v("\nfilter_function "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("eq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# vegetation is 4")]),t._v("\n non_vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("eq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# non-vegetation is 5")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we want to mask all other values, so NOT (4 OR 5)")]),t._v("\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("not"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("or"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" non_vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create mask by reducing bands with our defined formula")]),t._v("\ncube_s2_mask "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" filter_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# mask the NDVI data")]),t._v("\ncube_s2_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cube_s2_mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// filter classification layer")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("filter_function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("eq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// vegetation is 4")]),t._v("\n non_vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("eq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// non-vegetation is 5")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we want to mask all other values, so NOT (4 OR 5)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("not")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("or")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" non_vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create mask by reducing bands")]),t._v("\ncube_s2_mask "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" filter_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// mask")]),t._v("\ncube_s2_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mask")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cube_s2_mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v('As with all functionality there are differences between back-ends. If this first example "Mask Out Specific Values" doesn\'t work for you, that could be because we are trying to apply a mask (a cube with dimensions '),s("code",[t._v("x")]),t._v(", "),s("code",[t._v("y")]),t._v(", "),s("code",[t._v("t")]),t._v(") to the input data (a cube with dimensions "),s("code",[t._v("x")]),t._v(", "),s("code",[t._v("y")]),t._v(", "),s("code",[t._v("t")]),t._v(", "),s("code",[t._v("bands")]),t._v(") and thus, cubes with different dimensionality. If you encounter such a problem, try applying the first mask to the NDVI cube (with dimensions "),s("code",[t._v("x")]),t._v(", "),s("code",[t._v("y")]),t._v(", "),s("code",[t._v("t")]),t._v(') as it is shown in the second example "Thresholds".')]),t._v(" "),s("h4",{attrs:{id:"thresholds"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#thresholds"}},[t._v("#")]),t._v(" Thresholds")]),t._v(" "),s("p",[t._v("In this scenario we want an image that contains all NDVI values above 0.3, and holds no-data values otherwise. This could be useful to have a look at the vegetation in the area, without being distracted by all other NDVI values. For this example we reuse the NDVI cube "),s("code",[t._v("cube_s2_ndvi")]),t._v(" that was calculated in the "),s("a",{attrs:{href:"#example-1-ndvi"}},[t._v("NDVI bandmath-example")]),t._v(", thus for this to work you must include said code into your script.")]),t._v(" "),s("p",[t._v("If you look closely, you'll notice that this time we're not using "),s("code",[t._v("reduce_dimension")]),t._v(" to construct our masking cube (in contrast to "),s("a",{attrs:{href:"#mask-out-specific-values"}},[t._v("Mask out Specific Values")]),t._v("). In R and JavaScript we use "),s("code",[t._v("apply")]),t._v(" instead, and in the python client no "),s("code",[t._v(".band()")]),t._v(" is necessary anymore. This is because when we were masking using specific values of the band "),s("code",[t._v("SCL")]),t._v(", we were using the "),s("code",[t._v("cube_s2")]),t._v(" (with the bands "),s("code",[t._v("B02")]),t._v(", "),s("code",[t._v("B04")]),t._v(", "),s("code",[t._v("B08")]),t._v(" and "),s("code",[t._v("SCL")]),t._v(") as input. We then reduced the "),s("code",[t._v("bands")]),t._v(" dimension by writing and passing the function "),s("code",[t._v("filter_")]),t._v(", which returned a cube that had no "),s("code",[t._v("bands")]),t._v(" dimension anymore but "),s("code",[t._v("1")]),t._v("s and "),s("code",[t._v("0")]),t._v("s according to what we wanted to mask.")]),t._v(" "),s("p",[t._v("Here, we are making a mask out of the "),s("code",[t._v("cube_s2_ndvi")]),t._v(", a cube that had its "),s("code",[t._v("band")]),t._v(" dimension already reduced when the NDVI was calculated. To turn its values into "),s("code",[t._v("1")]),t._v("s and "),s("code",[t._v("0")]),t._v("s, we only need to "),s("code",[t._v("apply")]),t._v(" a threshold function. For this we utilize the openEO defined function "),s("code",[t._v("lt")]),t._v(' ("less than"). As usual the clients expose different ways of getting to that function, one of which is shown below.')]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create mask that is TRUE for NDVI < 0.3")]),t._v("\nndvi_threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply mask to NDVI")]),t._v("\ncube_s2_ndvi_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("threshold_ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create mask that is TRUE for NDVI < 0.3")]),t._v("\n threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("lt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply the threshold to the NDVI cube")]),t._v("\nndvi_threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" threshold_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# mask the NDVI cube with the calculated mask")]),t._v("\ncube_s2_ndvi_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ndvi_threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create mask that is TRUE for NDVI < 0.3 via an arrow function")]),t._v("\nndvi_threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("lt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// apply mask to NDVI cube")]),t._v("\ncube_s2_ndvi_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mask")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ndvi_threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(306),alt:"The NDVI with a threshold of 0.3 applied"}}),t._v(" "),s("figcaption",[t._v("Applying the above described threshold to the NDVI yields this result. Water and artificial surfaces are mostly masked from the image.")])]),t._v(" "),s("h3",{attrs:{id:"pixel-operations-apply"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pixel-operations-apply"}},[t._v("#")]),t._v(" Pixel Operations: "),s("code",[t._v("apply")])]),t._v(" "),s("p",[t._v("As we remember from the "),s("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html#apply"}},[t._v("datacube guide")]),t._v(", unary processes take only the pixel itself into account when calculating new pixel values. We can implement that with the "),s("code",[t._v("apply")]),t._v(" function and a child process that is in charge of modifying the pixel values. In our first example, that will be the square root. The openEO function is called "),s("code",[t._v("sqrt")]),t._v(". In the following we'll see how to pass it to the "),s("code",[t._v("apply")]),t._v(" process.")],1),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# pass unary child process as string")]),t._v("\ncube_s2_sqrt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sqrt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# pass unary child process as a function, call "sqrt" from openEO processes "p"')]),t._v("\ncube_s2_sqrt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sqrt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// pass unary child process via arrow function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_sqrt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sqrt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v("Let's say we're not looking at optical but SAR imagery. Depending on the collection held by the back-end, this data could already be log-scaled. In case it isn't, we may want to transform our data from intensity values to db. This formula is a bit more complicated: 10 * log"),s("sub",[t._v("10")]),t._v("(x). So we'll need a multiplication (by 10) and a "),s("code",[t._v("log")]),t._v(" process (to the "),s("code",[t._v("base")]),t._v(" 10).")]),t._v(" "),s("p",[t._v("Prior to applying the following code, we must load a collection containing SAR intensity data (e.g. Sentinel 1 GRD product).")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# import the defined openEO process")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" log\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define a child process")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log_")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# supply that function to the "apply" call')]),t._v("\ncube_s1_log10 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("log_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# call multiply, log functions from "p"')]),t._v("\ncube_s1_log10 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("multiply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// use openEO "log", "multiply" via arrow function')]),t._v("\ncube_s1_log10 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("multiply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(307),alt:"The AOI image is split into two parts: The upper part depicts SAR data with some very bright and many very dark pixels, the lower part is more balanced."}}),t._v(" "),s("figcaption",[t._v("Here we see the effect of transforming intensity data to db: Both parts of the image are linearly scaled, but only the lower part has been log-transformed. It makes the interpretation much easier because image pixels take on less 'extreme' values.")])]),t._v(" "),s("h3",{attrs:{id:"image-kernels-apply-kernel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#image-kernels-apply-kernel"}},[t._v("#")]),t._v(" Image Kernels: "),s("code",[t._v("apply_kernel")])]),t._v(" "),s("p",[t._v("The process "),s("code",[t._v("apply_kernel")]),t._v(" takes an array of weights that is used as a moving window to calculate new pixel values. This is often used to smooth or sharped the image (e.g. Gaussian blur or highpass filter, respectively). Here, we show two Sobel edge detection kernels (both vertical and horizontal) and a highpass filter.")]),t._v(" "),s("p",[t._v("We'll only consider band 8 to shorten computation time.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v("Throughout all clients we can define the kernel as an array of arrays, of which the inner arrays represent lines ("),s("code",[t._v("x")]),t._v(") and the outer arrays columns ("),s("code",[t._v("y")]),t._v("). This means that by adding a line break after each inner array, a true representation of the kernel can be created (see "),s("code",[t._v("highpass")]),t._v(" in Python or JavaScript tab).")]),t._v(" "),s("p",[t._v("The parameters "),s("code",[t._v("factor")]),t._v(" and "),s("code",[t._v("border")]),t._v(" are not needed here and are left out to fall back to default. "),s("code",[t._v("factor")]),t._v(" (default "),s("code",[t._v("1")]),t._v(") is multiplied with each pixel after the focal operation, while "),s("code",[t._v("border")]),t._v(" (default "),s("code",[t._v("0")]),t._v(") defines how overlaps between the kernel and the image borders are handled (should pixel values be mirrored, replicated or simply set to 0?, see "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply_kernel"}},[s("code",[t._v("apply_kernel")])]),t._v(").")],1),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we can pass a kernel as an array of arrays")]),t._v("\nsobel_vertical "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# e.g. 3x3 edge detection")]),t._v("\nsobel_horizontal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nhighpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or 5x5 highpass filter")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply to cube")]),t._v("\ncube_s2_highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_kernel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("highpass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we can pass a kernel as an array of arrays")]),t._v("\nsobel_vertical "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" byrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \nsobel_horizontal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# e.g. 3x3 edge detection")]),t._v("\n\nhighpass_vector "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nhighpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("highpass_vector"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or 5x5 highpass filter")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply to cube")]),t._v("\ncube_s2_b8_highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply_kernel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" kernel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" highpass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we can pass a kernel as an array of arrays")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" sobel_vertical "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// e.g. 3x3 edge detection")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" sobel_horizontal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or 5x5 highpass filter")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// apply to cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_kernel")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" highpass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(308),alt:"A combined edge detection RGB. Sobel vertical and horizontal are displayed as red and green, a 5x5 highpass filter is displayed as blue."}}),t._v(" "),s("figcaption",[t._v("Above a combined edge detection RGB can be seen. Sobel 3x3 vertical and horizontal edge detections are displayed as red and green, and a 5x5 highpass filter is displayed as blue. For this, all kernels in the code block above were applied and the sucessive cubes were merged afterwards.")])]),t._v(" "),s("h2",{attrs:{id:"endnote"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#endnote"}},[t._v("#")]),t._v(" Endnote")]),t._v(" "),s("p",[t._v("You have "),s("strong",[t._v("feedback or")]),t._v(" noticed an "),s("strong",[t._v("error")]),t._v("? Feel free to open an issue in the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("github repository"),s("OutboundLink")],1),t._v(" or use the "),s("a",{attrs:{href:"https://openeo.org/contact.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("other communication channels"),s("OutboundLink")],1)])],1)}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{315:function(t,s,a){t.exports=a.p+"assets/img/urk_scaling.1f27c164.jpg"},316:function(t,s,a){t.exports=a.p+"assets/img/urk.e6564348.jpg"},317:function(t,s,a){t.exports=a.p+"assets/img/pellworm_248.29ad280d.jpg"},318:function(t,s,a){t.exports=a.p+"assets/img/pellworm_ndvi.36c775d8.jpg"},319:function(t,s,a){t.exports=a.p+"assets/img/pellworm_threshold.be97c121.jpg"},320:function(t,s,a){t.exports=a.p+"assets/img/pellworm_s1.acf74ce7.jpg"},321:function(t,s,a){t.exports=a.p+"assets/img/pellworm_kernels.d12dda41.jpg"},515:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"openeo-cookbook"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#openeo-cookbook"}},[t._v("#")]),t._v(" openEO Cookbook")]),t._v(" "),s("p",[t._v("This is the openEO cookbook that you can refer to to get a first idea on how to solve problems with openEO in the three client languages Python, R and JavaScript. It describes how to implement simple use cases in a pragmatic way.")]),t._v(" "),s("p",[t._v("Please refer to the getting started guides for "),s("RouterLink",{attrs:{to:"/documentation/1.0/javascript/"}},[t._v("JavaScript")]),t._v(", "),s("RouterLink",{attrs:{to:"/documentation/1.0/python/"}},[t._v("Python")]),t._v(" and "),s("RouterLink",{attrs:{to:"/documentation/1.0/r/"}},[t._v("R")]),t._v(" if you have never worked with one of the openEO client libraries before. This guide requires you to have a basic idea of how to establish a connection to a back-end and how to explore that back-end.")],1),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("References")]),t._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("openEO processes documentation")])],1),t._v(" "),s("li",[s("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(" to discover back-ends with available data and processes")]),t._v(" "),s("li",[s("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Web Editor"),s("OutboundLink")],1),t._v(" to visually build and execute processing workflows")])]),t._v(" "),s("hr"),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaScript client documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("R client documentation"),s("OutboundLink")],1)])])]),t._v(" "),s("h2",{attrs:{id:"chapter-1"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chapter-1"}},[t._v("#")]),t._v(" Chapter 1")]),t._v(" "),s("p",[t._v("In this chapter, we want to explore the different output formats that are possible with openEO. For that, we load and filter a collection (a datacube) of satellite data and calculate the temporal mean of that data. Different steps (e.g. a linear scaling) are done to prepare for the data to be output in one of the formats: Raster or text data.")]),t._v(" "),s("p",[t._v("Throughout this guide, code examples for all three client languages are given. Select your preferred language with the code switcher on the right-hand side to set all examples to that language.")]),t._v(" "),s("h3",{attrs:{id:"connecting-to-a-back-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#connecting-to-a-back-end"}},[t._v("#")]),t._v(" Connecting to a back-end")]),t._v(" "),s("p",[t._v("Click the link below to see how to connect to a back-end (via OpenID Connect). You can call the connection object "),s("code",[t._v("con")]),t._v(" as it is done in all following code, to avoid confusion throughout the rest of the tutorials.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("p",[s("RouterLink",{attrs:{to:"/documentation/1.0/python/#openid-connect-authentication"}},[t._v("Getting started: Authentication")])],1)]},proxy:!0},{key:"r",fn:function(){return[s("p",[s("RouterLink",{attrs:{to:"/documentation/1.0/r/#openid-connect-authentication"}},[t._v("Getting started: Authentication")])],1)]},proxy:!0},{key:"js",fn:function(){return[s("p",[s("RouterLink",{attrs:{to:"/documentation/1.0/javascript/#openid-connect-authentication"}},[t._v("Getting started: Authentication")])],1)]},proxy:!0}])}),t._v(" "),s("p",[t._v("In R and JavaScript it is very useful to assign a graph-building helper object to a variable, to easily access all openEO processes and add them to the process graph that you will be building. These objects will be used throughout this guide. In Python, it also helps to import a helper object, even though we'll need it less often.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# import ProcessBuilder functions")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" ProcessBuilder\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" Many functions in "),s("em",[t._v("child processes")]),t._v(" (see below), are instances of this "),s("code",[t._v("ProcessBuilder")]),t._v(" import.")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# assign the graph-building helper object to "p" for easy access to all openEO processes, see > ?processes()')]),t._v("\np "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In all R code, "),s("code",[t._v("p")]),t._v(" is used to select openEO processes.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// assign the graph-building helper object to "builder" for easy access to all openEO processes')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In all JavaScript code, "),s("code",[t._v("builder")]),t._v(" is used to select openEO processes.")])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"input-load-collection"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#input-load-collection"}},[t._v("#")]),t._v(" Input: "),s("code",[t._v("load_collection")])]),t._v(" "),s("p",[t._v("Before loading a collection, we need to find out the exact name of a collection we want to use (back-end-specific, see references "),s("a",{attrs:{href:"#openeo-cookbook"}},[t._v("at the top")]),t._v("). We assign the spatial and temporal extent to variables, so that we can re-use them on other collections we might want to load. Let's look for a Sentinel 2 (preprocessed level 2A preferably) collection and load the green, red and a near-infrared band (bands 3, 4 and 8).")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Collection and Band Names")]),t._v(" "),s("p",[t._v("The names of collections and bands differ between back-ends. So always check the collection description for the correct names. The differences might be subtle, e.g. "),s("code",[t._v("B8")]),t._v(" vs. "),s("code",[t._v("B08")]),t._v(".")])]),t._v(" "),s("p",[t._v("We'll name our collection very explicitly "),s("code",[t._v("cube_s2_b348")]),t._v(" as to not get confused later on.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# make dictionary, containing bounding box")]),t._v("\nurk "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.5661")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6457")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.7298")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.7335")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# make list, containing the temporal interval")]),t._v("\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load first datacube")]),t._v("\ncube_s2_b348 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2_SR"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" urk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create variables for loading collection")]),t._v("\nurk "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.5661")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6457")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.7298")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.7335")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load first datacube")]),t._v("\ncube_s2_b348 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2_SR"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" urk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// make spatial and temporal extent")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" urk "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.5661")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6457")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.7298")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.7335")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-04-30"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// load first cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b348 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2_SR"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n urk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" JavaScript doesn't use parameter names (like Python and R), so the parameters need to be in the order that they are defined in the "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("openEO processes documentation")]),t._v(".")],1)]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"filter-bands-filter-bands"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#filter-bands-filter-bands"}},[t._v("#")]),t._v(" Filter Bands: "),s("code",[t._v("filter_bands")])]),t._v(" "),s("p",[t._v("To go through the desired output formats, we'll need one collection with three bands, and one collection with only one band. Here we use "),s("code",[t._v("filter_bands")]),t._v(", when of course we could also just define a separate collection via "),s("code",[t._v("load_collection")]),t._v(". As our input datacube already has the required three bands, we filter it for a single band to create an additional datacube with the same spatial and temporal extent, but with only one band (band 8).")]),t._v(" "),s("p",[t._v("We'll name this one "),s("code",[t._v("cube_s2_b8")]),t._v(" to distinguish it from the original "),s("code",[t._v("cube_s2_b348")]),t._v(".")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# filter for band 8")]),t._v("\ncube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# filter for band 8")]),t._v("\ncube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// filter for band 8")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"temporal-mean-reduce-dimension"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#temporal-mean-reduce-dimension"}},[t._v("#")]),t._v(" Temporal Mean: "),s("code",[t._v("reduce_dimension")])]),t._v(" "),s("p",[t._v("As we don't want to download the raw collection of satellite data, we need to reduce that data somehow. That means, we want to get rid of one dimension. Let's say we calculate a "),s("code",[t._v("mean")]),t._v(" over all timesteps, and then drop the temporal dimension (as it's empty then anyway, see explanation in the "),s("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html#reduce"}},[t._v("datacube guide")]),t._v("). This can be done via "),s("code",[t._v("reduce_dimension()")]),t._v(". The function requires a reducer, in our case a "),s("code",[t._v("mean")]),t._v(" process, and the dimension over which to reduce, given as a string ("),s("code",[t._v('"t"')]),t._v(").")],1),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Child Processes")]),t._v(" "),s("p",[t._v("Here, we need to define a child process: A function that is called by (or passed to) another function, and then works on a subset of the datacube (somewhat similar to the concept of callbacks in JavaScript). In this case: We want "),s("code",[t._v("reduce_dimension")]),t._v(" to use the "),s("code",[t._v("mean")]),t._v(" function to average all timesteps of each pixel. Not any function can be used like this, it must be defined by openEO, of course.")]),t._v(" "),s("p",[t._v("All clients have more or less different specifics when defining a child process. As you can observe directly below, one way to define one is to define the function directly inside the parent process.")]),t._v(" "),s("p",[t._v("For a more clean way to define a child process, see the chapter below.")])]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce all timesteps")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# mean_time() is a shortcut function")]),t._v("\ncube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively, 'reduce_dimension' can be used")]),t._v("\ncube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# additionally, reduce second collection")]),t._v("\ncube_s2_b348_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In python, the child process can be a string.")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce dimension, first collection")]),t._v("\ncube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce, second collection")]),t._v("\ncube_s2_b348_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In R, we can select a child process from the "),s("code",[t._v("p")]),t._v(" helper object.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// reduce dimension")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b8_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// second collection")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b348_red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" In JavaScript, arrow functions can be used as child processes.")])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"scale-all-pixels-linearly-apply-linear-scale-range"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scale-all-pixels-linearly-apply-linear-scale-range"}},[t._v("#")]),t._v(" Scale All Pixels Linearly: "),s("code",[t._v("apply")]),t._v(", "),s("code",[t._v("linear_scale_range")])]),t._v(" "),s("p",[t._v("To create a PNG output, we need to scale the satellite data we have down to the 8bit range of a PNG image. For this, the scale range of our imagery has to be known. For Sentinel 2 over urban and agricultural areas, we can use "),s("code",[t._v("6000")]),t._v(" as a maximum.")]),t._v(" "),s("p",[t._v("We'll use the process "),s("code",[t._v("linear_scale_range")]),t._v(". It takes a number and the four borders of the intervals as input. Because it works on a number and not a datacube as all processes discussed so far, we need to nest the process into an "),s("code",[t._v("apply")]),t._v(", once again defining a child process. "),s("code",[t._v("apply")]),t._v(" applies a unary process to all pixels of a datacube.")]),t._v(" "),s("p",[t._v("This time we'll also define our child processes externally, as to not get confused in too much code nesting.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define child process, use ProcessBuilder")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale_function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" ProcessBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("linear_scale_range"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply scale_function to all pixels")]),t._v("\ncube_s2_b348_red_lin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("scale_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Resource:")]),t._v(" Refer to the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html#processes-with-child-callbacks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client documentation"),s("OutboundLink")],1),t._v(" to learn more about child processes in Python.")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define child process")]),t._v("\nscale_function "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("linear_scale_range"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inputMin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inputMax "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMax "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply scale range to all pixels")]),t._v("\ncube_s2_b348_red_lin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" scale_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define child process (long way)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("scale_function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("linear_scale_range")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we could also use an arrow function here to abbreviate")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// var scale_function = (x, context, child) => child.linear_scale_range(x, 0, 6000, 0, 255)")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// apply child process to all pixels")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b348_red_lin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" Given the two ways of defining a child process above, we can see that in the long way, the builder is available as "),s("code",[t._v("this")]),t._v(", while in arrow functions, it has to be passed as the last argument (here called "),s("code",[t._v("child")]),t._v(").")])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(315),alt:"A comparison between an unscaled and a scaled raster is shown. Unscaled values are much larger, sclaed values much closer together and all below 255."}}),t._v(" "),s("figcaption",[t._v("A part of our original image is displayed here, to observe the effect of applying a linear scale: Original (thus unscaled) imagery is seen on the left, and scaled values on the right.")])]),t._v(" "),s("h3",{attrs:{id:"spatial-aggregation-aggregate-spatial"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#spatial-aggregation-aggregate-spatial"}},[t._v("#")]),t._v(" Spatial Aggregation: "),s("code",[t._v("aggregate_spatial")])]),t._v(" "),s("p",[t._v('To look at text output formats we first need to "de-spatialize" our data. Or put another way: If we\'re interested in e.g. timeseries of various geometries, text output might be very interesting for us.')]),t._v(" "),s("p",[t._v("To aggregate over certain geometries, we use the process "),s("code",[t._v("aggregate_spatial")]),t._v(". It takes valid GeoJSON as input. We can pass a GeoJSON "),s("code",[t._v("FeatureCollection")]),t._v(" in Python and JavaScript, but we need to introduce two packages in R, "),s("code",[t._v("sf")]),t._v(" and "),s("code",[t._v("geojsonsf")]),t._v(", to convert the "),s("code",[t._v("FeatureCollection")]),t._v(" "),s("code",[t._v("string")]),t._v(" to a "),s("code",[t._v("simple feature collection")]),t._v(".")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# polygons as (geojson) dict")]),t._v("\npolygons "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FeatureCollection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"features"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.629441738128662")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68157281641395")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.633561611175536")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.67787822078012")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.6201934814453125")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68429152697491")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.628776550292969")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.683719180920846")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# aggregate spatial")]),t._v("\ncube_s2_b8_agg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("aggregate_spatial"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("geometries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" polygons"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mean"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively, the python client has a shortcut function for this special case")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# cube_s2_b8_agg = cube_s2_b8.polygonal_mean_timeseries(polygon = polygons)")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load sf and geojsonsf")]),t._v("\nlibrary"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlibrary"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("geojsonsf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create string containing the geojson FeatureCollection")]),t._v("\npolygons_string "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.636715888977051, 52.6807532675943 ], [ 5.629441738128662, 52.68157281641395 ], [ 5.633561611175536, 52.67787822078012 ], [ 5.636715888977051, 52.6807532675943 ] ] ] } }, { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.622982978820801, 52.68595649102906 ], [ 5.6201934814453125, 52.68429152697491 ], [ 5.628776550292969, 52.683719180920846 ], [ 5.622982978820801, 52.68595649102906 ] ] ] } } ]}\'')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# convert to sf object")]),t._v("\npolygons "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" geojson_sf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("polygons_string"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# add any attribute as a workaround, empty simple features are not accepted")]),t._v("\npolygons"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("anAttribute "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# aggregate spatially")]),t._v("\ncube_s2_b8_agg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("aggregate_spatial"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" geometries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" polygons"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" At the time of writing this, empty simple features are not accepted and produce an error. To work around this issue, simply add a random attribute to the "),s("code",[t._v("sf")]),t._v(" object. Above we are assigning the (randomly chosen) values "),s("code",[t._v("4")]),t._v(" and "),s("code",[t._v("5")]),t._v(" to the two polygons in the collection.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define polygons as geojson")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" polygons "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FeatureCollection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"features"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.629441738128662")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68157281641395")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.633561611175536")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.67787822078012")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.636715888977051")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.6807532675943")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Feature"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"geometry"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Polygon"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"coordinates"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.6201934814453125")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68429152697491")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.628776550292969")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.683719180920846")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.622982978820801")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("52.68595649102906")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// aggregate spatial")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_b8_agg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("aggregate_spatial")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" polygons"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"output-save-result"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#output-save-result"}},[t._v("#")]),t._v(" Output: "),s("code",[t._v("save_result")])]),t._v(" "),s("p",[t._v("To get a result, we first need to create a "),s("code",[t._v("save_result")]),t._v(" node, in which we state the desired output format and potential parameters, both dependent on the back-end you are connected to. The output formats and their parameters can e.g. be explored via the Web Editor along with available processes and collections.")]),t._v(" "),s("p",[t._v("We then proceed to send that job to the back-end, "),s("em",[t._v("without executing it")]),t._v(". Refer to the getting started guides on how to process results as batch or synchronous jobs. The way it is stated here allows us to log in to the Web Editor and look at, change, and execute the job from there.")]),t._v(" "),s("h4",{attrs:{id:"raster-formats-gtiff-netcdf"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#raster-formats-gtiff-netcdf"}},[t._v("#")]),t._v(" Raster Formats: GTiff, NetCDF")]),t._v(" "),s("p",[t._v("In the example, GeoTiff files are produced. Refer to the back-end for the available formats, options, and their correct naming. Check the "),s("a",{attrs:{href:"#raster-formats-png"}},[t._v("PNG section")]),t._v(" for passing options.")]),t._v(" "),s("p",[t._v("Different from the creation of a PNG image, the raster format doesn't need scaling and the original datacube can be downloaded as is. However, we need to be careful with the dimensionality of the datacube: How a 4+ - dimensional datacube is handled when converted to a raster format is back-end dependent. That is why we "),s("a",{attrs:{href:"#temporal-mean-reduce-dimension"}},[t._v("made sure")]),t._v(" that our cube would only contain one additional dimension, apart from the spatial "),s("code",[t._v("x")]),t._v(" and "),s("code",[t._v("y")]),t._v(".")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save using save_result, give format as string")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end, do not execute")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_GTiff_py"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# use list_file_formats() to be able to choose from a list")]),t._v("\nformats "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list_file_formats"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save using save_result, give format via list")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("GTiff"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_GTiff_r"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save using save_result, give fomat as string")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8_red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// send job to back-end, but don't execute yet; set title")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_GTiff_js"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h4",{attrs:{id:"raster-formats-png"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#raster-formats-png"}},[t._v("#")]),t._v(" Raster Formats: PNG")]),t._v(" "),s("p",[t._v("For a PNG output, we'll use the datacube with the bands 3, 4 and 8 (green, red and near-infrared) that we've been working on simultaneously with the datacube used above. As we have scaled the data down to 8bit using a "),s("a",{attrs:{href:"#scale-all-pixels-linearly-apply-linear-scale-range"}},[t._v("linear scale")]),t._v(", nothing stands in the way of downloading the data as PNG.")]),t._v(" "),s("p",[t._v("We want to produce a false-color composite highlighting the vegetation in red (as seen below the code). For that, we want to assign the infrared band ("),s("code",[t._v("B8")]),t._v(") to the red channel, the red band ("),s("code",[t._v("B4")]),t._v(") to the green channel and the green band ("),s("code",[t._v("B3")]),t._v(") to the blue channel. Some back-ends may offer to pass along this desired band order as it is shown below. Check with the back-end for available options.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("If no options can be passed, handling of the bands for PNG output is internal and should be documented by the back-end. You might also be able to tell how this is done by how your PNG looks: As explained in the "),s("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html#dimensions"}},[t._v("datacube guide")]),t._v(", the order of the "),s("code",[t._v("bands")]),t._v(" dimension is defined when the values are loaded or altered (in our example: "),s("code",[t._v("filter_bands")]),t._v("). As we filter bands in the order "),s("code",[t._v('"B3", "B4", "B8"')]),t._v(" vegetation might be highlighted in blue, given that the back-end uses the input order for the RGB channels.")],1),t._v(" "),s("p",[s("strong",[t._v("The example below uses the "),s("code",[t._v("PNG")]),t._v(" file format as defined by the Google Earth Engine back-end so the parameters "),s("code",[t._v("red")]),t._v(", "),s("code",[t._v("green")]),t._v(" and "),s("code",[t._v("blue")]),t._v(" may not be available on another back-end.")]),t._v(" Make sure to check the file format documentation for your back-end.")])]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result cube as PNG")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red_lin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PNG"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"green"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_PNG_py"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In python, options are passed as a dictionary")])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# use list_file_formats() to be able to choose from a list")]),t._v("\nformats "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list_file_formats"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result as PNG")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b348_red_lin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("PNG"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n options "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" green"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blue"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_PNG_r"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In R, options are passed as a list.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save result as PNG")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b348_red_lin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PNG"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("red")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("green")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("blue")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B3"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// send job to back-end")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal_mean_as_PNG_js"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In JavaScript, options are passed as objects.")])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(316),alt:"Example PNG: false color composite highlighting vegetation in red."}}),t._v(" "),s("figcaption",[t._v("Image above: Example PNG output with the vegetation highlighted in red.")])]),t._v(" "),s("h4",{attrs:{id:"text-formats-json-csv"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#text-formats-json-csv"}},[t._v("#")]),t._v(" Text Formats: JSON, CSV")]),t._v(" "),s("p",[t._v("We can now save the timeseries in the "),s("a",{attrs:{href:"#spatial-aggregation-aggregate-spatial"}},[t._v("aggregated")]),t._v(" datacube as e.g. JSON.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result cube as JSON")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_agg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timeseries_as_JSON_py"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# use list_file_formats() to be able to choose from a list")]),t._v("\nformats "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list_file_formats"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# save result as JSON")]),t._v("\nres "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8_agg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("JSON"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send job to back-end")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timeseries_as_JSON_r"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" Because the R client rounds coordinates to four digits, slightly different results are received in comparison to the other clients.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save as CSV")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8_agg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"JSON"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// send job to back-end")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"timeseries_as_JSON_js"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"output-process-as-json"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#output-process-as-json"}},[t._v("#")]),t._v(" Output: Process as JSON")]),t._v(" "),s("p",[t._v("In some cases we want to export the JSON representation of a process we created. If you followed one of the examples above, then your end node is called "),s("code",[t._v("res")]),t._v(". If not, replace that with whatever you called your process end node.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("process "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("to_json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# if needed, write JSON to file, e.g.:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("open")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./process.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"w"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" tfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n tfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("write"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# convert process to JSON")]),t._v("\nprocess_json "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" toJSON"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("as"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Process"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# if needed, write JSON to file, e.g.:")]),t._v("\ncat"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process_json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" file "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./process.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// set last node as result = true so it is recognized as the result node")]),t._v("\nres"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n\nprocess "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toJSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if needed, write JSON to file, e.g.:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" fs "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'fs'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nfs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("writeFileSync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./process.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("Note:")]),t._v(" The code to store a file only works with NodeJS. Browsers can't write files to disk.")])]},proxy:!0}])}),t._v(" "),s("h2",{attrs:{id:"chapter-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chapter-2"}},[t._v("#")]),t._v(" Chapter 2")]),t._v(" "),s("p",[t._v("In this second part of the cookbook, things are a bit less linear. We'll explore bandmath, masking and "),s("code",[t._v("apply_*")]),t._v(" functionality, only that these steps are less interconnected than in the first chapter.")]),t._v(" "),s("p",[t._v("As usual we'll load a collection to work with (Sentinel 2, bands "),s("code",[t._v("2")]),t._v(", "),s("code",[t._v("4")]),t._v(", "),s("code",[t._v("8")]),t._v(" and "),s("code",[t._v("SCL")]),t._v("). Let's call it "),s("code",[t._v("cube_s2")]),t._v(". We pre-select a time frame of which we know it only contains one Sentinel 2 scene, so that we're not bothered with multiple timesteps (the collection still contains a time dimension, but with only one timestep in it, so that it can be ignored). The extent has been chosen to provide results that are suitable to show the effect of the processes used, while being considerably small and thus fast to compute. If you want to minimize processing time you are of course free to use much smaller AOIs.")]),t._v(" "),s("p",[t._v("To be able to download and look at the results, refer to the "),s("a",{attrs:{href:"#raster-formats-gtiff-netcdf"}},[t._v("output section of chapter 1")]),t._v(". Most of the images in this tutorial were all downloaded as GTiff and plotted with R.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("pellworm "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.5464")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.4473")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.0724")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.5685")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\ncube_s2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL2_L2A_SENTINELHUB"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pellworm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("pellworm "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.5464")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.4473")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.0724")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.5685")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncube_s2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL2_L2A_SENTINELHUB"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pellworm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" pellworm "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.5464")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.4473")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.0724")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("54.5685")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021-03-05"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL2_L2A_SENTINELHUB"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n pellworm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(317),alt:"The AOI around Pellworm is shown as a false color RGB. RGB = red, nir and blue"}}),t._v(" "),s("figcaption",[t._v("This is a false color image of our area of interest for this chapter. The bands 4, 8 and 2 have been assigned to the RGB channels without any further processing. The surrounding area of the island Pellworm is shown at low tide.\n")])]),t._v(" "),s("h3",{attrs:{id:"bandmath"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#bandmath"}},[t._v("#")]),t._v(" Bandmath")]),t._v(" "),s("p",[t._v("Bandmath refers to computations that involve multiple bands, like indices (Normalized Difference Vegetation Index, Normalized Burn Ratio etc.).")]),t._v(" "),s("p",[t._v("In openEO, this goes along with using for example "),s("code",[t._v("reduce_dimension")]),t._v(" over the "),s("code",[t._v("bands")]),t._v(" dimension. In this process, a new pixel value is calculated from the values of different bands using a given formula (the actual bandmath), to then eliminate the "),s("code",[t._v("bands")]),t._v(" dimension alltogether. If e.g. a cube contains a "),s("code",[t._v("red")]),t._v(" and a "),s("code",[t._v("nir")]),t._v(" band in its "),s("code",[t._v("bands")]),t._v(" dimension and we reduce said dimension with a formula for the NDVI, that cube afterwards contains NDVI values, but no "),s("code",[t._v("bands")]),t._v(" dimension anymore.")]),t._v(" "),s("p",[t._v("In the following we'll observe a thorough explanation of how to calculate an NDVI. That section covers different ways (depending on the client) to set up such a process in openEO. Afterwards, we'll see how an EVI is computed in a quicker, less thorough example.")]),t._v(" "),s("h4",{attrs:{id:"example-1-ndvi"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-1-ndvi"}},[t._v("#")]),t._v(" Example 1: NDVI")]),t._v(" "),s("p",[t._v("As mentioned above, bandmath is about reducing the "),s("code",[t._v("bands")]),t._v(" dimension with a child process (a formula) that gives us the desired output. In "),s("a",{attrs:{href:"#chapter-1"}},[t._v("chapter one")]),t._v(", we already saw different ways of defining a child process: a) We learned how to use a simple "),s("code",[t._v("mean")]),t._v(" to "),s("RouterLink",{attrs:{to:"/documentation/1.0/cookbook/#temporal-mean-reduce-dimension"}},[t._v("reduce the time dimension")]),t._v(", and b) we saw how to access and use the openEO defined "),s("code",[t._v("linear_scale_range")]),t._v(" function "),s("RouterLink",{attrs:{to:"/documentation/1.0/cookbook/#scale-all-pixels-linearly-apply-linear-scale-range"}},[t._v("to scale all pixels linearly")]),t._v(".")],1),t._v(" "),s("p",[t._v("In this chapter, we'll reiterate these techniques and discuss some subtleties and alternatives. It is up to you to choose one that works best. Special to the NDVI is, given that it is "),s("em",[t._v("the")]),t._v(" most common use case, that openEO has predefined processes that cover the math for us and only need to be given the correct input. There even is a function "),s("code",[t._v("ndvi")]),t._v(" that masks all details and only takes a datacube and the bandnames as input. Further down we'll dig into what this "),s("code",[t._v("ndvi")]),t._v(" process actually masks, how we can reproduce that manually, and thus how we could formulate other bandmath functions, apart from an NDVI.")]),t._v(" "),s("p",[t._v("By using the openEO defined "),s("strong",[s("code",[t._v("ndvi")]),t._v(" function")]),t._v(", calculating an NDVI becomes pretty straightforward. The process can detect the red and near-infrared band based on metadata and doesn't need bandname input (but band names can be passed to calculate other normalized differences). Also, by supplying the optional parameter "),s("code",[t._v("target_band")]),t._v(" we can decide if we want to get a reduced cube with NDVI values and no "),s("code",[t._v("bands")]),t._v(" dimension as result, or if we want to append the new NDVI band to the existing bands of our input cube. If we choose the latter, we only need to supply a name for that new NDVI band.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or name bands explicitly + append the result band to the existing cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# cube_s2_ndvi_bands = cube_s2.ndvi(nir = "B08", red = "B04", target_band = "NDVI")')]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or name bands explicitly + append the result band to the existing cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# cube_s2_nvdi_bands <- p$ndvi(data = cube_s2, nir = "B08", red = "B04", target_band = "NDVI")')]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ndvi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or name bands explicitly + append the result band to the existing cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// cube_s2_ndvi_bands = builder.ndvi(cube_s2, "B08", "B04", "NDVI")')]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v("For the purpose of understanding, we'll stick with our NDVI example to explore different ways of defining bandmath in openEO. That gives you the knowledge to define other processes, not just NDVIs. The first method is available in all clients: "),s("strong",[t._v("Defining a function")]),t._v(" and passing it to a process, e.g. "),s("code",[t._v("reduce_dimension")]),t._v(". If available, other possibilities are discussed afterwards.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Important: Check Band Indices and Bandnames!")]),t._v(" "),s("p",[t._v("Be careful when handling the names or array indices of bands. While names differ across back-ends, indices can be mixed up easily when some other band is deleted from the input collection. Python and JavaScript have 0-based indices, R indices are 1-based. So double check which bands you're actually using.")])]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# necessary imports")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" array_element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" normalized_difference\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define an NDVI function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ndvi_function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array_element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" index "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# array_element takes either an index ..")]),t._v("\n B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" array_element"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" label "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or a label")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ndvi = (B08 - B04) / (B08 + B04) # implement NDVI as formula ..")]),t._v("\n ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" normalized_difference"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# or use the openEO "normalized_difference" process')]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ndvi\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# supply the defined function to a reduce_dimension process, set dimension = "bands"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What we see above:")]),t._v(" "),s("ul",[s("li",[t._v("access specific bands inside the child process: "),s("code",[t._v("array_element")]),t._v(" (supply data and index/label)")]),t._v(" "),s("li",[t._v("call openEO defined functions inside the child process by importing it: "),s("code",[t._v("from openeo.processes import normalized_difference")])]),t._v(" "),s("li",[t._v("write math as formula inside the child process: "),s("code",[t._v("ndvi = (B08 - B04) / (B08 + B04)")])])]),t._v(" "),s("p",[t._v("The python client also holds a second possibility to do the above. It has a "),s("strong",[t._v("function "),s("code",[t._v("band")])]),t._v(" that does "),s("code",[t._v("array_element")]),t._v(" and "),s("code",[t._v('reduce_dimension(dimension = "bands")')]),t._v(" for us. When using it, we can type out the NDVI formula right in the script (since "),s("code",[t._v(".band")]),t._v(" reduced the cube for us).")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type math formula")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define an NDVI function")]),t._v("\nndvi_function "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we can supply an index (1-based in R) ..")]),t._v("\n B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or a label")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ndvi <- (B08 - B04) / (B08 + B04) # implement NDVI as formula ..")]),t._v("\n ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("normalized_difference"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# or use the openEO "normalized_difference" process')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ndvi <- p$normalized_difference(data[2], data[3]) # or shorten all in one line")]),t._v("\n\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# supply the defined function to a reduce_dimension process, set dimension = "bands"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What we see above:")]),t._v(" "),s("ul",[s("li",[t._v("access specific bands inside the child process by using array subset: "),s("code",[t._v("data[index]")]),t._v(" or "),s("code",[t._v('data["bandname"]')])]),t._v(" "),s("li",[t._v("call openEO defined functions inside the child process by calling it via the "),s("code",[t._v("p")]),t._v(" processes environment: "),s("code",[t._v("p$normalized_difference")])]),t._v(" "),s("li",[t._v("write math as formulas inside the child process: "),s("code",[t._v("ndvi <- (B08 - B04) / (B08 + B04)")])])]),t._v(" "),s("p",[t._v("In R, there are no other ways to define a child process than through defining a function as seen above.")])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define NDVI function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("ndvi_function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B04")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// use array operator to extract bands")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B08")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or supply label")]),t._v("\n\n ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("normalized_difference")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B08")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("B04")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// use "this" to access openEO processes inside this function')]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// ndvi = this.normalized_difference(data["B08"], data["B04"]) // or shorten it all into one line')]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ndvi\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// supply the defined function to a reduce_dimension process, set dimension = "bands"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ndvi_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What we see above:")]),t._v(" "),s("ul",[s("li",[t._v("access specific bands inside the child process by using array subset: "),s("code",[t._v("data[index]")]),t._v(" or "),s("code",[t._v('data["bandname"]')])]),t._v(" "),s("li",[t._v("call openEO defined functions inside the child process by calling it via "),s("code",[t._v("this")])])]),t._v(" "),s("p",[t._v("We note that JavaScript doesn't support just typing out math functions as R and Python do. But the JS client has another, even simpler way of defining quick bandmath: "),s("strong",[t._v("using "),s("code",[t._v("new Formula")])]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// using "New Formula()", both $index and $label are valid as seen here, $1 refers to B04')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"($B08 - $1) / ($B08 + $1)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("We see that using "),s("code",[t._v('new Formula("")')]),t._v(" is much faster than defining a whole child process. We use "),s("code",[t._v("$")]),t._v(" to access bands (works with "),s("code",[t._v("$indices")]),t._v(" or "),s("code",[t._v("$bandnames")]),t._v("). If we want to use openEO defined processes, there's also the "),s("strong",[t._v("arrow function")]),t._v(" to still be able to do that in-line.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// using an arrow function to call openeo process "normalized_difference"')]),t._v("\ncube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("normalized_difference")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In an arrow function, we can use array subsets again.")]),t._v(" "),s("p",[t._v("To sum up: Although "),s("code",[t._v("new Formula")]),t._v(" is probably the most straightforward way of calculating an NDVI, it is up to you to decide on a method that suits your use-case.")])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(318),alt:"NDVI image of the AOI"}}),t._v(" "),s("figcaption",[t._v("A correctly calculated NDVI would look as displayed here (scaled linearly).")])]),t._v(" "),s("h4",{attrs:{id:"example-2-evi"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-2-evi"}},[t._v("#")]),t._v(" Example 2: EVI")]),t._v(" "),s("p",[t._v("The formula for the Enhanced Vegetation Index is a bit more complicated than the NDVI one and contains constants. But we also don't necessarily need an openEO defined function and can concentrate on implementing a more complex formula. Here's the most efficient way to do this, per client.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# extract and reduce all bands via "band"')]),t._v("\nB02 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# write formula")]),t._v("\ncube_s2_evi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" B04"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B08 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" B04 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" B02"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# in R, there's no shorter way to define bandmath")]),t._v("\nevi_ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n b2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n b4 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" b4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" b4 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" b2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# reduce_dimension bands with the defined formula")]),t._v("\ncube_s2_evi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" evi_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "new Formula" is the quickest way to provide a bandmath formula')]),t._v("\ncube_s2_evi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"(2.5 * ($B08 - $B04)) / (($B08 + 6 * $B04 - 7.5 * $B02) + 1)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("h3",{attrs:{id:"masks-mask"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#masks-mask"}},[t._v("#")]),t._v(" Masks: "),s("code",[t._v("mask")])]),t._v(" "),s("p",[t._v("Masking generally refers to excluding (or replacing) specific areas from an image. This is usually done by providing a boolean mask that detemines which pixels to replace with a no-data value, and which to leave as they are. In the following we will consider two cases: a) Creating a mask from classification classes and b) creating a mask by thresholding an image.")]),t._v(" "),s("h4",{attrs:{id:"mask-out-specific-values"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mask-out-specific-values"}},[t._v("#")]),t._v(" Mask Out Specific Values")]),t._v(" "),s("p",[t._v("In some cases we want to mask our data with other data. A common example is to mask out clouds, which optical satellites can not see through. Some Sentinel 2 collections provide the "),s("code",[t._v("SCL")]),t._v(" classification band (see the table of classes "),s("a",{attrs:{href:"https://sentinels.copernicus.eu/web/sentinel/technical-guides/sentinel-2-msi/level-2a/algorithm",target:"_blank",rel:"noopener noreferrer"}},[t._v("at the bottom here"),s("OutboundLink")],1),t._v("), providing a representation coded into land cover classes. In this classification, vegetation is coded as "),s("code",[t._v("4")]),t._v(" and non-vegetation as "),s("code",[t._v("5")]),t._v(", while e.g. clouds are coded as "),s("code",[t._v("8")]),t._v(" to "),s("code",[t._v("10")]),t._v(".")]),t._v(" "),s("p",[t._v("In the following, we're building a mask using some logical operations as a child process while reducing the dimension "),s("code",[t._v("bands")]),t._v(". As explained at "),s("a",{attrs:{href:"#example-1-ndvi"}},[t._v("Example 1: NDVI")]),t._v(" this is done to be left with a cube that has no dimension "),s("code",[t._v("bands")]),t._v(". In R and JavaScript, we write a function "),s("code",[t._v("filter_")]),t._v(" that turns the values of the "),s("code",[t._v("SCL")]),t._v(" band into "),s("code",[t._v("0")]),t._v("s (for (non-) vegetation) and "),s("code",[t._v("1")]),t._v("s (for all others), and ignores all other bands. During "),s("code",[t._v("mask")]),t._v(", all "),s("code",[t._v("1")]),t._v("s (i.e. "),s("code",[t._v("TRUE")]),t._v(") pixels will be replaced, and as we don't define a replacement they will simply be set to "),s("code",[t._v("null")]),t._v(". In Python, in-line logical operations can be used.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get classification band")]),t._v("\nSCL "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we want to mask all other values, so NOT (4 OR 5)")]),t._v("\ncube_s2_mask "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("~")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("SCL "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("SCL "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# masking")]),t._v("\ncube_s2_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define filter function to create mask")]),t._v("\nfilter_function "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("eq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# vegetation is 4")]),t._v("\n non_vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("eq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# non-vegetation is 5")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we want to mask all other values, so NOT (4 OR 5)")]),t._v("\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("not"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("or"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" non_vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create mask by reducing bands with our defined formula")]),t._v("\ncube_s2_mask "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" filter_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# mask the NDVI data")]),t._v("\ncube_s2_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cube_s2_mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// filter classification layer")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("filter_function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("eq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// vegetation is 4")]),t._v("\n non_vegetation "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("eq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SCL"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// non-vegetation is 5")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we want to mask all other values, so NOT (4 OR 5)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("not")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("or")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" non_vegetation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create mask by reducing bands")]),t._v("\ncube_s2_mask "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" filter_function"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// mask")]),t._v("\ncube_s2_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mask")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cube_s2_mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v('As with all functionality there are differences between back-ends. If this first example "Mask Out Specific Values" doesn\'t work for you, that could be because we are trying to apply a mask (a cube with dimensions '),s("code",[t._v("x")]),t._v(", "),s("code",[t._v("y")]),t._v(", "),s("code",[t._v("t")]),t._v(") to the input data (a cube with dimensions "),s("code",[t._v("x")]),t._v(", "),s("code",[t._v("y")]),t._v(", "),s("code",[t._v("t")]),t._v(", "),s("code",[t._v("bands")]),t._v(") and thus, cubes with different dimensionality. If you encounter such a problem, try applying the first mask to the NDVI cube (with dimensions "),s("code",[t._v("x")]),t._v(", "),s("code",[t._v("y")]),t._v(", "),s("code",[t._v("t")]),t._v(') as it is shown in the second example "Thresholds".')]),t._v(" "),s("h4",{attrs:{id:"thresholds"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#thresholds"}},[t._v("#")]),t._v(" Thresholds")]),t._v(" "),s("p",[t._v("In this scenario we want an image that contains all NDVI values above 0.3, and holds no-data values otherwise. This could be useful to have a look at the vegetation in the area, without being distracted by all other NDVI values. For this example we reuse the NDVI cube "),s("code",[t._v("cube_s2_ndvi")]),t._v(" that was calculated in the "),s("a",{attrs:{href:"#example-1-ndvi"}},[t._v("NDVI bandmath-example")]),t._v(", thus for this to work you must include said code into your script.")]),t._v(" "),s("p",[t._v("If you look closely, you'll notice that this time we're not using "),s("code",[t._v("reduce_dimension")]),t._v(" to construct our masking cube (in contrast to "),s("a",{attrs:{href:"#mask-out-specific-values"}},[t._v("Mask out Specific Values")]),t._v("). In R and JavaScript we use "),s("code",[t._v("apply")]),t._v(" instead, and in the python client no "),s("code",[t._v(".band()")]),t._v(" is necessary anymore. This is because when we were masking using specific values of the band "),s("code",[t._v("SCL")]),t._v(", we were using the "),s("code",[t._v("cube_s2")]),t._v(" (with the bands "),s("code",[t._v("B02")]),t._v(", "),s("code",[t._v("B04")]),t._v(", "),s("code",[t._v("B08")]),t._v(" and "),s("code",[t._v("SCL")]),t._v(") as input. We then reduced the "),s("code",[t._v("bands")]),t._v(" dimension by writing and passing the function "),s("code",[t._v("filter_")]),t._v(", which returned a cube that had no "),s("code",[t._v("bands")]),t._v(" dimension anymore but "),s("code",[t._v("1")]),t._v("s and "),s("code",[t._v("0")]),t._v("s according to what we wanted to mask.")]),t._v(" "),s("p",[t._v("Here, we are making a mask out of the "),s("code",[t._v("cube_s2_ndvi")]),t._v(", a cube that had its "),s("code",[t._v("band")]),t._v(" dimension already reduced when the NDVI was calculated. To turn its values into "),s("code",[t._v("1")]),t._v("s and "),s("code",[t._v("0")]),t._v("s, we only need to "),s("code",[t._v("apply")]),t._v(" a threshold function. For this we utilize the openEO defined function "),s("code",[t._v("lt")]),t._v(' ("less than"). As usual the clients expose different ways of getting to that function, one of which is shown below.')]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create mask that is TRUE for NDVI < 0.3")]),t._v("\nndvi_threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_ndvi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply mask to NDVI")]),t._v("\ncube_s2_ndvi_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ndvi_threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("threshold_ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create mask that is TRUE for NDVI < 0.3")]),t._v("\n threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("lt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply the threshold to the NDVI cube")]),t._v("\nndvi_threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" process "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" threshold_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# mask the NDVI cube with the calculated mask")]),t._v("\ncube_s2_ndvi_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("mask"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ndvi_threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create mask that is TRUE for NDVI < 0.3 via an arrow function")]),t._v("\nndvi_threshold "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("lt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// apply mask to NDVI cube")]),t._v("\ncube_s2_ndvi_masked "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mask")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ndvi_threshold"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(319),alt:"The NDVI with a threshold of 0.3 applied"}}),t._v(" "),s("figcaption",[t._v("Applying the above described threshold to the NDVI yields this result. Water and artificial surfaces are mostly masked from the image.")])]),t._v(" "),s("h3",{attrs:{id:"pixel-operations-apply"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pixel-operations-apply"}},[t._v("#")]),t._v(" Pixel Operations: "),s("code",[t._v("apply")])]),t._v(" "),s("p",[t._v("As we remember from the "),s("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html#apply"}},[t._v("datacube guide")]),t._v(", unary processes take only the pixel itself into account when calculating new pixel values. We can implement that with the "),s("code",[t._v("apply")]),t._v(" function and a child process that is in charge of modifying the pixel values. In our first example, that will be the square root. The openEO function is called "),s("code",[t._v("sqrt")]),t._v(". In the following we'll see how to pass it to the "),s("code",[t._v("apply")]),t._v(" process.")],1),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# pass unary child process as string")]),t._v("\ncube_s2_sqrt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sqrt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# pass unary child process as a function, call "sqrt" from openEO processes "p"')]),t._v("\ncube_s2_sqrt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sqrt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// pass unary child process via arrow function")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_sqrt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sqrt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v("Let's say we're not looking at optical but SAR imagery. Depending on the collection held by the back-end, this data could already be log-scaled. In case it isn't, we may want to transform our data from intensity values to db. This formula is a bit more complicated: 10 * log"),s("sub",[t._v("10")]),t._v("(x). So we'll need a multiplication (by 10) and a "),s("code",[t._v("log")]),t._v(" process (to the "),s("code",[t._v("base")]),t._v(" 10).")]),t._v(" "),s("p",[t._v("Prior to applying the following code, we must load a collection containing SAR intensity data (e.g. Sentinel 1 GRD product).")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# import the defined openEO process")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" log\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# define a child process")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log_")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# supply that function to the "apply" call')]),t._v("\ncube_s1_log10 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("log_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# call multiply, log functions from "p"')]),t._v("\ncube_s1_log10 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("multiply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// use openEO "log", "multiply" via arrow function')]),t._v("\ncube_s1_log10 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("multiply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" child"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(320),alt:"The AOI image is split into two parts: The upper part depicts SAR data with some very bright and many very dark pixels, the lower part is more balanced."}}),t._v(" "),s("figcaption",[t._v("Here we see the effect of transforming intensity data to db: Both parts of the image are linearly scaled, but only the lower part has been log-transformed. It makes the interpretation much easier because image pixels take on less 'extreme' values.")])]),t._v(" "),s("h3",{attrs:{id:"image-kernels-apply-kernel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#image-kernels-apply-kernel"}},[t._v("#")]),t._v(" Image Kernels: "),s("code",[t._v("apply_kernel")])]),t._v(" "),s("p",[t._v("The process "),s("code",[t._v("apply_kernel")]),t._v(" takes an array of weights that is used as a moving window to calculate new pixel values. This is often used to smooth or sharped the image (e.g. Gaussian blur or highpass filter, respectively). Here, we show two Sobel edge detection kernels (both vertical and horizontal) and a highpass filter.")]),t._v(" "),s("p",[t._v("We'll only consider band 8 to shorten computation time.")]),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_bands"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("cube_s2_b8 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("p",[t._v("Throughout all clients we can define the kernel as an array of arrays, of which the inner arrays represent lines ("),s("code",[t._v("x")]),t._v(") and the outer arrays columns ("),s("code",[t._v("y")]),t._v("). This means that by adding a line break after each inner array, a true representation of the kernel can be created (see "),s("code",[t._v("highpass")]),t._v(" in Python or JavaScript tab).")]),t._v(" "),s("p",[t._v("The parameters "),s("code",[t._v("factor")]),t._v(" and "),s("code",[t._v("border")]),t._v(" are not needed here and are left out to fall back to default. "),s("code",[t._v("factor")]),t._v(" (default "),s("code",[t._v("1")]),t._v(") is multiplied with each pixel after the focal operation, while "),s("code",[t._v("border")]),t._v(" (default "),s("code",[t._v("0")]),t._v(") defines how overlaps between the kernel and the image borders are handled (should pixel values be mirrored, replicated or simply set to 0?, see "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply_kernel"}},[s("code",[t._v("apply_kernel")])]),t._v(").")],1),t._v(" "),s("CodeSwitcher",{scopedSlots:t._u([{key:"py",fn:function(){return[s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we can pass a kernel as an array of arrays")]),t._v("\nsobel_vertical "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# e.g. 3x3 edge detection")]),t._v("\nsobel_horizontal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nhighpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or 5x5 highpass filter")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply to cube")]),t._v("\ncube_s2_highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("apply_kernel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("highpass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"r",fn:function(){return[s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# we can pass a kernel as an array of arrays")]),t._v("\nsobel_vertical "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" byrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \nsobel_horizontal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# e.g. 3x3 edge detection")]),t._v("\n\nhighpass_vector "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nhighpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("highpass_vector"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or 5x5 highpass filter")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# apply to cube")]),t._v("\ncube_s2_b8_highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" p"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply_kernel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" kernel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" highpass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0},{key:"js",fn:function(){return[s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we can pass a kernel as an array of arrays")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" sobel_vertical "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// e.g. 3x3 edge detection")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" sobel_horizontal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or 5x5 highpass filter")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// apply to cube")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" cube_s2_highpass "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_kernel")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube_s2_b8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" highpass"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]},proxy:!0}])}),t._v(" "),s("figure",[s("img",{attrs:{src:a(321),alt:"A combined edge detection RGB. Sobel vertical and horizontal are displayed as red and green, a 5x5 highpass filter is displayed as blue."}}),t._v(" "),s("figcaption",[t._v("Above a combined edge detection RGB can be seen. Sobel 3x3 vertical and horizontal edge detections are displayed as red and green, and a 5x5 highpass filter is displayed as blue. For this, all kernels in the code block above were applied and the sucessive cubes were merged afterwards.")])]),t._v(" "),s("h2",{attrs:{id:"endnote"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#endnote"}},[t._v("#")]),t._v(" Endnote")]),t._v(" "),s("p",[t._v("You have "),s("strong",[t._v("feedback or")]),t._v(" noticed an "),s("strong",[t._v("error")]),t._v("? Feel free to open an issue in the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("github repository"),s("OutboundLink")],1),t._v(" or use the "),s("a",{attrs:{href:"https://openeo.org/contact.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("other communication channels"),s("OutboundLink")],1)])],1)}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/19.c5719ccd.js b/assets/js/19.6ea94681.js similarity index 99% rename from assets/js/19.c5719ccd.js rename to assets/js/19.6ea94681.js index 7fe8fed91..88d0af871 100644 --- a/assets/js/19.c5719ccd.js +++ b/assets/js/19.6ea94681.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19,52],{164:function(e,t,s){"use strict";s.r(t);var a={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((e,t)=>{var s=this.$site.themeConfig.versions[this.versionIndex],a=this.$site.themeConfig.versions[t];return e.regularPath=this.$page.regularPath.replace(s.path,a.path),e}).filter((e,t)=>t!==this.versionIndex&&this.$site.pages.findIndex(t=>t.regularPath==e.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:e}=this.$site;var t=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(t)&&"string"==typeof t[1])for(var s in e.versions)if(e.versions[s].folder===t[1])return parseInt(s);return 0}}},i=s(4),r=Object(i.a)(a,void 0,void 0,!1,null,null,null);t.default=r.exports},339:function(e,t){function s(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}s.keys=function(){return[]},s.resolve=s,e.exports=s,s.id=339},340:function(e,t,s){var a={"./0.4/developers/api/errors.json":341,"./1.0/developers/api/errors.json":342};function i(e){var t=r(e);return s(t)}function r(e){if(!s.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}i.keys=function(){return Object.keys(a)},i.resolve=r,e.exports=i,i.id=340},341:function(e){e.exports=JSON.parse('{"Internal":{"description":"An internal server error with a proprietary message.","message":"Server error: {message}","http":500,"tags":["General"]},"NotFound":{"description":"To be used if the requested resource does not exist. Note: Unsupported endpoints MUST send an \'FeatureUnsupported\' error. There are also specialized errors for missing jobs (JobNotFound), files (FileNotFound), etc.","message":"Resource not found.","http":404,"tags":["General"]},"FeatureUnsupported":{"description":"The back-end responds with this error whenever an endpoint is specified in the openEO API, but is not supported.","message":"Feature not supported.","http":501,"tags":["General"]},"InfrastructureMaintenance":{"description":"Service is currently not available, but the infrastructure is currently undergoing maintenance work.","message":"Service is not available at the moment due to maintenance work. Please try again later.","http":503,"tags":["General"]},"InfrastructureBusy":{"description":"Service is generally available, but the infrastructure can\'t handle it at the moment as too many requests are processed.","message":"Service is not available at the moment due to overloading. Please try again later.","http":503,"tags":["General"]},"Timeout":{"description":"The request took too long and timed out.","message":"Request timed out.","http":408,"tags":["General","Job Management"]},"CRSInvalid":{"description":"Invalid or unsupported CRS specified.","message":"CRS \'{crs}\' is invalid.","http":400,"tags":["Processes"]},"CoordinateOutOfBounds":{"description":null,"message":"Coordinate is out of bounds.","http":400,"tags":["Processes"]},"BudgetInvalid":{"description":"The budget is too low as it is either smaller than or equal to 0 or below the costs.","message":"The budget is too low.","http":400,"tags":["Job Management","Secondary Services Management"]},"NoDataForUpdate":{"description":"For PATCH requests: No valid data specified at all.","message":"No valid data specified to be updated.","http":400,"tags":["Job Management","Secondary Services Management","Process Graph Management"]},"PropertyNotEditable":{"description":"For PATCH requests: The specified parameter can\'t be updated. It is read-only.","message":"Property \'{property}\' is read-only.","http":400,"tags":["Job Management","Secondary Services Management","Process Graph Management"]},"WebSocketUpgradeNotRequested":{"description":"In order to subscribe the connection must be upgradable to WebSockets.","message":"Client sent invalid request to establish subscriptions.","http":400,"tags":["Subscriptions"]},"CollectionNotFound":{"description":"The requested collection does not exist.","message":"Collection does not exist.","http":404,"tags":["EO Data Discovery","Processes"]},"StorageFailure":{"description":"Server couldn\'t store file(s) due to server-side reasons.","message":"Unable to store file(s).","http":500,"tags":["File Management","Job Management"]},"StorageQuotaExceeded":{"description":"The storage quota has been exceeded by the user.","message":"Insufficient Storage.","http":400,"tags":["File Management","Job Management"]},"FileNotFound":{"description":"The requested file does not exist.","message":"File does not exist.","http":404,"tags":["File Management","Processes"]},"FilePathInvalid":{"description":"The specified path is invalid or not accessible. Path could contain invalid characters, an invalid user ID or point to an existing folder or a location outside of the user folder.","message":"File path is invalid.","http":400,"tags":["File Management"]},"FileOperationUnsupported":{"description":"The specified path is not a file and the operation is only supported for files. Path is likely a directory.","message":"Operation is only supported for files.","http":400,"tags":["File Management"]},"ContentTypeInvalid":{"description":"The specified media (MIME) type used in the Content-Type header is not allowed.","message":"The media type is not supported. Allowed: {types}","http":400,"tags":["File Management","General"]},"FileTypeInvalid":{"description":"File format, file extension or media (MIME) type is not allowed.","message":"File type not allowed. Allowed file types: {types}","http":400,"tags":["File Management"]},"FileSizeExceeded":{"description":"File exceeds allowed maximum file size.","message":"File size it too large. Maximum file size: {size}","http":400,"tags":["File Management"]},"FileContentInvalid":{"description":"The content of the file is invalid.","message":"File content is invalid.","http":400,"tags":["File Management","Processes"]},"FileLocked":{"description":"The file is locked by a running job or another process.","message":"File \'{file}\' is locked.","http":400,"tags":["File Management"]},"ProcessGraphNotFound":{"description":"The requested process graph does not exist.","message":"Process graph does not exist.","http":404,"tags":["Process Graph Management"]},"ProcessGraphMissing":{"description":null,"message":"No valid process graph specified.","http":400,"tags":["Process Graph Management","Job Management","Secondary Services Management"]},"VariableValueMissing":{"description":null,"message":"No value specified for process graph variable \'{variable_id}\'.","http":400,"tags":["Process Graph Management","Job Management","Secondary Services Management"]},"VariableDefaultValueTypeInvalid":{"description":null,"message":"The default value for the process graph variable \'{variable_id}\' is not of type \'{type}\'.","http":400,"tags":["Process Graph Management","Job Management"]},"VariableIdInvalid":{"description":null,"message":"A specified variable ID is not valid.","http":400,"tags":["Process Graph Management","Job Management"]},"VariableTypeInvalid":{"description":null,"message":"The data type for the process graph variable \'{variable_id}\' is invalid. Must be one of: string, boolean, number, array or object.","http":400,"tags":["Process Graph Management","Job Management"]},"ProcessUnsupported":{"description":null,"message":"Process \'{process}\' is not supported.","http":400,"tags":["Processes"]},"ProcessArgumentUnsupported":{"description":null,"message":"Process \'{process}\' does not support argument \'{argument}\'.","http":400,"tags":["Processes"]},"ProcessArgumentInvalid":{"description":null,"message":"The argument \'{argument}\' in process \'{process}\' is invalid: {reason}","http":400,"tags":["Processes"]},"ProcessArgumentRequired":{"description":null,"message":"Process \'{process}\' requires argument \'{argument}\'.","http":400,"tags":["Processes"]},"ProcessArgumentsMissing":{"description":null,"message":"Process \'{process}\' requires at least {min_parameters} parameters.","http":400,"tags":["Processes"]},"JobNotFound":{"description":"The requested job does not exist.","message":"The job does not exist.","http":404,"tags":["Job Management","Processes"]},"FormatUnsupported":{"description":null,"message":"Output format not supported.","http":400,"tags":["Job Management"]},"FormatArgumentUnsupported":{"description":null,"message":"Output format argument \'{argument}\' is not supported.","http":400,"tags":["Job Management"]},"FormatArgumentInvalid":{"description":null,"message":"The output format argument \'{argument}\' is invalid: {reason}","http":400,"tags":["Job Management"]},"FormatUnsuitable":{"description":null,"message":"Data can\'t be transformed into the requested output format.","http":400,"tags":["Job Management"]},"JobLocked":{"description":"The job is currently locked due to a running batch computation and can\'t be modified meanwhile.","message":"Job is locked due to a queued or running batch computation.","http":400,"tags":["Job Management"]},"JobNotFinished":{"description":null,"message":"Job has not finished computing the results yet. Please try again later.","http":400,"tags":["Job Management"]},"JobNotStarted":{"description":"Job has not been queued or started yet or was canceled and not restarted by the user.","message":"Job hasn\'t been started yet.","http":400,"tags":["Job Management"]},"PaymentRequired":{"description":"The budget required to fulfil the request are insufficient.","message":"Payment required.","http":402,"tags":["Job Management","Secondary Services Management"]},"BillingPlanInvalid":{"description":"The billing plan is not on the list of available plans.","message":"The billing plan is not valid.","http":400,"tags":["Job Management","Secondary Services Management"]},"AuthenticationRequired":{"description":"The client did not provide any authentication details for a resource requiring authentication or the provided authentication details are not correct.","message":"Unauthorized.","http":401,"tags":["Account Management"]},"AuthenticationSchemeInvalid":{"description":"Invalid authentication scheme (e.g. Bearer).","message":"Authentication method not supported.","http":403,"tags":["Account Management"]},"TokenInvalid":{"description":"Authorization token invalid or expired.","message":"Session has expired.","http":403,"tags":["Account Management"]},"CredentialsInvalid":{"description":null,"message":"Credentials are not correct.","http":403,"tags":["Account Management"]},"ServiceNotFound":{"description":"The requested secondary service does not exist.","message":"Service does not exist.","http":404,"tags":["Secondary Services Management"]},"ServiceUnsupported":{"description":null,"message":"Secondary service type is not supported.","http":400,"tags":["Secondary Services Management"]},"ServiceArgumentUnsupported":{"description":null,"message":"Secondary service argument \'{argument}\' is not supported.","http":400,"tags":["Secondary Services Management"]},"ServiceArgumentInvalid":{"description":null,"message":"The secondary service argument \'{argument}\' is invalid: {reason}","http":400,"tags":["Secondary Services Management"]},"ServiceArgumentRequired":{"description":null,"message":"Required secondary service argument \'{argument}\' is missing.","http":400,"tags":["Secondary Services Management"]}}')},342:function(e){e.exports=JSON.parse('{"Internal":{"description":"An internal server error with a proprietary message.","message":"Server error: {message}","http":500,"tags":["General"]},"NotFound":{"description":"To be used if the requested resource does not exist. Note: There are specialized errors for missing jobs (JobNotFound), files (FileNotFound), etc. Unsupported endpoints MAY send an \'FeatureUnsupported\' (501) error.","message":"Resource not found.","http":404,"tags":["General"]},"FeatureUnsupported":{"description":"The back-end responds with this error whenever an endpoint is specified in the openEO API, but is not supported.","message":"Feature not supported.","http":501,"tags":["General"]},"InfrastructureMaintenance":{"description":"Service is currently not available as the infrastructure is currently undergoing maintenance work.","message":"Service is not available at the moment due to maintenance work. Please try again later or contact our support.","http":503,"tags":["General"]},"InfrastructureBusy":{"description":"Service is generally available, but the infrastructure can\'t handle it at the moment as too many requests are processed.","message":"Service is not available at the moment due to overloading. Please try again later or contact our support.","http":503,"tags":["General"]},"UnsupportedApiVersion":{"description":"The service doesn\'t support the openEO API version specified in the request URL. Clients should check well-known document for supported versions.","message":"The requested API version \'{version}\' is not supported.","http":404,"tags":["General"]},"RequestTimeout":{"description":"The request took too long and timed out.","message":"Request timed out.","http":408,"tags":["General","Data Processing"]},"BudgetInvalid":{"description":"The budget is too low as it is either smaller than or equal to 0 or below the costs.","message":"The specified budget is too low.","http":400,"tags":["Batch Jobs","Secondary Services","Data Processing"]},"EstimateComplexity":{"description":"The process is too complex to calculate an estimate, e.g. due to a UDF or other processes that are complex to estimate costs reliably.","message":"The process is too complex to calculate an estimate.","http":500,"tags":["Batch Jobs"]},"NoDataForUpdate":{"description":"For PATCH requests: No valid data specified at all.","message":"No data specified to be updated.","http":400,"tags":["Batch Jobs","Secondary Services"]},"PropertyNotEditable":{"description":"For PATCH requests: The specified parameter can\'t be updated. It is read-only.","message":"The specified property \'{property}\' is read-only.","http":400,"tags":["Batch Jobs","Secondary Services"]},"CollectionNotFound":{"description":"The requested collection does not exist.","message":"Collection \'{identifier}\' does not exist.","http":404,"tags":["EO Data Discovery"]},"StorageFailure":{"description":"Server couldn\'t store file(s) due to server-side reasons.","message":"Unable to store files due to a server error. Please try again later or contact our support.","http":500,"tags":["File Management","Batch Jobs"]},"StorageQuotaExceeded":{"description":"The storage quota has been exceeded by the user.","message":"Your storage quota has been exceeded.","http":400,"tags":["File Management","Batch Jobs"]},"FileNotFound":{"description":"The requested file does not exist.","message":"File \'{file}\' does not exist.","http":404,"tags":["File Management"]},"FilePathInvalid":{"description":"The specified path is invalid or not accessible. Path could contain invalid characters, point to an existing folder or a location outside of the user folder.","message":"File path is invalid: {reason}","http":400,"tags":["File Management"]},"FileOperationUnsupported":{"description":null,"message":"The file operation is not supported for the specified path.","http":400,"tags":["File Management"]},"FolderOperationUnsupported":{"description":"The specified path is a folder and the operation is only supported for files.","message":"Operation is only supported for files, not folders.","http":400,"tags":["File Management"]},"ContentTypeInvalid":{"description":"The specified media (MIME) type used in the Content-Type header is not allowed.","message":"The media type is not supported. Allowed: {types}","http":400,"tags":["File Management","General"]},"FileTypeInvalid":{"description":"File format or file extension is not allowed.","message":"File format {type} not allowed. Allowed file formats: {types}","http":400,"tags":["File Management"]},"FileSizeExceeded":{"description":"File exceeds allowed maximum file size.","message":"File size it too large. Maximum file size: {size}","http":400,"tags":["File Management"]},"FileContentInvalid":{"description":"The content of the file is invalid.","message":"File content is invalid.","http":400,"tags":["File Management"]},"FileLocked":{"description":"The file is locked by a running job or another process.","message":"File \'{file}\' is locked by another process.","http":400,"tags":["File Management"]},"ProcessGraphNotFound":{"description":"The requested user-defined process does not exist. To be used for all endpoints starting with `/process_graphs`.","message":"User-defined process \'{identifier}\' does not exist.","http":404,"tags":["User-Defined Processes"]},"ProcessInvalid":{"description":"The process given is invalid, which ususlly means that the process metadata is invalid.","message":"Invalid process specified.","http":400,"tags":["User-Defined Processes","Batch Jobs","Secondary Services","Data Processing"]},"ProcessGraphMissing":{"description":"The process doesn\'t contain a process graph. For jobs, services, and sync. processing the parameter `process` must contain a `process_graph`.","message":"Invalid process specified. It doesn\'t contain a process graph.","http":400,"tags":["User-Defined Processes","Batch Jobs","Secondary Services","Data Processing"]},"ProcessGraphInvalid":{"description":"The process doesn\'t contain a valid process graph, which means it doesn\'t comply to the general structure / schema.","message":"Invalid process graph specified.","http":400,"tags":["User-Defined Processes","Batch Jobs","Secondary Services","Data Processing"]},"PredefinedProcessExists":{"description":"If a user wants to store a user-defined process with the id of a predefined process.","message":"A predefined process with the given identifier exists.","http":400,"tags":["User-Defined Processes"]},"ProcessGraphComplexity":{"description":"The process graph is too complex for synchronous processing and will likely time out. Please use a batch job instead.","message":"The process is too complex for for synchronous processing. Please use a batch job instead.","http":400,"tags":["Data Processing"]},"ProcessUnsupported":{"description":"A process (predefined or user-defined) with the specified identifier is not available. To be used when validating or executing process graphs.","message":"Process with identifier \'{process}\' is not available in namespace \'{namespace}\'.","http":400,"tags":["Data Processing"]},"ProcessParameterUnsupported":{"description":null,"message":"Process \'{process}\' does not support parameter \'{parameter}\'.","http":400,"tags":["Data Processing"]},"ProcessParameterInvalid":{"description":null,"message":"The value passed for parameter \'{parameter}\' in process \'{process}\' is invalid: {reason}","http":400,"tags":["Data Processing"]},"ProcessParameterRequired":{"description":null,"message":"Process \'{process}\' parameter \'{parameter}\' is required.","http":400,"tags":["Data Processing"]},"JobNotFound":{"description":"The requested job does not exist.","message":"The batch job \'{identifier}\' does not exist.","http":404,"tags":["Batch Jobs"]},"JobLocked":{"description":"The job is currently locked due to a running batch computation and can\'t be modified meanwhile.","message":"Batch job is locked due to a queued or running batch computation.","http":400,"tags":["Batch Jobs"]},"JobNotFinished":{"description":null,"message":"Batch job has not finished computing the results yet. Please try again later or contact our support.","http":400,"tags":["Batch Jobs"]},"JobNotStarted":{"description":"Job has not been queued or started yet or was canceled and not restarted by the user.","message":"Batch job must be started first.","http":400,"tags":["Batch Jobs"]},"ResultLinkExpired":{"description":"The signed URLs for batch job results have expired. Please send a request to `GET /jobs/{job_id}/results` to refresh the links.","message":"The link to the batch job result has expired. Please request the results again.","http":410,"tags":["Batch Jobs"]},"PaymentRequired":{"description":"The budget required to fulfil the request is insufficient.","message":"The budget required to fulfil the request is not sufficient. A payment is required first.","http":402,"tags":["Batch Jobs","Secondary Services"]},"BillingPlanInvalid":{"description":"The billing plan is not on the list of available plans.","message":"The billing plan is invalid.","http":400,"tags":["Batch Jobs","Secondary Services","Data Processing"]},"BillingPlanMissing":{"description":"No billing plan has been specified by the user and the billing plan can\'t be determined unambiguously.","message":"A billing plan must be specified.","http":400,"tags":["Batch Jobs","Secondary Services","Data Processing"]},"AuthenticationRequired":{"description":"The client did not provide any authentication details for a resource requiring authentication or the provided authentication details are not correct.","message":"Unauthorized.","http":401,"tags":["Account Management"]},"AuthenticationSchemeInvalid":{"description":"Invalid authentication scheme (e.g. Bearer).","message":"Authentication method not supported.","http":403,"tags":["Account Management"]},"TokenInvalid":{"description":null,"message":"Authorization token has expired or is invalid. Please authenticate again.","http":403,"tags":["Account Management"]},"CredentialsInvalid":{"description":null,"message":"Credentials are not correct.","http":403,"tags":["Account Management"]},"PermissionsInsufficient":{"description":"Forbidden. The client did provided correct authentication details, but the privileges/permissions of the provided credentials do not allow to request the resource.","message":"Forbidden. The permissions of the authenticated account do not allow to request the requested resource.","http":403,"tags":["Account Management"]},"ServiceNotFound":{"description":"The requested secondary service does not exist.","message":"Service \'{identifier}\' does not exist.","http":404,"tags":["Secondary Services"]},"ServiceUnsupported":{"description":null,"message":"Service type \'{type}\' is not supported.","http":400,"tags":["Secondary Services"]},"ServiceConfigUnsupported":{"description":"Refers to the secondary service `configuration` object.","message":"Service parameter \'{parameter}\' is not supported.","http":400,"tags":["Secondary Services"]},"ServiceConfigInvalid":{"description":"Refers to the secondary service `configuration` object.","message":"The value passed for the service parameter \'{parameter}\' is invalid: {reason}","http":400,"tags":["Secondary Services"]},"ServiceConfigRequired":{"description":"Refers to the secondary service `configuration` object.","message":"Service parameter \'{parameter}\' is required.","http":400,"tags":["Secondary Services"]}}')},479:function(e,t,s){"use strict";s.r(t);var a={name:"ErrorCodes",mixins:[s(164).default],props:["file"],data:()=>({errors:{},tags:[]}),filters:{slugify:e=>e.toLowerCase().replace(" ","_")},created(){var e;try{e=s(339)("./"+this.version.folder+"/developers/api/errors.json")}catch(t){e=s(340)("./"+this.version.folder+"/developers/api/errors.json")}for(var t in e){var a=e[t];for(var i in a.description||(a.description=""),a.message||console.log("No message specified for error: "+t),a.http||console.log("No HTTP status code specified for error: "+t),a.tags&&Array.isArray(a.tags)&&0!==a.tags.length||console.warn("No tags specified for error: "+t),a.tags){var r=a.tags[i];void 0===this.errors[r]&&(this.errors[r]={}),this.errors[r][t]=a}}this.tags=Object.keys(this.errors),this.tags.sort()}},i=s(4),r=Object(i.a)(a,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"error-codes"},[t("p",[e._v("The whole table of error codes is available as "),t("a",{attrs:{href:"/documentation/"+e.version.folder+"/developers/api/errors.json",target:"_blank"}},[e._v("JSON file")]),e._v(", which can be used by implementors to automatically generate error responses.")]),e._v(" "),e._l(e.tags,(function(s){return t("div",[t("a",{attrs:{name:e._f("slugify")(s)}}),e._v(" "),t("h2",[e._v(e._s(s))]),e._v(" "),t("table",[e._m(0,!0),e._v(" "),e._l(e.errors[s],(function(s,a){return t("tr",[t("td",[e._v(e._s(a))]),e._v(" "),t("td",[e._v(e._s(s.description))]),e._v(" "),t("td",[e._v(e._s(s.message))]),e._v(" "),t("td",[e._v(e._s(s.http))])])}))],2)])}))],2)}),[function(){var e=this._self._c;return e("tr",[e("th",{attrs:{width:"20%"}},[this._v("openEO Error Code")]),this._v(" "),e("th",{attrs:{width:"40%"}},[this._v("Description")]),this._v(" "),e("th",{attrs:{width:"35%"}},[this._v("Example Message")]),this._v(" "),e("th",{attrs:{width:"5%"}},[this._v("HTTP Status Code")])])}],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19,52],{164:function(e,t,s){"use strict";s.r(t);var a={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((e,t)=>{var s=this.$site.themeConfig.versions[this.versionIndex],a=this.$site.themeConfig.versions[t];return e.regularPath=this.$page.regularPath.replace(s.path,a.path),e}).filter((e,t)=>t!==this.versionIndex&&this.$site.pages.findIndex(t=>t.regularPath==e.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:e}=this.$site;var t=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(t)&&"string"==typeof t[1])for(var s in e.versions)if(e.versions[s].folder===t[1])return parseInt(s);return 0}}},i=s(4),r=Object(i.a)(a,void 0,void 0,!1,null,null,null);t.default=r.exports},339:function(e,t){function s(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}s.keys=function(){return[]},s.resolve=s,e.exports=s,s.id=339},340:function(e,t,s){var a={"./0.4/developers/api/errors.json":341,"./1.0/developers/api/errors.json":342};function i(e){var t=r(e);return s(t)}function r(e){if(!s.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}i.keys=function(){return Object.keys(a)},i.resolve=r,e.exports=i,i.id=340},341:function(e){e.exports=JSON.parse('{"Internal":{"description":"An internal server error with a proprietary message.","message":"Server error: {message}","http":500,"tags":["General"]},"NotFound":{"description":"To be used if the requested resource does not exist. Note: Unsupported endpoints MUST send an \'FeatureUnsupported\' error. There are also specialized errors for missing jobs (JobNotFound), files (FileNotFound), etc.","message":"Resource not found.","http":404,"tags":["General"]},"FeatureUnsupported":{"description":"The back-end responds with this error whenever an endpoint is specified in the openEO API, but is not supported.","message":"Feature not supported.","http":501,"tags":["General"]},"InfrastructureMaintenance":{"description":"Service is currently not available, but the infrastructure is currently undergoing maintenance work.","message":"Service is not available at the moment due to maintenance work. Please try again later.","http":503,"tags":["General"]},"InfrastructureBusy":{"description":"Service is generally available, but the infrastructure can\'t handle it at the moment as too many requests are processed.","message":"Service is not available at the moment due to overloading. Please try again later.","http":503,"tags":["General"]},"Timeout":{"description":"The request took too long and timed out.","message":"Request timed out.","http":408,"tags":["General","Job Management"]},"CRSInvalid":{"description":"Invalid or unsupported CRS specified.","message":"CRS \'{crs}\' is invalid.","http":400,"tags":["Processes"]},"CoordinateOutOfBounds":{"description":null,"message":"Coordinate is out of bounds.","http":400,"tags":["Processes"]},"BudgetInvalid":{"description":"The budget is too low as it is either smaller than or equal to 0 or below the costs.","message":"The budget is too low.","http":400,"tags":["Job Management","Secondary Services Management"]},"NoDataForUpdate":{"description":"For PATCH requests: No valid data specified at all.","message":"No valid data specified to be updated.","http":400,"tags":["Job Management","Secondary Services Management","Process Graph Management"]},"PropertyNotEditable":{"description":"For PATCH requests: The specified parameter can\'t be updated. It is read-only.","message":"Property \'{property}\' is read-only.","http":400,"tags":["Job Management","Secondary Services Management","Process Graph Management"]},"WebSocketUpgradeNotRequested":{"description":"In order to subscribe the connection must be upgradable to WebSockets.","message":"Client sent invalid request to establish subscriptions.","http":400,"tags":["Subscriptions"]},"CollectionNotFound":{"description":"The requested collection does not exist.","message":"Collection does not exist.","http":404,"tags":["EO Data Discovery","Processes"]},"StorageFailure":{"description":"Server couldn\'t store file(s) due to server-side reasons.","message":"Unable to store file(s).","http":500,"tags":["File Management","Job Management"]},"StorageQuotaExceeded":{"description":"The storage quota has been exceeded by the user.","message":"Insufficient Storage.","http":400,"tags":["File Management","Job Management"]},"FileNotFound":{"description":"The requested file does not exist.","message":"File does not exist.","http":404,"tags":["File Management","Processes"]},"FilePathInvalid":{"description":"The specified path is invalid or not accessible. Path could contain invalid characters, an invalid user ID or point to an existing folder or a location outside of the user folder.","message":"File path is invalid.","http":400,"tags":["File Management"]},"FileOperationUnsupported":{"description":"The specified path is not a file and the operation is only supported for files. Path is likely a directory.","message":"Operation is only supported for files.","http":400,"tags":["File Management"]},"ContentTypeInvalid":{"description":"The specified media (MIME) type used in the Content-Type header is not allowed.","message":"The media type is not supported. Allowed: {types}","http":400,"tags":["File Management","General"]},"FileTypeInvalid":{"description":"File format, file extension or media (MIME) type is not allowed.","message":"File type not allowed. Allowed file types: {types}","http":400,"tags":["File Management"]},"FileSizeExceeded":{"description":"File exceeds allowed maximum file size.","message":"File size it too large. Maximum file size: {size}","http":400,"tags":["File Management"]},"FileContentInvalid":{"description":"The content of the file is invalid.","message":"File content is invalid.","http":400,"tags":["File Management","Processes"]},"FileLocked":{"description":"The file is locked by a running job or another process.","message":"File \'{file}\' is locked.","http":400,"tags":["File Management"]},"ProcessGraphNotFound":{"description":"The requested process graph does not exist.","message":"Process graph does not exist.","http":404,"tags":["Process Graph Management"]},"ProcessGraphMissing":{"description":null,"message":"No valid process graph specified.","http":400,"tags":["Process Graph Management","Job Management","Secondary Services Management"]},"VariableValueMissing":{"description":null,"message":"No value specified for process graph variable \'{variable_id}\'.","http":400,"tags":["Process Graph Management","Job Management","Secondary Services Management"]},"VariableDefaultValueTypeInvalid":{"description":null,"message":"The default value for the process graph variable \'{variable_id}\' is not of type \'{type}\'.","http":400,"tags":["Process Graph Management","Job Management"]},"VariableIdInvalid":{"description":null,"message":"A specified variable ID is not valid.","http":400,"tags":["Process Graph Management","Job Management"]},"VariableTypeInvalid":{"description":null,"message":"The data type for the process graph variable \'{variable_id}\' is invalid. Must be one of: string, boolean, number, array or object.","http":400,"tags":["Process Graph Management","Job Management"]},"ProcessUnsupported":{"description":null,"message":"Process \'{process}\' is not supported.","http":400,"tags":["Processes"]},"ProcessArgumentUnsupported":{"description":null,"message":"Process \'{process}\' does not support argument \'{argument}\'.","http":400,"tags":["Processes"]},"ProcessArgumentInvalid":{"description":null,"message":"The argument \'{argument}\' in process \'{process}\' is invalid: {reason}","http":400,"tags":["Processes"]},"ProcessArgumentRequired":{"description":null,"message":"Process \'{process}\' requires argument \'{argument}\'.","http":400,"tags":["Processes"]},"ProcessArgumentsMissing":{"description":null,"message":"Process \'{process}\' requires at least {min_parameters} parameters.","http":400,"tags":["Processes"]},"JobNotFound":{"description":"The requested job does not exist.","message":"The job does not exist.","http":404,"tags":["Job Management","Processes"]},"FormatUnsupported":{"description":null,"message":"Output format not supported.","http":400,"tags":["Job Management"]},"FormatArgumentUnsupported":{"description":null,"message":"Output format argument \'{argument}\' is not supported.","http":400,"tags":["Job Management"]},"FormatArgumentInvalid":{"description":null,"message":"The output format argument \'{argument}\' is invalid: {reason}","http":400,"tags":["Job Management"]},"FormatUnsuitable":{"description":null,"message":"Data can\'t be transformed into the requested output format.","http":400,"tags":["Job Management"]},"JobLocked":{"description":"The job is currently locked due to a running batch computation and can\'t be modified meanwhile.","message":"Job is locked due to a queued or running batch computation.","http":400,"tags":["Job Management"]},"JobNotFinished":{"description":null,"message":"Job has not finished computing the results yet. Please try again later.","http":400,"tags":["Job Management"]},"JobNotStarted":{"description":"Job has not been queued or started yet or was canceled and not restarted by the user.","message":"Job hasn\'t been started yet.","http":400,"tags":["Job Management"]},"PaymentRequired":{"description":"The budget required to fulfil the request are insufficient.","message":"Payment required.","http":402,"tags":["Job Management","Secondary Services Management"]},"BillingPlanInvalid":{"description":"The billing plan is not on the list of available plans.","message":"The billing plan is not valid.","http":400,"tags":["Job Management","Secondary Services Management"]},"AuthenticationRequired":{"description":"The client did not provide any authentication details for a resource requiring authentication or the provided authentication details are not correct.","message":"Unauthorized.","http":401,"tags":["Account Management"]},"AuthenticationSchemeInvalid":{"description":"Invalid authentication scheme (e.g. Bearer).","message":"Authentication method not supported.","http":403,"tags":["Account Management"]},"TokenInvalid":{"description":"Authorization token invalid or expired.","message":"Session has expired.","http":403,"tags":["Account Management"]},"CredentialsInvalid":{"description":null,"message":"Credentials are not correct.","http":403,"tags":["Account Management"]},"ServiceNotFound":{"description":"The requested secondary service does not exist.","message":"Service does not exist.","http":404,"tags":["Secondary Services Management"]},"ServiceUnsupported":{"description":null,"message":"Secondary service type is not supported.","http":400,"tags":["Secondary Services Management"]},"ServiceArgumentUnsupported":{"description":null,"message":"Secondary service argument \'{argument}\' is not supported.","http":400,"tags":["Secondary Services Management"]},"ServiceArgumentInvalid":{"description":null,"message":"The secondary service argument \'{argument}\' is invalid: {reason}","http":400,"tags":["Secondary Services Management"]},"ServiceArgumentRequired":{"description":null,"message":"Required secondary service argument \'{argument}\' is missing.","http":400,"tags":["Secondary Services Management"]}}')},342:function(e){e.exports=JSON.parse('{"Internal":{"description":"An internal server error with a proprietary message.","message":"Server error: {message}","http":500,"tags":["General"]},"NotFound":{"description":"To be used if the requested resource does not exist. Note: There are specialized errors for missing jobs (JobNotFound), files (FileNotFound), etc. Unsupported endpoints MAY send an \'FeatureUnsupported\' (501) error.","message":"Resource not found.","http":404,"tags":["General"]},"FeatureUnsupported":{"description":"The back-end responds with this error whenever an endpoint is specified in the openEO API, but is not supported.","message":"Feature not supported.","http":501,"tags":["General"]},"InfrastructureMaintenance":{"description":"Service is currently not available as the infrastructure is currently undergoing maintenance work.","message":"Service is not available at the moment due to maintenance work. Please try again later or contact our support.","http":503,"tags":["General"]},"InfrastructureBusy":{"description":"Service is generally available, but the infrastructure can\'t handle it at the moment as too many requests are processed.","message":"Service is not available at the moment due to overloading. Please try again later or contact our support.","http":503,"tags":["General"]},"UnsupportedApiVersion":{"description":"The service doesn\'t support the openEO API version specified in the request URL. Clients should check well-known document for supported versions.","message":"The requested API version \'{version}\' is not supported.","http":404,"tags":["General"]},"RequestTimeout":{"description":"The request took too long and timed out.","message":"Request timed out.","http":408,"tags":["General","Data Processing"]},"BudgetInvalid":{"description":"The budget is too low as it is either smaller than or equal to 0 or below the costs.","message":"The specified budget is too low.","http":400,"tags":["Batch Jobs","Secondary Services","Data Processing"]},"EstimateComplexity":{"description":"The process is too complex to calculate an estimate, e.g. due to a UDF or other processes that are complex to estimate costs reliably.","message":"The process is too complex to calculate an estimate.","http":500,"tags":["Batch Jobs"]},"NoDataForUpdate":{"description":"For PATCH requests: No valid data specified at all.","message":"No data specified to be updated.","http":400,"tags":["Batch Jobs","Secondary Services"]},"PropertyNotEditable":{"description":"For PATCH requests: The specified parameter can\'t be updated. It is read-only.","message":"The specified property \'{property}\' is read-only.","http":400,"tags":["Batch Jobs","Secondary Services"]},"CollectionNotFound":{"description":"The requested collection does not exist.","message":"Collection \'{identifier}\' does not exist.","http":404,"tags":["EO Data Discovery"]},"StorageFailure":{"description":"Server couldn\'t store file(s) due to server-side reasons.","message":"Unable to store files due to a server error. Please try again later or contact our support.","http":500,"tags":["File Management","Batch Jobs"]},"StorageQuotaExceeded":{"description":"The storage quota has been exceeded by the user.","message":"Your storage quota has been exceeded.","http":400,"tags":["File Management","Batch Jobs"]},"FileNotFound":{"description":"The requested file does not exist.","message":"File \'{file}\' does not exist.","http":404,"tags":["File Management"]},"FilePathInvalid":{"description":"The specified path is invalid or not accessible. Path could contain invalid characters, point to an existing folder or a location outside of the user folder.","message":"File path is invalid: {reason}","http":400,"tags":["File Management"]},"FileOperationUnsupported":{"description":null,"message":"The file operation is not supported for the specified path.","http":400,"tags":["File Management"]},"FolderOperationUnsupported":{"description":"The specified path is a folder and the operation is only supported for files.","message":"Operation is only supported for files, not folders.","http":400,"tags":["File Management"]},"ContentTypeInvalid":{"description":"The specified media (MIME) type used in the Content-Type header is not allowed.","message":"The media type is not supported. Allowed: {types}","http":400,"tags":["File Management","General"]},"FileTypeInvalid":{"description":"File format or file extension is not allowed.","message":"File format {type} not allowed. Allowed file formats: {types}","http":400,"tags":["File Management"]},"FileSizeExceeded":{"description":"File exceeds allowed maximum file size.","message":"File size it too large. Maximum file size: {size}","http":400,"tags":["File Management"]},"FileContentInvalid":{"description":"The content of the file is invalid.","message":"File content is invalid.","http":400,"tags":["File Management"]},"FileLocked":{"description":"The file is locked by a running job or another process.","message":"File \'{file}\' is locked by another process.","http":400,"tags":["File Management"]},"ProcessGraphNotFound":{"description":"The requested user-defined process does not exist. To be used for all endpoints starting with `/process_graphs`.","message":"User-defined process \'{identifier}\' does not exist.","http":404,"tags":["User-Defined Processes"]},"ProcessInvalid":{"description":"The process given is invalid, which ususlly means that the process metadata is invalid.","message":"Invalid process specified.","http":400,"tags":["User-Defined Processes","Batch Jobs","Secondary Services","Data Processing"]},"ProcessGraphMissing":{"description":"The process doesn\'t contain a process graph. For jobs, services, and sync. processing the parameter `process` must contain a `process_graph`.","message":"Invalid process specified. It doesn\'t contain a process graph.","http":400,"tags":["User-Defined Processes","Batch Jobs","Secondary Services","Data Processing"]},"ProcessGraphInvalid":{"description":"The process doesn\'t contain a valid process graph, which means it doesn\'t comply to the general structure / schema.","message":"Invalid process graph specified.","http":400,"tags":["User-Defined Processes","Batch Jobs","Secondary Services","Data Processing"]},"PredefinedProcessExists":{"description":"If a user wants to store a user-defined process with the id of a predefined process.","message":"A predefined process with the given identifier exists.","http":400,"tags":["User-Defined Processes"]},"ProcessGraphComplexity":{"description":"The process graph is too complex for synchronous processing and will likely time out. Please use a batch job instead.","message":"The process is too complex for for synchronous processing. Please use a batch job instead.","http":400,"tags":["Data Processing"]},"ProcessUnsupported":{"description":"A process (predefined or user-defined) with the specified identifier is not available. To be used when validating or executing process graphs.","message":"Process with identifier \'{process}\' is not available in namespace \'{namespace}\'.","http":400,"tags":["Data Processing"]},"ProcessParameterUnsupported":{"description":null,"message":"Process \'{process}\' does not support parameter \'{parameter}\'.","http":400,"tags":["Data Processing"]},"ProcessParameterInvalid":{"description":null,"message":"The value passed for parameter \'{parameter}\' in process \'{process}\' is invalid: {reason}","http":400,"tags":["Data Processing"]},"ProcessParameterRequired":{"description":null,"message":"Process \'{process}\' parameter \'{parameter}\' is required.","http":400,"tags":["Data Processing"]},"JobNotFound":{"description":"The requested job does not exist.","message":"The batch job \'{identifier}\' does not exist.","http":404,"tags":["Batch Jobs"]},"JobLocked":{"description":"The job is currently locked due to a running batch computation and can\'t be modified meanwhile.","message":"Batch job is locked due to a queued or running batch computation.","http":400,"tags":["Batch Jobs"]},"JobNotFinished":{"description":null,"message":"Batch job has not finished computing the results yet. Please try again later or contact our support.","http":400,"tags":["Batch Jobs"]},"JobNotStarted":{"description":"Job has not been queued or started yet or was canceled and not restarted by the user.","message":"Batch job must be started first.","http":400,"tags":["Batch Jobs"]},"ResultLinkExpired":{"description":"The signed URLs for batch job results have expired. Please send a request to `GET /jobs/{job_id}/results` to refresh the links.","message":"The link to the batch job result has expired. Please request the results again.","http":410,"tags":["Batch Jobs"]},"PaymentRequired":{"description":"The budget required to fulfil the request is insufficient.","message":"The budget required to fulfil the request is not sufficient. A payment is required first.","http":402,"tags":["Batch Jobs","Secondary Services"]},"BillingPlanInvalid":{"description":"The billing plan is not on the list of available plans.","message":"The billing plan is invalid.","http":400,"tags":["Batch Jobs","Secondary Services","Data Processing"]},"BillingPlanMissing":{"description":"No billing plan has been specified by the user and the billing plan can\'t be determined unambiguously.","message":"A billing plan must be specified.","http":400,"tags":["Batch Jobs","Secondary Services","Data Processing"]},"AuthenticationRequired":{"description":"The client did not provide any authentication details for a resource requiring authentication or the provided authentication details are not correct.","message":"Unauthorized.","http":401,"tags":["Account Management"]},"AuthenticationSchemeInvalid":{"description":"Invalid authentication scheme (e.g. Bearer).","message":"Authentication method not supported.","http":403,"tags":["Account Management"]},"TokenInvalid":{"description":null,"message":"Authorization token has expired or is invalid. Please authenticate again.","http":403,"tags":["Account Management"]},"CredentialsInvalid":{"description":null,"message":"Credentials are not correct.","http":403,"tags":["Account Management"]},"PermissionsInsufficient":{"description":"Forbidden. The client did provided correct authentication details, but the privileges/permissions of the provided credentials do not allow to request the resource.","message":"Forbidden. The permissions of the authenticated account do not allow to request the requested resource.","http":403,"tags":["Account Management"]},"ServiceNotFound":{"description":"The requested secondary service does not exist.","message":"Service \'{identifier}\' does not exist.","http":404,"tags":["Secondary Services"]},"ServiceUnsupported":{"description":null,"message":"Service type \'{type}\' is not supported.","http":400,"tags":["Secondary Services"]},"ServiceConfigUnsupported":{"description":"Refers to the secondary service `configuration` object.","message":"Service parameter \'{parameter}\' is not supported.","http":400,"tags":["Secondary Services"]},"ServiceConfigInvalid":{"description":"Refers to the secondary service `configuration` object.","message":"The value passed for the service parameter \'{parameter}\' is invalid: {reason}","http":400,"tags":["Secondary Services"]},"ServiceConfigRequired":{"description":"Refers to the secondary service `configuration` object.","message":"Service parameter \'{parameter}\' is required.","http":400,"tags":["Secondary Services"]}}')},480:function(e,t,s){"use strict";s.r(t);var a={name:"ErrorCodes",mixins:[s(164).default],props:["file"],data:()=>({errors:{},tags:[]}),filters:{slugify:e=>e.toLowerCase().replace(" ","_")},created(){var e;try{e=s(339)("./"+this.version.folder+"/developers/api/errors.json")}catch(t){e=s(340)("./"+this.version.folder+"/developers/api/errors.json")}for(var t in e){var a=e[t];for(var i in a.description||(a.description=""),a.message||console.log("No message specified for error: "+t),a.http||console.log("No HTTP status code specified for error: "+t),a.tags&&Array.isArray(a.tags)&&0!==a.tags.length||console.warn("No tags specified for error: "+t),a.tags){var r=a.tags[i];void 0===this.errors[r]&&(this.errors[r]={}),this.errors[r][t]=a}}this.tags=Object.keys(this.errors),this.tags.sort()}},i=s(4),r=Object(i.a)(a,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"error-codes"},[t("p",[e._v("The whole table of error codes is available as "),t("a",{attrs:{href:"/documentation/"+e.version.folder+"/developers/api/errors.json",target:"_blank"}},[e._v("JSON file")]),e._v(", which can be used by implementors to automatically generate error responses.")]),e._v(" "),e._l(e.tags,(function(s){return t("div",[t("a",{attrs:{name:e._f("slugify")(s)}}),e._v(" "),t("h2",[e._v(e._s(s))]),e._v(" "),t("table",[e._m(0,!0),e._v(" "),e._l(e.errors[s],(function(s,a){return t("tr",[t("td",[e._v(e._s(a))]),e._v(" "),t("td",[e._v(e._s(s.description))]),e._v(" "),t("td",[e._v(e._s(s.message))]),e._v(" "),t("td",[e._v(e._s(s.http))])])}))],2)])}))],2)}),[function(){var e=this._self._c;return e("tr",[e("th",{attrs:{width:"20%"}},[this._v("openEO Error Code")]),this._v(" "),e("th",{attrs:{width:"40%"}},[this._v("Description")]),this._v(" "),e("th",{attrs:{width:"35%"}},[this._v("Example Message")]),this._v(" "),e("th",{attrs:{width:"5%"}},[this._v("HTTP Status Code")])])}],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/2.3409b604.js b/assets/js/2.61db955a.js similarity index 97% rename from assets/js/2.3409b604.js rename to assets/js/2.61db955a.js index fb2966041..21e408993 100644 --- a/assets/js/2.3409b604.js +++ b/assets/js/2.61db955a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2,52],{163:function(t,e,s){},164:function(t,e,s){"use strict";s.r(e);var n={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((t,e)=>{var s=this.$site.themeConfig.versions[this.versionIndex],n=this.$site.themeConfig.versions[e];return t.regularPath=this.$page.regularPath.replace(s.path,n.path),t}).filter((t,e)=>e!==this.versionIndex&&this.$site.pages.findIndex(e=>e.regularPath==t.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:t}=this.$site;var e=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(e)&&"string"==typeof e[1])for(var s in t.versions)if(t.versions[s].folder===e[1])return parseInt(s);return 0}}},r=s(4),a=Object(r.a)(n,void 0,void 0,!1,null,null,null);e.default=a.exports},167:function(t,e){t.exports=function(t){return null==t}},171:function(t,e,s){},172:function(t,e,s){},173:function(t,e,s){},175:function(t,e,s){"use strict";s(163)},176:function(t,e,s){"use strict";s.r(e);var n=s(201),r=s(181),a=s(155);function i(t,e){return"group"===e.type&&e.children.some(e=>"group"===e.type?i(t,e):"page"===e.type&&Object(a.e)(t,e.path))}var o={name:"SidebarLinks",components:{SidebarGroup:n.default,SidebarLink:r.default},props:["items","depth","sidebarDepth"],data:()=>({openGroupIndex:0}),watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let s=0;s-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(a.e)(this.$route,t.regularPath)}}},u=s(4),l=Object(u.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(s,n){return e("li",{key:n},["group"===s.type?e("SidebarGroup",{attrs:{item:s,open:n===t.openGroupIndex,collapsable:s.collapsable||s.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(n)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:s}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=l.exports},181:function(t,e,s){"use strict";s.r(e);var n=s(155);function r(t,e,s,n,r){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:n,"sidebar-link":!0}};return r>2&&(a.style={"padding-left":r+"rem"}),t("RouterLink",a,s)}function a(t,e,s,i,o,u=1){return!e||u>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const l=Object(n.e)(i,s+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[r(t,s+"#"+e.slug,e.title,l,e.level-1),a(t,e.children,s,i,o,u+1)])}))}var i={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:s,$route:i,$themeConfig:o,$themeLocaleConfig:u},props:{item:l,sidebarDepth:c}}){const h=Object(n.e)(i,l.path),d="auto"===l.type?h||l.children.some(t=>Object(n.e)(i,l.basePath+"#"+t.slug)):h,p="external"===l.type?function(t,e,s){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[s,t("OutboundLink")])}(t,l.path,l.title||l.path):r(t,l.path,l.title||l.path,d),f=[e.frontmatter.sidebarDepth,c,u.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),v=u.displayAllHeaders||o.displayAllHeaders;if("auto"===l.type)return[p,a(t,l.children,l.basePath,i,f)];if((d||v)&&l.headers&&!n.d.test(l.path)){return[p,a(t,Object(n.c)(l.headers),l.path,i,f)]}return p}},o=(s(175),s(4)),u=Object(o.a)(i,void 0,void 0,!1,null,null,null);e.default=u.exports},183:function(t,e,s){},186:function(t,e,s){"use strict";s(171)},187:function(t,e,s){var n=s(6),r=s(1),a=s(5);t.exports=function(t){return"string"==typeof t||!r(t)&&a(t)&&"[object String]"==n(t)}},188:function(t,e,s){"use strict";s(172)},189:function(t,e,s){},190:function(t,e,s){"use strict";s(173)},191:function(t,e,s){},192:function(t,e,s){},201:function(t,e,s){"use strict";s.r(e);var n=s(155),r={name:"SidebarGroup",components:{DropdownTransition:s(160).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=s(176).default},methods:{isActive:n.e}},a=(s(190),s(4)),i=Object(a.a)(r,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=i.exports},205:function(t,e,s){"use strict";s.r(e);var n=s(167),r=s.n(n),a=s(155),i={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:s="",docsBranch:n="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,s,n,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,s,n,r){if(/bitbucket.org/.test(t)){return(a.i.test(e)?e:t).replace(a.a,"")+"/src"+`/${n}/`+(s?s.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${n}&fileviewer=file-view-default`}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${n}/`+(s?s.replace(a.a,"")+"/":"")+r}}},o=(s(186),s(4)),u=Object(o.a)(i,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v("\n "+t._s(t.editLinkText)+"\n "),e("OutboundLink")],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e(),t._v(" "),e("div",{staticClass:"license"},[t._v("\n This documentation is licensed under the\n "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo.org/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t._v("\n Apache License, Version 2.0\n "),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=u.exports},206:function(t,e,s){"use strict";s.r(e);var n=s(155),r=s(187),a=s.n(r),i=s(167),o=s.n(i),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(l.PREV,this)},next(){return c(l.NEXT,this)}}};const l={NEXT:{resolveLink:function(t,e){return h(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return h(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:s,$route:r,$site:i,sidebarItems:u}){const{resolveLink:l,getThemeLinkConfig:c,getPageLinkConfig:h}=t,d=c(e),p=h(s),f=o()(p)?d:p;return!1===f?void 0:a()(f)?Object(n.j)(i.pages,f,r.path):l(s,u)}function h(t,e,s){const n=[];!function t(e,s){for(let n=0,r=e.length;n=e?t:""+Array(e+1-n.length).join(s)+t},g={s:m,z:function(t){var e=-t.utcOffset(),s=Math.abs(e),n=Math.floor(s/60),r=s%60;return(e<=0?"+":"-")+m(n,2,"0")+":"+m(r,2,"0")},m:function t(e,s){if(e.date()1)return t(i[0])}else{var o=e.name;_[o]=e,r=o}return!n&&r&&(b=r),r||!n&&b},y=function(t,e){if(C(t))return t.clone();var s="object"==typeof e?e:{};return s.date=t,s.args=arguments,new w(s)},S=g;S.l=k,S.i=C,S.w=function(t,e){return y(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var w=function(){function v(t){this.$L=k(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[$]=!0}var m=v.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,s=t.utc;if(null===e)return new Date(NaN);if(S.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var n=e.match(p);if(n){var r=n[2]-1||0,a=(n[7]||"0").substring(0,3);return s?new Date(Date.UTC(n[1],r,n[3]||1,n[4]||0,n[5]||0,n[6]||0,a)):new Date(n[1],r,n[3]||1,n[4]||0,n[5]||0,n[6]||0,a)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return S},m.isValid=function(){return!(this.$d.toString()===d)},m.isSame=function(t,e){var s=y(t);return this.startOf(e)<=s&&s<=this.endOf(e)},m.isAfter=function(t,e){return y(t)({isSidebarOpen:!1}),computed:{shouldShowFullpage(){return this.$page.frontmatter.iframe||this.$page.frontmatter.fullpage},shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!this.shouldShowFullpage&&!t.news&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(h.k)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},filters:{date:t=>r()(t).format("MMMM D, YYYY")},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,s=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(s)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},p=(s(299),s(4)),f=Object(p.a)(d,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[e("VersionChooser",{attrs:{sidebar:!0}}),t._v(" "),t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),e("VersionChooser"),t._v(" "),t.$page.frontmatter.home?e("Home",{attrs:{defaultVersion:t.defaultVersion}}):t.$page.frontmatter.news?e("main",{staticClass:"page"},[e("div",{staticClass:"theme-default-content news"},[e("h1",[t._v(t._s(t.$page.frontmatter.title))]),t._v(" "),e("small",{staticClass:"news-meta"},[t._v("Written\n "),t.$page.frontmatter.date?[t._v("on "),e("em",[t._v(t._s(t._f("date")(t.$page.frontmatter.date)))])]:t._e(),t._v(" "),t.$page.frontmatter.author?[t._v("by "),e("em",[t._v(t._s(t.$page.frontmatter.author))])]:t._e(),t._v(".\n ")],2),t._v(" "),e("Content")],1)]):t.shouldShowFullpage?e("main",{staticClass:"fullpage",class:{page:!t.$page.frontmatter.stripCSS}},[t.$page.frontmatter.iframe?e("InlineFrame",{key:t.$page.key,attrs:{url:t.$page.frontmatter.iframe,version:t.version}}):e("Content",{staticClass:"fullpage-content"})],1):t.$page.frontmatter.custom?e("main",{staticClass:"page"},[e("Content",{staticClass:"theme-default-content custom"})],1):e("Page",{attrs:{"sidebar-items":t.sidebarItems}},[t._t("page-top"),t._v(" "),t._t("page-bottom")],2)],1)}),[],!1,null,null,null);e.default=f.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[2,52],{163:function(t,e,s){},164:function(t,e,s){"use strict";s.r(e);var n={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((t,e)=>{var s=this.$site.themeConfig.versions[this.versionIndex],n=this.$site.themeConfig.versions[e];return t.regularPath=this.$page.regularPath.replace(s.path,n.path),t}).filter((t,e)=>e!==this.versionIndex&&this.$site.pages.findIndex(e=>e.regularPath==t.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:t}=this.$site;var e=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(e)&&"string"==typeof e[1])for(var s in t.versions)if(t.versions[s].folder===e[1])return parseInt(s);return 0}}},r=s(4),a=Object(r.a)(n,void 0,void 0,!1,null,null,null);e.default=a.exports},167:function(t,e){t.exports=function(t){return null==t}},171:function(t,e,s){},172:function(t,e,s){},173:function(t,e,s){},175:function(t,e,s){"use strict";s(163)},176:function(t,e,s){"use strict";s.r(e);var n=s(201),r=s(181),a=s(155);function i(t,e){return"group"===e.type&&e.children.some(e=>"group"===e.type?i(t,e):"page"===e.type&&Object(a.e)(t,e.path))}var o={name:"SidebarLinks",components:{SidebarGroup:n.default,SidebarLink:r.default},props:["items","depth","sidebarDepth"],data:()=>({openGroupIndex:0}),watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let s=0;s-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(a.e)(this.$route,t.regularPath)}}},u=s(4),l=Object(u.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(s,n){return e("li",{key:n},["group"===s.type?e("SidebarGroup",{attrs:{item:s,open:n===t.openGroupIndex,collapsable:s.collapsable||s.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(n)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:s}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=l.exports},181:function(t,e,s){"use strict";s.r(e);var n=s(155);function r(t,e,s,n,r){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:n,"sidebar-link":!0}};return r>2&&(a.style={"padding-left":r+"rem"}),t("RouterLink",a,s)}function a(t,e,s,i,o,u=1){return!e||u>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const l=Object(n.e)(i,s+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[r(t,s+"#"+e.slug,e.title,l,e.level-1),a(t,e.children,s,i,o,u+1)])}))}var i={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:s,$route:i,$themeConfig:o,$themeLocaleConfig:u},props:{item:l,sidebarDepth:c}}){const h=Object(n.e)(i,l.path),d="auto"===l.type?h||l.children.some(t=>Object(n.e)(i,l.basePath+"#"+t.slug)):h,p="external"===l.type?function(t,e,s){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[s,t("OutboundLink")])}(t,l.path,l.title||l.path):r(t,l.path,l.title||l.path,d),f=[e.frontmatter.sidebarDepth,c,u.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),v=u.displayAllHeaders||o.displayAllHeaders;if("auto"===l.type)return[p,a(t,l.children,l.basePath,i,f)];if((d||v)&&l.headers&&!n.d.test(l.path)){return[p,a(t,Object(n.c)(l.headers),l.path,i,f)]}return p}},o=(s(175),s(4)),u=Object(o.a)(i,void 0,void 0,!1,null,null,null);e.default=u.exports},183:function(t,e,s){},186:function(t,e,s){"use strict";s(171)},187:function(t,e,s){var n=s(6),r=s(1),a=s(5);t.exports=function(t){return"string"==typeof t||!r(t)&&a(t)&&"[object String]"==n(t)}},188:function(t,e,s){"use strict";s(172)},189:function(t,e,s){},190:function(t,e,s){"use strict";s(173)},191:function(t,e,s){},192:function(t,e,s){},201:function(t,e,s){"use strict";s.r(e);var n=s(155),r={name:"SidebarGroup",components:{DropdownTransition:s(160).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=s(176).default},methods:{isActive:n.e}},a=(s(190),s(4)),i=Object(a.a)(r,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=i.exports},205:function(t,e,s){"use strict";s.r(e);var n=s(167),r=s.n(n),a=s(155),i={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:s="",docsBranch:n="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,s,n,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,s,n,r){if(/bitbucket.org/.test(t)){return(a.i.test(e)?e:t).replace(a.a,"")+"/src"+`/${n}/`+(s?s.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${n}&fileviewer=file-view-default`}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${n}/`+(s?s.replace(a.a,"")+"/":"")+r}}},o=(s(186),s(4)),u=Object(o.a)(i,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v("\n "+t._s(t.editLinkText)+"\n "),e("OutboundLink")],1)]):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e(),t._v(" "),e("div",{staticClass:"license"},[t._v("\n This documentation is licensed under the\n "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo.org/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t._v("\n Apache License, Version 2.0\n "),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=u.exports},206:function(t,e,s){"use strict";s.r(e);var n=s(155),r=s(187),a=s.n(r),i=s(167),o=s.n(i),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(l.PREV,this)},next(){return c(l.NEXT,this)}}};const l={NEXT:{resolveLink:function(t,e){return h(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return h(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:s,$route:r,$site:i,sidebarItems:u}){const{resolveLink:l,getThemeLinkConfig:c,getPageLinkConfig:h}=t,d=c(e),p=h(s),f=o()(p)?d:p;return!1===f?void 0:a()(f)?Object(n.j)(i.pages,f,r.path):l(s,u)}function h(t,e,s){const n=[];!function t(e,s){for(let n=0,r=e.length;n=e?t:""+Array(e+1-n.length).join(s)+t},g={s:m,z:function(t){var e=-t.utcOffset(),s=Math.abs(e),n=Math.floor(s/60),r=s%60;return(e<=0?"+":"-")+m(n,2,"0")+":"+m(r,2,"0")},m:function t(e,s){if(e.date()1)return t(i[0])}else{var o=e.name;_[o]=e,r=o}return!n&&r&&(b=r),r||!n&&b},y=function(t,e){if(C(t))return t.clone();var s="object"==typeof e?e:{};return s.date=t,s.args=arguments,new w(s)},S=g;S.l=k,S.i=C,S.w=function(t,e){return y(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var w=function(){function v(t){this.$L=k(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[$]=!0}var m=v.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,s=t.utc;if(null===e)return new Date(NaN);if(S.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var n=e.match(p);if(n){var r=n[2]-1||0,a=(n[7]||"0").substring(0,3);return s?new Date(Date.UTC(n[1],r,n[3]||1,n[4]||0,n[5]||0,n[6]||0,a)):new Date(n[1],r,n[3]||1,n[4]||0,n[5]||0,n[6]||0,a)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return S},m.isValid=function(){return!(this.$d.toString()===d)},m.isSame=function(t,e){var s=y(t);return this.startOf(e)<=s&&s<=this.endOf(e)},m.isAfter=function(t,e){return y(t)({isSidebarOpen:!1}),computed:{shouldShowFullpage(){return this.$page.frontmatter.iframe||this.$page.frontmatter.fullpage},shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!this.shouldShowFullpage&&!t.news&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(h.k)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},filters:{date:t=>r()(t).format("MMMM D, YYYY")},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,s=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(s)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},p=(s(300),s(4)),f=Object(p.a)(d,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[e("VersionChooser",{attrs:{sidebar:!0}}),t._v(" "),t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),e("VersionChooser"),t._v(" "),t.$page.frontmatter.home?e("Home",{attrs:{defaultVersion:t.defaultVersion}}):t.$page.frontmatter.news?e("main",{staticClass:"page"},[e("div",{staticClass:"theme-default-content news"},[e("h1",[t._v(t._s(t.$page.frontmatter.title))]),t._v(" "),e("small",{staticClass:"news-meta"},[t._v("Written\n "),t.$page.frontmatter.date?[t._v("on "),e("em",[t._v(t._s(t._f("date")(t.$page.frontmatter.date)))])]:t._e(),t._v(" "),t.$page.frontmatter.author?[t._v("by "),e("em",[t._v(t._s(t.$page.frontmatter.author))])]:t._e(),t._v(".\n ")],2),t._v(" "),e("Content")],1)]):t.shouldShowFullpage?e("main",{staticClass:"fullpage",class:{page:!t.$page.frontmatter.stripCSS}},[t.$page.frontmatter.iframe?e("InlineFrame",{key:t.$page.key,attrs:{url:t.$page.frontmatter.iframe,version:t.version}}):e("Content",{staticClass:"fullpage-content"})],1):t.$page.frontmatter.custom?e("main",{staticClass:"page"},[e("Content",{staticClass:"theme-default-content custom"})],1):e("Page",{attrs:{"sidebar-items":t.sidebarItems}},[t._t("page-top"),t._v(" "),t._t("page-bottom")],2)],1)}),[],!1,null,null,null);e.default=f.exports}}]); \ No newline at end of file diff --git a/assets/js/20.e74d8d3c.js b/assets/js/20.75da5c4d.js similarity index 98% rename from assets/js/20.e74d8d3c.js rename to assets/js/20.75da5c4d.js index b03a766ab..1f8c1e62a 100644 --- a/assets/js/20.e74d8d3c.js +++ b/assets/js/20.75da5c4d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20,37,52],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return p})),n.d(e,"j",(function(){return d})),n.d(e,"k",(function(){return f})),n.d(e,"c",(function(){return m}));const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function v(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},159:function(t,e,n){"use strict";n.r(e);var r=n(155),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(4),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},164:function(t,e,n){"use strict";n.r(e);var r={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((t,e)=>{var n=this.$site.themeConfig.versions[this.versionIndex],r=this.$site.themeConfig.versions[e];return t.regularPath=this.$page.regularPath.replace(n.path,r.path),t}).filter((t,e)=>e!==this.versionIndex&&this.$site.pages.findIndex(e=>e.regularPath==t.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:t}=this.$site;var e=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(e)&&"string"==typeof e[1])for(var n in t.versions)if(t.versions[n].folder===e[1])return parseInt(n);return 0}}},i=n(4),s=Object(i.a)(r,void 0,void 0,!1,null,null,null);e.default=s.exports},192:function(t,e,n){},212:function(t,e,n){"use strict";n(192)},293:function(t,e,n){"use strict";n.r(e);var r=n(159),i=n(164),s={name:"VersionChooser",components:{NavLink:r.default},props:{sidebar:{type:Boolean,default:!1}},mixins:[i.default]},a=(n(212),n(4)),o=Object(a.a)(s,(function(){var t=this,e=t._self._c;return t.versioned?e("div",{attrs:{id:"docVersionChooser"}},[t.sidebar?e("nav",{staticClass:"nav-links"},[e("div",{staticClass:"nav-item"},[e("div",{staticClass:"dropdown-wrapper open"},[t._m(0),t._v(" "),e("ul",{staticClass:"nav-dropdown"},[t.otherVersions.length?t._l(t.otherVersions,(function(t,n){return e("li",{key:n,staticClass:"dropdown-item"},[e("NavLink",{attrs:{item:{link:t.regularPath,text:t.title}}})],1)})):e("li",{staticClass:"dropdown-item"},[e("em",[t._v("Not available")])])],2)])])]):e("div",{staticClass:"dropdown-wrapper"},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":"Version"}},[e("span",{staticClass:"title"},[t._v("Version: "+t._s(t.version.title))]),t._v(" "),e("span",{staticClass:"arrow right"})]),t._v(" "),e("ul",{staticClass:"nav-dropdown",staticStyle:{display:"none"}},[e("li",{staticClass:"dropdown-item"},[e("h4",[t._v("Applicable API Versions")]),t._v(" "),e("ul",{staticClass:"dropdown-subitem-wrapper"},[t.unreleased?e("li",{staticClass:"dropdown-subitem"},[e("em",[t._v("Unreleased")])]):t._l(t.version.apiVersions,(function(n){return e("li",{key:n,staticClass:"dropdown-subitem"},[e("span",[t._v(t._s(n))])])}))],2)]),t._v(" "),e("li",{staticClass:"dropdown-item"},[e("h4",[t._v("Other Page Versions")]),t._v(" "),e("ul",{staticClass:"dropdown-subitem-wrapper"},[t.otherVersions.length?t._l(t.otherVersions,(function(t,n){return e("li",{key:n,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:{link:t.regularPath,text:t.title}}})],1)})):e("li",{staticClass:"dropdown-subitem"},[e("em",[t._v("Not available")])])],2)])])])]):t._e()}),[function(){var t=this._self._c;return t("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":"Other Versions"}},[t("span",{staticClass:"title"},[this._v("Other Page Versions")])])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[20,38,52],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return p})),n.d(e,"j",(function(){return d})),n.d(e,"k",(function(){return f})),n.d(e,"c",(function(){return m}));const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function v(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},159:function(t,e,n){"use strict";n.r(e);var r=n(155),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(4),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},164:function(t,e,n){"use strict";n.r(e);var r={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((t,e)=>{var n=this.$site.themeConfig.versions[this.versionIndex],r=this.$site.themeConfig.versions[e];return t.regularPath=this.$page.regularPath.replace(n.path,r.path),t}).filter((t,e)=>e!==this.versionIndex&&this.$site.pages.findIndex(e=>e.regularPath==t.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:t}=this.$site;var e=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(e)&&"string"==typeof e[1])for(var n in t.versions)if(t.versions[n].folder===e[1])return parseInt(n);return 0}}},i=n(4),s=Object(i.a)(r,void 0,void 0,!1,null,null,null);e.default=s.exports},192:function(t,e,n){},212:function(t,e,n){"use strict";n(192)},294:function(t,e,n){"use strict";n.r(e);var r=n(159),i=n(164),s={name:"VersionChooser",components:{NavLink:r.default},props:{sidebar:{type:Boolean,default:!1}},mixins:[i.default]},a=(n(212),n(4)),o=Object(a.a)(s,(function(){var t=this,e=t._self._c;return t.versioned?e("div",{attrs:{id:"docVersionChooser"}},[t.sidebar?e("nav",{staticClass:"nav-links"},[e("div",{staticClass:"nav-item"},[e("div",{staticClass:"dropdown-wrapper open"},[t._m(0),t._v(" "),e("ul",{staticClass:"nav-dropdown"},[t.otherVersions.length?t._l(t.otherVersions,(function(t,n){return e("li",{key:n,staticClass:"dropdown-item"},[e("NavLink",{attrs:{item:{link:t.regularPath,text:t.title}}})],1)})):e("li",{staticClass:"dropdown-item"},[e("em",[t._v("Not available")])])],2)])])]):e("div",{staticClass:"dropdown-wrapper"},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":"Version"}},[e("span",{staticClass:"title"},[t._v("Version: "+t._s(t.version.title))]),t._v(" "),e("span",{staticClass:"arrow right"})]),t._v(" "),e("ul",{staticClass:"nav-dropdown",staticStyle:{display:"none"}},[e("li",{staticClass:"dropdown-item"},[e("h4",[t._v("Applicable API Versions")]),t._v(" "),e("ul",{staticClass:"dropdown-subitem-wrapper"},[t.unreleased?e("li",{staticClass:"dropdown-subitem"},[e("em",[t._v("Unreleased")])]):t._l(t.version.apiVersions,(function(n){return e("li",{key:n,staticClass:"dropdown-subitem"},[e("span",[t._v(t._s(n))])])}))],2)]),t._v(" "),e("li",{staticClass:"dropdown-item"},[e("h4",[t._v("Other Page Versions")]),t._v(" "),e("ul",{staticClass:"dropdown-subitem-wrapper"},[t.otherVersions.length?t._l(t.otherVersions,(function(t,n){return e("li",{key:n,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:{link:t.regularPath,text:t.title}}})],1)})):e("li",{staticClass:"dropdown-subitem"},[e("em",[t._v("Not available")])])],2)])])])]):t._e()}),[function(){var t=this._self._c;return t("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":"Other Versions"}},[t("span",{staticClass:"title"},[this._v("Other Page Versions")])])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/22.e6db7235.js b/assets/js/22.3fe8079a.js similarity index 94% rename from assets/js/22.e6db7235.js rename to assets/js/22.3fe8079a.js index d25e71366..ea74c4cfd 100644 --- a/assets/js/22.e6db7235.js +++ b/assets/js/22.3fe8079a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22,32,35],{198:function(e,t,s){},199:function(e,t,s){},219:function(e,t,s){"use strict";s(198)},220:function(e,t,s){"use strict";s(199)},227:function(e,t,s){"use strict";s.r(t);var a=s(177),r={name:"ProcessParameter",components:{DeprecationNotice:()=>Promise.all([s.e(0),s.e(5)]).then(s.bind(null,484)),Description:()=>Promise.resolve().then(s.bind(null,462)),ExperimentalNotice:()=>Promise.all([s.e(0),s.e(6)]).then(s.bind(null,485)),JsonSchema:()=>Promise.all([s.e(0),s.e(32)]).then(s.bind(null,468))},mixins:[a.a],props:{parameter:{type:Object},processUrl:{type:String},...a.a.props},computed:{hasDefault(){return void 0!==this.parameter.default},defaultValue(){return JSON.stringify(this.parameter.default)}}},i=(s(219),s(4)),n=Object(i.a)(r,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component process-parameter"},[t("h4",[t("code",[e._v(e._s(e.parameter.name))]),e._v(" "),e.parameter.optional?e._e():t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]),e._v(" "),e.hasDefault?t("code",{staticClass:"default"},[e._v(" = "+e._s(e.defaultValue))]):e._e()]),e._v(" "),t("div",{staticClass:"details"},[e.parameter.description?t("Description",{attrs:{description:e.parameter.description,processUrl:e.processUrl}}):e._e(),e._v(" "),!0===e.parameter.deprecated?t("DeprecationNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),!0===e.parameter.experimental?t("ExperimentalNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),e.parameter["federation:backends"]?t("FederationNotice",{attrs:{backends:e.parameter["federation:backends"],federation:e.federation,entity:"parameter"}}):e._e(),e._v(" "),e.parameter.schema?t("div",{staticClass:"json-schema-container"},[t("JsonSchema",{attrs:{schema:e.parameter.schema,processUrl:e.processUrl}})],1):e._e()],1)])}),[],!1,null,null,null);t.default=n.exports},468:function(e,t,s){"use strict";s.r(t);var a=s(157),r={name:"JsonSchema",components:{Description:()=>Promise.resolve().then(s.bind(null,462)),"openeo-json-schema":()=>Promise.resolve().then(s.bind(null,468))},props:{schema:{type:[Object,Array],default:()=>({})},initShown:{type:Boolean,default:!0},nestingLevel:{type:Number,default:1},processUrl:String},data(){return{visible:this.initShown,filteredObjectSchema:null}},beforeCreate(){a.a.enableHtmlProps(this),this.$options.components.ProcessParameter=s(227).default},filters:{regex:e=>e.replaceAll(/\r/g,"\\r").replaceAll(/\n/g,"\\n").replaceAll(/\t/g,"\\t")},computed:{showSchema(){return"object"==typeof this.schema&&null!==this.schema&&this.nestingLevel<20},showAnyType(){return a.a.isObject(this.schema)&&void 0===this.schema.type&&void 0===this.schema.subtype},isProcessGraph(){return"object"===this.schema.type&&"process-graph"===this.schema.subtype},compositeTypes(){return Array.isArray(this.schema)?this.schema:Array.isArray(this.schema.anyOf)?this.schema.anyOf:Array.isArray(this.schema.oneOf)?this.schema.oneOf:[this.schema]},hasReturns(){return this.isProcessGraph&&a.a.isObject(this.schema.returns)},hasParameters(){return this.isProcessGraph&&Array.isArray(this.schema.parameters)&&this.schema.parameters.length>0}},watch:{initShown(e){this.visible=e},schema:{immediate:!0,handler(e){var t=null;for(var s in e)"required"!=s&&"properties"!=s&&"parameters"!=s&&"returns"!==s&&(null===t&&(t={}),t[s]=e[s]);this.filteredObjectSchema=t,this.visible=this.initShown}}},methods:{show(){this.visible=!0},formatKey(e){switch(e){case"items":return"Array items";case"minItems":return"Min. number of items";case"const":return"Allowed value";case"maxItems":return"Max. number of items";case"minimum":return"Minimum value (inclusive)";case"maximum":return"Maximum value (inclusive)";case"exclusiveMinimum":return"Minimum value (exclusive)";case"exclusiveMinimum":return"Maximum value (exclusive)";case"enum":return"Allowed values";case"default":return"Default value";case"type":return"Data type";case"allOf":return"Composite data type";case"contentMediaType":return"Media Type";case"contentEncoding":return"Encoding";case"deprecated":return"Deprecated";case"additionalProperties":return"Each property";default:if(e.length>1)return a.a.prettifyString(e)}return e},formatType(e){return void 0===e&&(e=this.schema),a.a.dataType(e)},showRow(e){return"object"==e?"object"==this.schema.type&&"object"==typeof this.schema.properties:"title"!=e&&"description"!=e&&"subtype"!=e&&"format"!=e&&"anyOf"!=e&&"oneOf"!=e&&"federation:backends"!=e&&("items"!=e||1!==Object.keys(this.schema.items).length||void 0===this.schema.items.type)}}},i=(s(220),s(4)),n=Object(i.a)(r,(function(){var e=this,t=e._self._c;return e.showSchema?t("div",{staticClass:"vue-component json-schema",class:{composite:e.compositeTypes.length>1}},[e.visible?[e.isProcessGraph?t("div",{staticClass:"schemaProcessGraph"},[t("div",{staticClass:"process-graph-parameters"},[t("p",{staticClass:"schema-attrs"},[e._v(e._s(e.formatKey("type"))+": "),t("span",{staticClass:"data-type"},[e._v("User-defined Process (process-graph:object)")])]),e._v(" "),e._m(0),e._v(" "),e.hasParameters?e._l(e.schema.parameters,(function(s,a){return t("ProcessParameter",{key:a,attrs:{parameter:s,processUrl:e.processUrl}})})):t("p",[e._v("No parameters defined.")]),e._v(" "),e._m(1),e._v(" "),e.hasReturns?[e.schema.returns.description?t("Description",{attrs:{description:e.schema.returns.description,processUrl:e.processUrl}}):e._e(),e._v(" "),e.schema.returns.schema?t("div",{staticClass:"json-schema-container"},[t("openeo-json-schema",{attrs:{schema:e.schema.returns.schema}})],1):e._e()]:t("p",[e._v("No constraints defined.")])],2)]):e.showRow("object")?t("div",{staticClass:"schemaObjectElement"},[t("div",{staticClass:"inline-schema-attrs"},[null!==e.filteredObjectSchema?t("openeo-json-schema",{attrs:{schema:e.filteredObjectSchema,nestingLevel:e.nestingLevel+1}}):e._e(),e._v(" "),t("table",{staticClass:"object-properties"},[e._m(2),e._v(" "),e._l(e.schema.properties,(function(s,a){return t("tr",{key:a},[t("td",{staticClass:"key"},[e._v("\n\t\t\t\t\t\t\t"+e._s(a)+"\n\t\t\t\t\t\t\t"),e.schema.required&&-1!==e.schema.required.indexOf(a)?t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]):e._e()]),e._v(" "),t("td",{staticClass:"value"},[t("openeo-json-schema",{attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})],1)])}))],2)],1)]):t("table",{staticClass:"schema-attrs"},["string"==typeof e.schema.title?t("tr",[t("td",{attrs:{colspan:"2"}},[t("strong",[e._v(e._s(e.schema.title))])])]):e._e(),e._v(" "),"string"==typeof e.schema.description?t("tr",[t("td",{attrs:{colspan:"2"}},[t("Description",{attrs:{description:e.schema.description,compact:!0}})],1)]):e._e(),e._v(" "),e.showAnyType?t("tr",[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey("type"))+":")]),e._v(" "),t("td",{staticClass:"value data-type"},[e._v("any")])]):e.compositeTypes.length>1?[e._m(3),e._v(" "),t("tr",[t("td",{staticClass:"schema-container data-types-container",attrs:{colspan:"2"}},e._l(e.compositeTypes,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1)])]:e._e(),e._v(" "),Array.isArray(this.schema)?e._e():[e._l(e.schema,(function(s,a){return[void 0!==s&&e.showRow(a)?t("tr",{key:a},[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey(a))+":")]),e._v(" "),t("td",{staticClass:"value"},["type"==a?t("span",{staticClass:"data-type"},[e._v(e._s(e.formatType()))]):"allOf"==a&&Array.isArray(s)?t("div",{staticClass:"schema-container"},e._l(s,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1):"const"!=a&&"default"!=a&&"examples"!=a&&!0===s?t("span",{attrs:{title:"true"}},[e._v("✓ Yes")]):"const"!=a&&"default"!=a&&"examples"!=a&&!1===s?t("span",{attrs:{title:"false"}},[e._v("✕ No")]):"examples"!=a&&Array.isArray(s)?t("ul",{staticClass:"comma-separated-list"},e._l(s,(function(s,a){return t("li",{key:a},[e._v(e._s(s))])})),0):"examples"==a&&Array.isArray(s)&&s.length>1?t("ul",e._l(s,(function(s,a){return t("li",{key:a},[t("code",[e._v(e._s(s))])])})),0):"examples"==a&&Array.isArray(s)&&1===s.length?t("code",[e._v(e._s(s[0]))]):"description"==a?t("Description",{attrs:{description:s,compact:!0}}):"default"==a&&""===s?t("em",[e._v("Empty string")]):"default"!=a||"object"!=typeof s&&"boolean"!=typeof s?"pattern"==a&&"string"==typeof s?t("code",[e._v(e._s(e._f("regex")(s)))]):"object"==typeof s?t("openeo-json-schema",{attrs:{schema:s,initShown:e.nestingLevel<3,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}}):t("span",[e._v(e._s(s))]):t("code",[e._v(e._s(JSON.stringify(s)))])],1)]):e._e()]}))]],2)]:t("div",{staticClass:"schema-expand"},[t("a",{on:{click:function(t){return e.show()}}},[e._v("> ...")])])],2):e._e()}),[function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"The parameters that can be used in the process."}},[e("strong",[this._v("Parameters:")])])},function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"Describes what must be returned by the process."}},[e("strong",[this._v("Expected Return Value:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"object-prop-heading",attrs:{colspan:"2"}},[this._v("Object Properties:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"data-types-heading",attrs:{colspan:"2"}},[this._v("Data Types:")])])}],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22,33,36],{198:function(e,t,s){},199:function(e,t,s){},219:function(e,t,s){"use strict";s(198)},220:function(e,t,s){"use strict";s(199)},227:function(e,t,s){"use strict";s.r(t);var a=s(177),r={name:"ProcessParameter",components:{DeprecationNotice:()=>Promise.all([s.e(0),s.e(5)]).then(s.bind(null,486)),Description:()=>Promise.resolve().then(s.bind(null,464)),ExperimentalNotice:()=>Promise.all([s.e(0),s.e(6)]).then(s.bind(null,487)),JsonSchema:()=>Promise.all([s.e(0),s.e(33)]).then(s.bind(null,470))},mixins:[a.a],props:{parameter:{type:Object},processUrl:{type:String},...a.a.props},computed:{hasDefault(){return void 0!==this.parameter.default},defaultValue(){return JSON.stringify(this.parameter.default)}}},i=(s(219),s(4)),n=Object(i.a)(r,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component process-parameter"},[t("h4",[t("code",[e._v(e._s(e.parameter.name))]),e._v(" "),e.parameter.optional?e._e():t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]),e._v(" "),e.hasDefault?t("code",{staticClass:"default"},[e._v(" = "+e._s(e.defaultValue))]):e._e()]),e._v(" "),t("div",{staticClass:"details"},[e.parameter.description?t("Description",{attrs:{description:e.parameter.description,processUrl:e.processUrl}}):e._e(),e._v(" "),!0===e.parameter.deprecated?t("DeprecationNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),!0===e.parameter.experimental?t("ExperimentalNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),e.parameter["federation:backends"]?t("FederationNotice",{attrs:{backends:e.parameter["federation:backends"],federation:e.federation,entity:"parameter"}}):e._e(),e._v(" "),e.parameter.schema?t("div",{staticClass:"json-schema-container"},[t("JsonSchema",{attrs:{schema:e.parameter.schema,processUrl:e.processUrl}})],1):e._e()],1)])}),[],!1,null,null,null);t.default=n.exports},470:function(e,t,s){"use strict";s.r(t);var a=s(157),r={name:"JsonSchema",components:{Description:()=>Promise.resolve().then(s.bind(null,464)),"openeo-json-schema":()=>Promise.resolve().then(s.bind(null,470))},props:{schema:{type:[Object,Array],default:()=>({})},initShown:{type:Boolean,default:!0},nestingLevel:{type:Number,default:1},processUrl:String},data(){return{visible:this.initShown,filteredObjectSchema:null}},beforeCreate(){a.a.enableHtmlProps(this),this.$options.components.ProcessParameter=s(227).default},filters:{regex:e=>e.replaceAll(/\r/g,"\\r").replaceAll(/\n/g,"\\n").replaceAll(/\t/g,"\\t")},computed:{showSchema(){return"object"==typeof this.schema&&null!==this.schema&&this.nestingLevel<20},showAnyType(){return a.a.isObject(this.schema)&&void 0===this.schema.type&&void 0===this.schema.subtype},isProcessGraph(){return"object"===this.schema.type&&"process-graph"===this.schema.subtype},compositeTypes(){return Array.isArray(this.schema)?this.schema:Array.isArray(this.schema.anyOf)?this.schema.anyOf:Array.isArray(this.schema.oneOf)?this.schema.oneOf:[this.schema]},hasReturns(){return this.isProcessGraph&&a.a.isObject(this.schema.returns)},hasParameters(){return this.isProcessGraph&&Array.isArray(this.schema.parameters)&&this.schema.parameters.length>0}},watch:{initShown(e){this.visible=e},schema:{immediate:!0,handler(e){var t=null;for(var s in e)"required"!=s&&"properties"!=s&&"parameters"!=s&&"returns"!==s&&(null===t&&(t={}),t[s]=e[s]);this.filteredObjectSchema=t,this.visible=this.initShown}}},methods:{show(){this.visible=!0},formatKey(e){switch(e){case"items":return"Array items";case"minItems":return"Min. number of items";case"const":return"Allowed value";case"maxItems":return"Max. number of items";case"minimum":return"Minimum value (inclusive)";case"maximum":return"Maximum value (inclusive)";case"exclusiveMinimum":return"Minimum value (exclusive)";case"exclusiveMinimum":return"Maximum value (exclusive)";case"enum":return"Allowed values";case"default":return"Default value";case"type":return"Data type";case"allOf":return"Composite data type";case"contentMediaType":return"Media Type";case"contentEncoding":return"Encoding";case"deprecated":return"Deprecated";case"additionalProperties":return"Each property";default:if(e.length>1)return a.a.prettifyString(e)}return e},formatType(e){return void 0===e&&(e=this.schema),a.a.dataType(e)},showRow(e){return"object"==e?"object"==this.schema.type&&"object"==typeof this.schema.properties:"title"!=e&&"description"!=e&&"subtype"!=e&&"format"!=e&&"anyOf"!=e&&"oneOf"!=e&&"federation:backends"!=e&&("items"!=e||1!==Object.keys(this.schema.items).length||void 0===this.schema.items.type)}}},i=(s(220),s(4)),n=Object(i.a)(r,(function(){var e=this,t=e._self._c;return e.showSchema?t("div",{staticClass:"vue-component json-schema",class:{composite:e.compositeTypes.length>1}},[e.visible?[e.isProcessGraph?t("div",{staticClass:"schemaProcessGraph"},[t("div",{staticClass:"process-graph-parameters"},[t("p",{staticClass:"schema-attrs"},[e._v(e._s(e.formatKey("type"))+": "),t("span",{staticClass:"data-type"},[e._v("User-defined Process (process-graph:object)")])]),e._v(" "),e._m(0),e._v(" "),e.hasParameters?e._l(e.schema.parameters,(function(s,a){return t("ProcessParameter",{key:a,attrs:{parameter:s,processUrl:e.processUrl}})})):t("p",[e._v("No parameters defined.")]),e._v(" "),e._m(1),e._v(" "),e.hasReturns?[e.schema.returns.description?t("Description",{attrs:{description:e.schema.returns.description,processUrl:e.processUrl}}):e._e(),e._v(" "),e.schema.returns.schema?t("div",{staticClass:"json-schema-container"},[t("openeo-json-schema",{attrs:{schema:e.schema.returns.schema}})],1):e._e()]:t("p",[e._v("No constraints defined.")])],2)]):e.showRow("object")?t("div",{staticClass:"schemaObjectElement"},[t("div",{staticClass:"inline-schema-attrs"},[null!==e.filteredObjectSchema?t("openeo-json-schema",{attrs:{schema:e.filteredObjectSchema,nestingLevel:e.nestingLevel+1}}):e._e(),e._v(" "),t("table",{staticClass:"object-properties"},[e._m(2),e._v(" "),e._l(e.schema.properties,(function(s,a){return t("tr",{key:a},[t("td",{staticClass:"key"},[e._v("\n\t\t\t\t\t\t\t"+e._s(a)+"\n\t\t\t\t\t\t\t"),e.schema.required&&-1!==e.schema.required.indexOf(a)?t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]):e._e()]),e._v(" "),t("td",{staticClass:"value"},[t("openeo-json-schema",{attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})],1)])}))],2)],1)]):t("table",{staticClass:"schema-attrs"},["string"==typeof e.schema.title?t("tr",[t("td",{attrs:{colspan:"2"}},[t("strong",[e._v(e._s(e.schema.title))])])]):e._e(),e._v(" "),"string"==typeof e.schema.description?t("tr",[t("td",{attrs:{colspan:"2"}},[t("Description",{attrs:{description:e.schema.description,compact:!0}})],1)]):e._e(),e._v(" "),e.showAnyType?t("tr",[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey("type"))+":")]),e._v(" "),t("td",{staticClass:"value data-type"},[e._v("any")])]):e.compositeTypes.length>1?[e._m(3),e._v(" "),t("tr",[t("td",{staticClass:"schema-container data-types-container",attrs:{colspan:"2"}},e._l(e.compositeTypes,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1)])]:e._e(),e._v(" "),Array.isArray(this.schema)?e._e():[e._l(e.schema,(function(s,a){return[void 0!==s&&e.showRow(a)?t("tr",{key:a},[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey(a))+":")]),e._v(" "),t("td",{staticClass:"value"},["type"==a?t("span",{staticClass:"data-type"},[e._v(e._s(e.formatType()))]):"allOf"==a&&Array.isArray(s)?t("div",{staticClass:"schema-container"},e._l(s,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1):"const"!=a&&"default"!=a&&"examples"!=a&&!0===s?t("span",{attrs:{title:"true"}},[e._v("✓ Yes")]):"const"!=a&&"default"!=a&&"examples"!=a&&!1===s?t("span",{attrs:{title:"false"}},[e._v("✕ No")]):"examples"!=a&&Array.isArray(s)?t("ul",{staticClass:"comma-separated-list"},e._l(s,(function(s,a){return t("li",{key:a},[e._v(e._s(s))])})),0):"examples"==a&&Array.isArray(s)&&s.length>1?t("ul",e._l(s,(function(s,a){return t("li",{key:a},[t("code",[e._v(e._s(s))])])})),0):"examples"==a&&Array.isArray(s)&&1===s.length?t("code",[e._v(e._s(s[0]))]):"description"==a?t("Description",{attrs:{description:s,compact:!0}}):"default"==a&&""===s?t("em",[e._v("Empty string")]):"default"!=a||"object"!=typeof s&&"boolean"!=typeof s?"pattern"==a&&"string"==typeof s?t("code",[e._v(e._s(e._f("regex")(s)))]):"object"==typeof s?t("openeo-json-schema",{attrs:{schema:s,initShown:e.nestingLevel<3,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}}):t("span",[e._v(e._s(s))]):t("code",[e._v(e._s(JSON.stringify(s)))])],1)]):e._e()]}))]],2)]:t("div",{staticClass:"schema-expand"},[t("a",{on:{click:function(t){return e.show()}}},[e._v("> ...")])])],2):e._e()}),[function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"The parameters that can be used in the process."}},[e("strong",[this._v("Parameters:")])])},function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"Describes what must be returned by the process."}},[e("strong",[this._v("Expected Return Value:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"object-prop-heading",attrs:{colspan:"2"}},[this._v("Object Properties:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"data-types-heading",attrs:{colspan:"2"}},[this._v("Data Types:")])])}],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/23.8a960640.js b/assets/js/23.4861be01.js similarity index 97% rename from assets/js/23.8a960640.js rename to assets/js/23.4861be01.js index 850fe175a..3d8db5476 100644 --- a/assets/js/23.8a960640.js +++ b/assets/js/23.4861be01.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23,37],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return u})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return p})),n.d(e,"j",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return b}));const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function c(t){return a.test(t)}function l(t){return/^mailto:/.test(t)}function u(t){return/^tel:/.test(t)}function h(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},159:function(t,e,n){"use strict";n.r(e);var i=n(155),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(4),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},183:function(t,e,n){},208:function(t,e,n){"use strict";n(183)},290:function(t,e,n){"use strict";n.r(e);var i={name:"Home",components:{NavLink:n(159).default},props:["blog","defaultVersion"],computed:{data(){return this.$page.frontmatter}}},s=(n(208),n(4)),r=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":"main-title"}},[e("header",{staticClass:"hero"},[e("img",{attrs:{src:"/images/openeo_logo.png",alt:"openEO"}}),t._v(" "),e("p",{staticClass:"description"},[t._v("\n openEO develops an API that allows users to connect to Earth observation cloud back-ends in a simple and unified way.\n ")]),t._v(" "),e("p",{staticClass:"description"},[t._v("\n The project maintains the API and process specifications, and an open-source ecosystem with clients and server implementations.\n ")]),t._v(" "),t._m(0),t._v(" "),e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:{link:"/about/",text:"Why?"}}}),t._v(" "),e("NavLink",{staticClass:"action-button",attrs:{item:{link:this.$site.themeConfig.docPath,text:"Get Started!"}}})],1)]),t._v(" "),e("div",{staticClass:"features"},[e("div",{staticClass:"feature"},[e("h2",[t._v("Latest News")]),t._v(" "),e("News",{attrs:{limit:3}})],1),t._v(" "),e("div",{staticClass:"feature"},[e("h2",[t._v("Other Channels")]),t._v(" "),e("Channels")],1)]),t._v(" "),e("Content",{staticClass:"theme-default-content custom"})],1)}),[function(){var t=this._self._c;return t("p",{staticClass:"description small"},[this._v("\n openEO is not to be confused with independant services that implement the specifications such as "),t("a",{attrs:{href:"https://openeo.cloud",target:"_blank"}},[this._v("openEO Platform")]),this._v(" or "),t("a",{attrs:{href:"https://dataspace.copernicus.eu/",title:"Copernicus Data Space Ecosystem",target:"_blank"}},[this._v("CDSE")]),this._v("."),t("br"),this._v("For a list of services built on top of openEO, please visit the "),t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank"}},[this._v("openEO Hub")]),this._v(".\n ")])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[23,38],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return u})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return p})),n.d(e,"j",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"c",(function(){return b}));const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function c(t){return a.test(t)}function l(t){return/^mailto:/.test(t)}function u(t){return/^tel:/.test(t)}function h(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},159:function(t,e,n){"use strict";n.r(e);var i=n(155),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(4),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},183:function(t,e,n){},208:function(t,e,n){"use strict";n(183)},291:function(t,e,n){"use strict";n.r(e);var i={name:"Home",components:{NavLink:n(159).default},props:["blog","defaultVersion"],computed:{data(){return this.$page.frontmatter}}},s=(n(208),n(4)),r=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":"main-title"}},[e("header",{staticClass:"hero"},[e("img",{attrs:{src:"/images/openeo_logo.png",alt:"openEO"}}),t._v(" "),e("p",{staticClass:"description"},[t._v("\n openEO develops an API that allows users to connect to Earth observation cloud back-ends in a simple and unified way.\n ")]),t._v(" "),e("p",{staticClass:"description"},[t._v("\n The project maintains the API and process specifications, and an open-source ecosystem with clients and server implementations.\n ")]),t._v(" "),t._m(0),t._v(" "),e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:{link:"/about/",text:"Why?"}}}),t._v(" "),e("NavLink",{staticClass:"action-button",attrs:{item:{link:this.$site.themeConfig.docPath,text:"Get Started!"}}})],1)]),t._v(" "),e("div",{staticClass:"features"},[e("div",{staticClass:"feature"},[e("h2",[t._v("Latest News")]),t._v(" "),e("News",{attrs:{limit:3}})],1),t._v(" "),e("div",{staticClass:"feature"},[e("h2",[t._v("Other Channels")]),t._v(" "),e("Channels")],1)]),t._v(" "),e("Content",{staticClass:"theme-default-content custom"})],1)}),[function(){var t=this._self._c;return t("p",{staticClass:"description small"},[this._v("\n openEO is not to be confused with independant services that implement the specifications such as "),t("a",{attrs:{href:"https://openeo.cloud",target:"_blank"}},[this._v("openEO Platform")]),this._v(" or "),t("a",{attrs:{href:"https://dataspace.copernicus.eu/",title:"Copernicus Data Space Ecosystem",target:"_blank"}},[this._v("CDSE")]),this._v("."),t("br"),this._v("For a list of services built on top of openEO, please visit the "),t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank"}},[this._v("openEO Hub")]),this._v(".\n ")])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/26.4b52ff84.js b/assets/js/26.4b52ff84.js new file mode 100644 index 000000000..d7452f893 --- /dev/null +++ b/assets/js/26.4b52ff84.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26,52],{164:function(e,t,s){"use strict";s.r(t);var i={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((e,t)=>{var s=this.$site.themeConfig.versions[this.versionIndex],i=this.$site.themeConfig.versions[t];return e.regularPath=this.$page.regularPath.replace(s.path,i.path),e}).filter((e,t)=>t!==this.versionIndex&&this.$site.pages.findIndex(t=>t.regularPath==e.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:e}=this.$site;var t=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(t)&&"string"==typeof t[1])for(var s in e.versions)if(e.versions[s].folder===t[1])return parseInt(s);return 0}}},n=s(4),r=Object(n.a)(i,void 0,void 0,!1,null,null,null);t.default=r.exports},234:function(e,t,s){},345:function(e,t,s){"use strict";s(234)},484:function(e,t,s){"use strict";s.r(t);var i={name:"ProcessesSpec",mixins:[s(164).default],components:{DocGen:()=>Promise.all([s.e(0),s.e(10)]).then(s.bind(null,476))},data:()=>({notice:"**Note:** This is the list of all processes specified by the openEO project. Back-ends implement a varying set of processes. Thus, the processes you can use at a specific back-end may derive from the specification, may include non-standardized processes and may not implement all processes listed here. Please check each back-end individually for the processes they support. The client libraries usually have a function called `listProcesses` or `list_processes` for that."}),computed:{documentUrl(){return"/documentation/"+this.version.folder+"/processes.json"}}},n=(s(345),s(4)),r=Object(n.a)(i,(function(){return(0,this._self._c)("DocGen",{attrs:{document:this.documentUrl,apiVersion:this.version.apiTag,notice:this.notice,showExperimentalByDefault:""}})}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/26.18eff1fc.js b/assets/js/27.6947eeb9.js similarity index 95% rename from assets/js/26.18eff1fc.js rename to assets/js/27.6947eeb9.js index 0401fabca..d314312a4 100644 --- a/assets/js/26.18eff1fc.js +++ b/assets/js/27.6947eeb9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{232:function(t,e,s){},338:function(t,e,s){"use strict";s(232)},478:function(t,e,s){"use strict";s.r(e);var a={name:"Channels",props:{contact:{type:Boolean,default:!0},code:{type:Boolean,default:!0},chat:{type:Boolean,default:!0},email:{type:Boolean,default:!0},chat:{type:Boolean,default:!0},youtube:{type:Boolean,default:!0},x:{type:Boolean,default:!0},linkedin:{type:Boolean,default:!0},github:{type:Boolean,default:!0},cran:{type:Boolean,default:!0},pypi:{type:Boolean,default:!0},conda:{type:Boolean,default:!0},npm:{type:Boolean,default:!0},julia:{type:Boolean,default:!0},qgis:{type:Boolean,default:!0}}},n=(s(338),s(4)),i=Object(n.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"channels"},[t.contact?e("ul",{staticClass:"contact"},[e("li",[t.email?e("a",{staticClass:"mail",attrs:{href:"mailto:openeo.psc@uni-muenster.de",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/maildotru.svg",alt:"Email the PSC",title:"Email the PSC"}}),t._v(" Email")]):t._e()]),t._v(" "),e("li",[t.chat?e("a",{staticClass:"chat",attrs:{href:"https://gitter.im/Open-EO/community",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/gitter.svg",alt:"Public chat on Gitter",title:"Public chat on Gitter"}}),t._v(" Chat")]):t._e()]),t._v(" "),e("li",[t.github&&!t.code?e("a",{staticClass:"github",attrs:{href:"https://github.com/Open-EO",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/github.svg",alt:"GitHub: Open-EO",title:"GitHub: Open-EO"}}),t._v(" GitHub")]):t._e()]),t._v(" "),e("li",[t.linkedin?e("a",{staticClass:"linkedin",attrs:{href:"https://www.linkedin.com/company/openeospec/",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/linkedin.svg",alt:"LinkedIn",title:"LinkedIn"}}),t._v(" LinkedIn")]):t._e()]),t._v(" "),e("li",[t.x?e("a",{staticClass:"x",attrs:{href:"https://twitter.com/Open_EO",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/x.svg",alt:"X / Twitter: Open_EO",title:"X / Twitter: Open_EO"}}),t._v(" X / Twitter")]):t._e()]),t._v(" "),e("li",[t.youtube?e("a",{staticClass:"youtube",attrs:{href:"https://www.youtube.com/channel/UCMJQil8j9sHBQkcSlSaEsvQ",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/youtube.svg",alt:"YouTube: openEO",title:"YouTube: openEO"}}),t._v(" YouTube")]):t._e()])]):t._e(),t._v(" "),t.code?e("ul",{staticClass:"code"},[e("li",[t.github?e("a",{staticClass:"github",attrs:{href:"https://github.com/Open-EO",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/github.svg",alt:"GitHub: Open-EO",title:"GitHub: Open-EO"}}),t._v(" GitHub")]):t._e()]),t._v(" "),e("li",[t.cran?e("a",{staticClass:"r",attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/r.svg",alt:"CRAN",title:"CRAN"}}),t._v(" CRAN / R")]):t._e()]),t._v(" "),e("li",[t.npm?e("a",{staticClass:"npm",attrs:{href:"https://www.npmjs.com/search?q=%40openeo%2F",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/npm.svg",alt:"npm: @openeo",title:"npm: @openeo"}}),t._v(" npm / JS")]):t._e()]),t._v(" "),e("li",[t.pypi?e("a",{staticClass:"pypi",attrs:{href:"https://pypi.org/project/openeo/",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/pypi.svg",alt:"PyPI",title:"PyPI"}}),t._v(" PyPI / Python")]):t._e()]),t._v(" "),e("li",[t.conda?e("a",{staticClass:"conda",attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/anaconda.svg",alt:"Conda Forge",title:"Conda Forge"}}),t._v(" Conda Forge / Python")]):t._e()]),t._v(" "),e("li",[t.julia?e("a",{staticClass:"julia",attrs:{href:"https://github.com/Open-EO/openeo-julia-client",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/julia.svg",alt:"Julia",title:"Julia"}}),t._v(" Julia")]):t._e()]),t._v(" "),e("li",[t.qgis?e("a",{staticClass:"qgis",attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/qgis.svg",alt:"QGIS",title:"QGIS"}}),t._v(" QGIS")]):t._e()])]):t._e()])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{232:function(t,e,s){},343:function(t,e,s){"use strict";s(232)},481:function(t,e,s){"use strict";s.r(e);var a={name:"Channels",props:{contact:{type:Boolean,default:!0},code:{type:Boolean,default:!0},chat:{type:Boolean,default:!0},email:{type:Boolean,default:!0},chat:{type:Boolean,default:!0},youtube:{type:Boolean,default:!0},x:{type:Boolean,default:!0},linkedin:{type:Boolean,default:!0},github:{type:Boolean,default:!0},cran:{type:Boolean,default:!0},pypi:{type:Boolean,default:!0},conda:{type:Boolean,default:!0},npm:{type:Boolean,default:!0},julia:{type:Boolean,default:!0},qgis:{type:Boolean,default:!0}}},n=(s(343),s(4)),i=Object(n.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"channels"},[t.contact?e("ul",{staticClass:"contact"},[e("li",[t.email?e("a",{staticClass:"mail",attrs:{href:"mailto:openeo.psc@uni-muenster.de",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/maildotru.svg",alt:"Email the PSC",title:"Email the PSC"}}),t._v(" Email")]):t._e()]),t._v(" "),e("li",[t.chat?e("a",{staticClass:"chat",attrs:{href:"https://gitter.im/Open-EO/community",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/gitter.svg",alt:"Public chat on Gitter",title:"Public chat on Gitter"}}),t._v(" Chat")]):t._e()]),t._v(" "),e("li",[t.github&&!t.code?e("a",{staticClass:"github",attrs:{href:"https://github.com/Open-EO",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/github.svg",alt:"GitHub: Open-EO",title:"GitHub: Open-EO"}}),t._v(" GitHub")]):t._e()]),t._v(" "),e("li",[t.linkedin?e("a",{staticClass:"linkedin",attrs:{href:"https://www.linkedin.com/company/openeospec/",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/linkedin.svg",alt:"LinkedIn",title:"LinkedIn"}}),t._v(" LinkedIn")]):t._e()]),t._v(" "),e("li",[t.x?e("a",{staticClass:"x",attrs:{href:"https://twitter.com/Open_EO",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/x.svg",alt:"X / Twitter: Open_EO",title:"X / Twitter: Open_EO"}}),t._v(" X / Twitter")]):t._e()]),t._v(" "),e("li",[t.youtube?e("a",{staticClass:"youtube",attrs:{href:"https://www.youtube.com/channel/UCMJQil8j9sHBQkcSlSaEsvQ",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/youtube.svg",alt:"YouTube: openEO",title:"YouTube: openEO"}}),t._v(" YouTube")]):t._e()])]):t._e(),t._v(" "),t.code?e("ul",{staticClass:"code"},[e("li",[t.github?e("a",{staticClass:"github",attrs:{href:"https://github.com/Open-EO",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/github.svg",alt:"GitHub: Open-EO",title:"GitHub: Open-EO"}}),t._v(" GitHub")]):t._e()]),t._v(" "),e("li",[t.cran?e("a",{staticClass:"r",attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/r.svg",alt:"CRAN",title:"CRAN"}}),t._v(" CRAN / R")]):t._e()]),t._v(" "),e("li",[t.npm?e("a",{staticClass:"npm",attrs:{href:"https://www.npmjs.com/search?q=%40openeo%2F",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/npm.svg",alt:"npm: @openeo",title:"npm: @openeo"}}),t._v(" npm / JS")]):t._e()]),t._v(" "),e("li",[t.pypi?e("a",{staticClass:"pypi",attrs:{href:"https://pypi.org/project/openeo/",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/pypi.svg",alt:"PyPI",title:"PyPI"}}),t._v(" PyPI / Python")]):t._e()]),t._v(" "),e("li",[t.conda?e("a",{staticClass:"conda",attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/anaconda.svg",alt:"Conda Forge",title:"Conda Forge"}}),t._v(" Conda Forge / Python")]):t._e()]),t._v(" "),e("li",[t.julia?e("a",{staticClass:"julia",attrs:{href:"https://github.com/Open-EO/openeo-julia-client",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/julia.svg",alt:"Julia",title:"Julia"}}),t._v(" Julia")]):t._e()]),t._v(" "),e("li",[t.qgis?e("a",{staticClass:"qgis",attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank"}},[e("img",{attrs:{src:"https://cdn.jsdelivr.net/npm/simple-icons@10.1.0/icons/qgis.svg",alt:"QGIS",title:"QGIS"}}),t._v(" QGIS")]):t._e()])]):t._e()])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/27.63f18194.js b/assets/js/28.bd2c4f3b.js similarity index 68% rename from assets/js/27.63f18194.js rename to assets/js/28.bd2c4f3b.js index 5877e07a1..9821535f6 100644 --- a/assets/js/27.63f18194.js +++ b/assets/js/28.bd2c4f3b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{233:function(s,e,r){},343:function(s,e,r){"use strict";r(233)},480:function(s,e,r){"use strict";r.r(e);var a={name:"InlineFrame",props:["url","version"],data:()=>({frameUrl:null}),beforeMount(){this.frameUrl=this.url.replace("{apiTag}",this.version.apiTag).replace("{processesTag}",this.version.processesTag),window.location.hash&&(this.frameUrl+=window.location.hash)}},t=(r(343),r(4)),n=Object(t.a)(a,(function(){return(0,this._self._c)("iframe",{staticClass:"stretch",attrs:{src:this.frameUrl}})}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{233:function(s,e,r){},344:function(s,e,r){"use strict";r(233)},482:function(s,e,r){"use strict";r.r(e);var a={name:"InlineFrame",props:["url","version"],data:()=>({frameUrl:null}),beforeMount(){this.frameUrl=this.url.replace("{apiTag}",this.version.apiTag).replace("{processesTag}",this.version.processesTag),window.location.hash&&(this.frameUrl+=window.location.hash)}},t=(r(344),r(4)),n=Object(t.a)(a,(function(){return(0,this._self._c)("iframe",{staticClass:"stretch",attrs:{src:this.frameUrl}})}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/28.f3280e14.js b/assets/js/29.8e88791e.js similarity index 82% rename from assets/js/28.f3280e14.js rename to assets/js/29.8e88791e.js index 7ec20022c..26d15cf07 100644 --- a/assets/js/28.f3280e14.js +++ b/assets/js/29.8e88791e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{182:function(e,t,i){},207:function(e,t,i){"use strict";i(182)},289:function(e,t,i){"use strict";i.r(t);var a={name:"AlgoliaSearchBox",props:["options"],data:()=>({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e){Promise.all([Promise.all([i.e(0),i.e(9)]).then(i.t.bind(null,472,7)),Promise.all([i.e(0),i.e(9)]).then(i.t.bind(null,473,7))]).then(([t])=>{t=t.default;const{algoliaOptions:i={}}=e;t(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:Object.assign({facetFilters:i.facetFilters||[]},i),handleSelected:(e,t,i)=>{const{pathname:a,hash:s}=new URL(i.url);if(i.url.includes("://openeo.org")){const e=a.replace(this.$site.base,"/"),t=decodeURIComponent(s);this.$router.push(`${e}${t}`)}else window.location.href=i.url}}))})},update(e){this.$el.innerHTML='',this.initialize(e)}}},s=(i(207),i(4)),l=Object(s.a)(a,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{182:function(e,t,i){},207:function(e,t,i){"use strict";i(182)},290:function(e,t,i){"use strict";i.r(t);var a={name:"AlgoliaSearchBox",props:["options"],data:()=>({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e){Promise.all([Promise.all([i.e(0),i.e(9)]).then(i.t.bind(null,474,7)),Promise.all([i.e(0),i.e(9)]).then(i.t.bind(null,475,7))]).then(([t])=>{t=t.default;const{algoliaOptions:i={}}=e;t(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:Object.assign({facetFilters:i.facetFilters||[]},i),handleSelected:(e,t,i)=>{const{pathname:a,hash:s}=new URL(i.url);if(i.url.includes("://openeo.org")){const e=a.replace(this.$site.base,"/"),t=decodeURIComponent(s);this.$router.push(`${e}${t}`)}else window.location.href=i.url}}))})},update(e){this.$el.innerHTML='',this.initialize(e)}}},s=(i(207),i(4)),l=Object(s.a)(a,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/3.996a1494.js b/assets/js/3.e5354094.js similarity index 99% rename from assets/js/3.996a1494.js rename to assets/js/3.e5354094.js index c48a5dc35..a57e46719 100644 --- a/assets/js/3.996a1494.js +++ b/assets/js/3.e5354094.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3,25,29],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return d})),n.d(e,"j",(function(){return h})),n.d(e,"k",(function(){return f})),n.d(e,"c",(function(){return g}));const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function d(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return h(n,e,r);if(Array.isArray(e))return Object.assign(h(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},160:function(t,e,n){"use strict";n.r(e);var r={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(161),n(4)),s=Object(i.a)(r,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},161:function(t,e,n){"use strict";n(158)},163:function(t,e,n){},173:function(t,e,n){},175:function(t,e,n){"use strict";n(163)},176:function(t,e,n){"use strict";n.r(e);var r=n(201),i=n(181),s=n(155);function a(t,e){return"group"===e.type&&e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(s.e)(t,e.path))}var o={name:"SidebarLinks",components:{SidebarGroup:r.default,SidebarLink:i.default},props:["items","depth","sidebarDepth"],data:()=>({openGroupIndex:0}),watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(s.e)(this.$route,t.regularPath)}}},l=n(4),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,r){return e("li",{key:r},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:r===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},181:function(t,e,n){"use strict";n.r(e);var r=n(155);function i(t,e,n,r,i){const s={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(s.style={"padding-left":i+"rem"}),t("RouterLink",s,n)}function s(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,u,e.level-1),s(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(r.e)(a,u.path),d="auto"===u.type?p||u.children.some(t=>Object(r.e)(a,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):i(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,s(t,u.children,u.basePath,a,f)];if((d||b)&&u.headers&&!r.d.test(u.path)){return[h,s(t,Object(r.c)(u.headers),u.path,a,f)]}return h}},o=(n(175),n(4)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},190:function(t,e,n){"use strict";n(173)},201:function(t,e,n){"use strict";n.r(e);var r=n(155),i={name:"SidebarGroup",components:{DropdownTransition:n(160).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(176).default},methods:{isActive:r.e}},s=(n(190),n(4)),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[3,25,30],{155:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return d})),n.d(e,"j",(function(){return h})),n.d(e,"k",(function(){return f})),n.d(e,"c",(function(){return g}));const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function d(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return h(n,e,r);if(Array.isArray(e))return Object.assign(h(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}},158:function(t,e,n){},160:function(t,e,n){"use strict";n.r(e);var r={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(161),n(4)),s=Object(i.a)(r,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},161:function(t,e,n){"use strict";n(158)},163:function(t,e,n){},173:function(t,e,n){},175:function(t,e,n){"use strict";n(163)},176:function(t,e,n){"use strict";n.r(e);var r=n(201),i=n(181),s=n(155);function a(t,e){return"group"===e.type&&e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(s.e)(t,e.path))}var o={name:"SidebarLinks",components:{SidebarGroup:r.default,SidebarLink:i.default},props:["items","depth","sidebarDepth"],data:()=>({openGroupIndex:0}),watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(s.e)(this.$route,t.regularPath)}}},l=n(4),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,r){return e("li",{key:r},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:r===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},181:function(t,e,n){"use strict";n.r(e);var r=n(155);function i(t,e,n,r,i){const s={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(s.style={"padding-left":i+"rem"}),t("RouterLink",s,n)}function s(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,u,e.level-1),s(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(r.e)(a,u.path),d="auto"===u.type?p||u.children.some(t=>Object(r.e)(a,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):i(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,s(t,u.children,u.basePath,a,f)];if((d||b)&&u.headers&&!r.d.test(u.path)){return[h,s(t,Object(r.c)(u.headers),u.path,a,f)]}return h}},o=(n(175),n(4)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},190:function(t,e,n){"use strict";n(173)},201:function(t,e,n){"use strict";n.r(e);var r=n(155),i={name:"SidebarGroup",components:{DropdownTransition:n(160).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(176).default},methods:{isActive:r.e}},s=(n(190),n(4)),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/29.d251e371.js b/assets/js/30.cdf48a9f.js similarity index 88% rename from assets/js/29.d251e371.js rename to assets/js/30.cdf48a9f.js index 332b4c0ab..80d42382a 100644 --- a/assets/js/29.d251e371.js +++ b/assets/js/30.cdf48a9f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{158:function(t,e,n){},160:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(161),n(4)),o=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},161:function(t,e,n){"use strict";n(158)}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{158:function(t,e,n){},160:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(161),n(4)),o=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},161:function(t,e,n){"use strict";n(158)}}]); \ No newline at end of file diff --git a/assets/js/30.5e423d89.js b/assets/js/31.14b2c0c5.js similarity index 85% rename from assets/js/30.5e423d89.js rename to assets/js/31.14b2c0c5.js index 72627e682..74c868e8b 100644 --- a/assets/js/30.5e423d89.js +++ b/assets/js/31.14b2c0c5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{185:function(t,c,n){},209:function(t,c,n){"use strict";n(185)},295:function(t,c,n){"use strict";n.r(c);n(209);var i=n(4),s=Object(i.a)({},(function(){var t=this,c=t._self._c;return c("div",{staticClass:"sidebar-button",on:{click:function(c){return t.$emit("toggle-sidebar")}}},[c("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[c("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);c.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{185:function(t,c,n){},209:function(t,c,n){"use strict";n(185)},296:function(t,c,n){"use strict";n.r(c);n(209);var i=n(4),s=Object(i.a)({},(function(){var t=this,c=t._self._c;return c("div",{staticClass:"sidebar-button",on:{click:function(c){return t.$emit("toggle-sidebar")}}},[c("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[c("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);c.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/31.4546c359.js b/assets/js/32.68bc9d8f.js similarity index 84% rename from assets/js/31.4546c359.js rename to assets/js/32.68bc9d8f.js index c84d4f17c..4ffa06099 100644 --- a/assets/js/31.4546c359.js +++ b/assets/js/32.68bc9d8f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{286:function(t,e,i){},458:function(t,e,i){"use strict";i(286)},470:function(t,e,i){"use strict";i.r(e);var s=i(177),n=i(157),r={name:"FederationMissingNotice",mixins:[s.a],props:{missing:{type:Array,required:!0},retry:{type:Function,default:null},...s.a.props},computed:{services(){return Array.isArray(this.missing)?this.missing.map(t=>n.a.isObject(this.federation)&&n.a.isObject(this.federation[t])&&"string"==typeof this.federation[t].title?this.federation[t].title:t):null}}},o=(i(458),i(4)),a=Object(o.a)(r,(function(){var t=this,e=t._self._c;return t.services?e("section",{staticClass:"vue-component message-block federation federation-backends"},[t.retry?e("button",{staticClass:"retry",attrs:{type:"button"},on:{click:t.retry}},[t._t("button-text",(function(){return[t._v("Retry")]}))],2):t._e(),t._v(" "),e("strong",{staticClass:"header"},[t._v("Incomplete")]),t._v(" "),e("p",[t._v("\n\t\tThe following list is incomplete as at least one of the services in the federation is currently not available.\n\t\tThe data for the following services is missing: "+t._s(t.services.join(", "))+"\n\t")])]):t._e()}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{287:function(t,e,i){},460:function(t,e,i){"use strict";i(287)},472:function(t,e,i){"use strict";i.r(e);var s=i(177),n=i(157),r={name:"FederationMissingNotice",mixins:[s.a],props:{missing:{type:Array,required:!0},retry:{type:Function,default:null},...s.a.props},computed:{services(){return Array.isArray(this.missing)?this.missing.map(t=>n.a.isObject(this.federation)&&n.a.isObject(this.federation[t])&&"string"==typeof this.federation[t].title?this.federation[t].title:t):null}}},o=(i(460),i(4)),a=Object(o.a)(r,(function(){var t=this,e=t._self._c;return t.services?e("section",{staticClass:"vue-component message-block federation federation-backends"},[t.retry?e("button",{staticClass:"retry",attrs:{type:"button"},on:{click:t.retry}},[t._t("button-text",(function(){return[t._v("Retry")]}))],2):t._e(),t._v(" "),e("strong",{staticClass:"header"},[t._v("Incomplete")]),t._v(" "),e("p",[t._v("\n\t\tThe following list is incomplete as at least one of the services in the federation is currently not available.\n\t\tThe data for the following services is missing: "+t._s(t.services.join(", "))+"\n\t")])]):t._e()}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/32.2c978bcd.js b/assets/js/33.b3d2428c.js similarity index 96% rename from assets/js/32.2c978bcd.js rename to assets/js/33.b3d2428c.js index 079c31374..cfb0f0212 100644 --- a/assets/js/32.2c978bcd.js +++ b/assets/js/33.b3d2428c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{199:function(e,t,s){},220:function(e,t,s){"use strict";s(199)},468:function(e,t,s){"use strict";s.r(t);var a=s(157),r={name:"JsonSchema",components:{Description:()=>Promise.resolve().then(s.bind(null,462)),"openeo-json-schema":()=>Promise.resolve().then(s.bind(null,468))},props:{schema:{type:[Object,Array],default:()=>({})},initShown:{type:Boolean,default:!0},nestingLevel:{type:Number,default:1},processUrl:String},data(){return{visible:this.initShown,filteredObjectSchema:null}},beforeCreate(){a.a.enableHtmlProps(this),this.$options.components.ProcessParameter=s(227).default},filters:{regex:e=>e.replaceAll(/\r/g,"\\r").replaceAll(/\n/g,"\\n").replaceAll(/\t/g,"\\t")},computed:{showSchema(){return"object"==typeof this.schema&&null!==this.schema&&this.nestingLevel<20},showAnyType(){return a.a.isObject(this.schema)&&void 0===this.schema.type&&void 0===this.schema.subtype},isProcessGraph(){return"object"===this.schema.type&&"process-graph"===this.schema.subtype},compositeTypes(){return Array.isArray(this.schema)?this.schema:Array.isArray(this.schema.anyOf)?this.schema.anyOf:Array.isArray(this.schema.oneOf)?this.schema.oneOf:[this.schema]},hasReturns(){return this.isProcessGraph&&a.a.isObject(this.schema.returns)},hasParameters(){return this.isProcessGraph&&Array.isArray(this.schema.parameters)&&this.schema.parameters.length>0}},watch:{initShown(e){this.visible=e},schema:{immediate:!0,handler(e){var t=null;for(var s in e)"required"!=s&&"properties"!=s&&"parameters"!=s&&"returns"!==s&&(null===t&&(t={}),t[s]=e[s]);this.filteredObjectSchema=t,this.visible=this.initShown}}},methods:{show(){this.visible=!0},formatKey(e){switch(e){case"items":return"Array items";case"minItems":return"Min. number of items";case"const":return"Allowed value";case"maxItems":return"Max. number of items";case"minimum":return"Minimum value (inclusive)";case"maximum":return"Maximum value (inclusive)";case"exclusiveMinimum":return"Minimum value (exclusive)";case"exclusiveMinimum":return"Maximum value (exclusive)";case"enum":return"Allowed values";case"default":return"Default value";case"type":return"Data type";case"allOf":return"Composite data type";case"contentMediaType":return"Media Type";case"contentEncoding":return"Encoding";case"deprecated":return"Deprecated";case"additionalProperties":return"Each property";default:if(e.length>1)return a.a.prettifyString(e)}return e},formatType(e){return void 0===e&&(e=this.schema),a.a.dataType(e)},showRow(e){return"object"==e?"object"==this.schema.type&&"object"==typeof this.schema.properties:"title"!=e&&"description"!=e&&"subtype"!=e&&"format"!=e&&"anyOf"!=e&&"oneOf"!=e&&"federation:backends"!=e&&("items"!=e||1!==Object.keys(this.schema.items).length||void 0===this.schema.items.type)}}},i=(s(220),s(4)),n=Object(i.a)(r,(function(){var e=this,t=e._self._c;return e.showSchema?t("div",{staticClass:"vue-component json-schema",class:{composite:e.compositeTypes.length>1}},[e.visible?[e.isProcessGraph?t("div",{staticClass:"schemaProcessGraph"},[t("div",{staticClass:"process-graph-parameters"},[t("p",{staticClass:"schema-attrs"},[e._v(e._s(e.formatKey("type"))+": "),t("span",{staticClass:"data-type"},[e._v("User-defined Process (process-graph:object)")])]),e._v(" "),e._m(0),e._v(" "),e.hasParameters?e._l(e.schema.parameters,(function(s,a){return t("ProcessParameter",{key:a,attrs:{parameter:s,processUrl:e.processUrl}})})):t("p",[e._v("No parameters defined.")]),e._v(" "),e._m(1),e._v(" "),e.hasReturns?[e.schema.returns.description?t("Description",{attrs:{description:e.schema.returns.description,processUrl:e.processUrl}}):e._e(),e._v(" "),e.schema.returns.schema?t("div",{staticClass:"json-schema-container"},[t("openeo-json-schema",{attrs:{schema:e.schema.returns.schema}})],1):e._e()]:t("p",[e._v("No constraints defined.")])],2)]):e.showRow("object")?t("div",{staticClass:"schemaObjectElement"},[t("div",{staticClass:"inline-schema-attrs"},[null!==e.filteredObjectSchema?t("openeo-json-schema",{attrs:{schema:e.filteredObjectSchema,nestingLevel:e.nestingLevel+1}}):e._e(),e._v(" "),t("table",{staticClass:"object-properties"},[e._m(2),e._v(" "),e._l(e.schema.properties,(function(s,a){return t("tr",{key:a},[t("td",{staticClass:"key"},[e._v("\n\t\t\t\t\t\t\t"+e._s(a)+"\n\t\t\t\t\t\t\t"),e.schema.required&&-1!==e.schema.required.indexOf(a)?t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]):e._e()]),e._v(" "),t("td",{staticClass:"value"},[t("openeo-json-schema",{attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})],1)])}))],2)],1)]):t("table",{staticClass:"schema-attrs"},["string"==typeof e.schema.title?t("tr",[t("td",{attrs:{colspan:"2"}},[t("strong",[e._v(e._s(e.schema.title))])])]):e._e(),e._v(" "),"string"==typeof e.schema.description?t("tr",[t("td",{attrs:{colspan:"2"}},[t("Description",{attrs:{description:e.schema.description,compact:!0}})],1)]):e._e(),e._v(" "),e.showAnyType?t("tr",[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey("type"))+":")]),e._v(" "),t("td",{staticClass:"value data-type"},[e._v("any")])]):e.compositeTypes.length>1?[e._m(3),e._v(" "),t("tr",[t("td",{staticClass:"schema-container data-types-container",attrs:{colspan:"2"}},e._l(e.compositeTypes,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1)])]:e._e(),e._v(" "),Array.isArray(this.schema)?e._e():[e._l(e.schema,(function(s,a){return[void 0!==s&&e.showRow(a)?t("tr",{key:a},[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey(a))+":")]),e._v(" "),t("td",{staticClass:"value"},["type"==a?t("span",{staticClass:"data-type"},[e._v(e._s(e.formatType()))]):"allOf"==a&&Array.isArray(s)?t("div",{staticClass:"schema-container"},e._l(s,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1):"const"!=a&&"default"!=a&&"examples"!=a&&!0===s?t("span",{attrs:{title:"true"}},[e._v("✓ Yes")]):"const"!=a&&"default"!=a&&"examples"!=a&&!1===s?t("span",{attrs:{title:"false"}},[e._v("✕ No")]):"examples"!=a&&Array.isArray(s)?t("ul",{staticClass:"comma-separated-list"},e._l(s,(function(s,a){return t("li",{key:a},[e._v(e._s(s))])})),0):"examples"==a&&Array.isArray(s)&&s.length>1?t("ul",e._l(s,(function(s,a){return t("li",{key:a},[t("code",[e._v(e._s(s))])])})),0):"examples"==a&&Array.isArray(s)&&1===s.length?t("code",[e._v(e._s(s[0]))]):"description"==a?t("Description",{attrs:{description:s,compact:!0}}):"default"==a&&""===s?t("em",[e._v("Empty string")]):"default"!=a||"object"!=typeof s&&"boolean"!=typeof s?"pattern"==a&&"string"==typeof s?t("code",[e._v(e._s(e._f("regex")(s)))]):"object"==typeof s?t("openeo-json-schema",{attrs:{schema:s,initShown:e.nestingLevel<3,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}}):t("span",[e._v(e._s(s))]):t("code",[e._v(e._s(JSON.stringify(s)))])],1)]):e._e()]}))]],2)]:t("div",{staticClass:"schema-expand"},[t("a",{on:{click:function(t){return e.show()}}},[e._v("> ...")])])],2):e._e()}),[function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"The parameters that can be used in the process."}},[e("strong",[this._v("Parameters:")])])},function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"Describes what must be returned by the process."}},[e("strong",[this._v("Expected Return Value:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"object-prop-heading",attrs:{colspan:"2"}},[this._v("Object Properties:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"data-types-heading",attrs:{colspan:"2"}},[this._v("Data Types:")])])}],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{199:function(e,t,s){},220:function(e,t,s){"use strict";s(199)},470:function(e,t,s){"use strict";s.r(t);var a=s(157),r={name:"JsonSchema",components:{Description:()=>Promise.resolve().then(s.bind(null,464)),"openeo-json-schema":()=>Promise.resolve().then(s.bind(null,470))},props:{schema:{type:[Object,Array],default:()=>({})},initShown:{type:Boolean,default:!0},nestingLevel:{type:Number,default:1},processUrl:String},data(){return{visible:this.initShown,filteredObjectSchema:null}},beforeCreate(){a.a.enableHtmlProps(this),this.$options.components.ProcessParameter=s(227).default},filters:{regex:e=>e.replaceAll(/\r/g,"\\r").replaceAll(/\n/g,"\\n").replaceAll(/\t/g,"\\t")},computed:{showSchema(){return"object"==typeof this.schema&&null!==this.schema&&this.nestingLevel<20},showAnyType(){return a.a.isObject(this.schema)&&void 0===this.schema.type&&void 0===this.schema.subtype},isProcessGraph(){return"object"===this.schema.type&&"process-graph"===this.schema.subtype},compositeTypes(){return Array.isArray(this.schema)?this.schema:Array.isArray(this.schema.anyOf)?this.schema.anyOf:Array.isArray(this.schema.oneOf)?this.schema.oneOf:[this.schema]},hasReturns(){return this.isProcessGraph&&a.a.isObject(this.schema.returns)},hasParameters(){return this.isProcessGraph&&Array.isArray(this.schema.parameters)&&this.schema.parameters.length>0}},watch:{initShown(e){this.visible=e},schema:{immediate:!0,handler(e){var t=null;for(var s in e)"required"!=s&&"properties"!=s&&"parameters"!=s&&"returns"!==s&&(null===t&&(t={}),t[s]=e[s]);this.filteredObjectSchema=t,this.visible=this.initShown}}},methods:{show(){this.visible=!0},formatKey(e){switch(e){case"items":return"Array items";case"minItems":return"Min. number of items";case"const":return"Allowed value";case"maxItems":return"Max. number of items";case"minimum":return"Minimum value (inclusive)";case"maximum":return"Maximum value (inclusive)";case"exclusiveMinimum":return"Minimum value (exclusive)";case"exclusiveMinimum":return"Maximum value (exclusive)";case"enum":return"Allowed values";case"default":return"Default value";case"type":return"Data type";case"allOf":return"Composite data type";case"contentMediaType":return"Media Type";case"contentEncoding":return"Encoding";case"deprecated":return"Deprecated";case"additionalProperties":return"Each property";default:if(e.length>1)return a.a.prettifyString(e)}return e},formatType(e){return void 0===e&&(e=this.schema),a.a.dataType(e)},showRow(e){return"object"==e?"object"==this.schema.type&&"object"==typeof this.schema.properties:"title"!=e&&"description"!=e&&"subtype"!=e&&"format"!=e&&"anyOf"!=e&&"oneOf"!=e&&"federation:backends"!=e&&("items"!=e||1!==Object.keys(this.schema.items).length||void 0===this.schema.items.type)}}},i=(s(220),s(4)),n=Object(i.a)(r,(function(){var e=this,t=e._self._c;return e.showSchema?t("div",{staticClass:"vue-component json-schema",class:{composite:e.compositeTypes.length>1}},[e.visible?[e.isProcessGraph?t("div",{staticClass:"schemaProcessGraph"},[t("div",{staticClass:"process-graph-parameters"},[t("p",{staticClass:"schema-attrs"},[e._v(e._s(e.formatKey("type"))+": "),t("span",{staticClass:"data-type"},[e._v("User-defined Process (process-graph:object)")])]),e._v(" "),e._m(0),e._v(" "),e.hasParameters?e._l(e.schema.parameters,(function(s,a){return t("ProcessParameter",{key:a,attrs:{parameter:s,processUrl:e.processUrl}})})):t("p",[e._v("No parameters defined.")]),e._v(" "),e._m(1),e._v(" "),e.hasReturns?[e.schema.returns.description?t("Description",{attrs:{description:e.schema.returns.description,processUrl:e.processUrl}}):e._e(),e._v(" "),e.schema.returns.schema?t("div",{staticClass:"json-schema-container"},[t("openeo-json-schema",{attrs:{schema:e.schema.returns.schema}})],1):e._e()]:t("p",[e._v("No constraints defined.")])],2)]):e.showRow("object")?t("div",{staticClass:"schemaObjectElement"},[t("div",{staticClass:"inline-schema-attrs"},[null!==e.filteredObjectSchema?t("openeo-json-schema",{attrs:{schema:e.filteredObjectSchema,nestingLevel:e.nestingLevel+1}}):e._e(),e._v(" "),t("table",{staticClass:"object-properties"},[e._m(2),e._v(" "),e._l(e.schema.properties,(function(s,a){return t("tr",{key:a},[t("td",{staticClass:"key"},[e._v("\n\t\t\t\t\t\t\t"+e._s(a)+"\n\t\t\t\t\t\t\t"),e.schema.required&&-1!==e.schema.required.indexOf(a)?t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]):e._e()]),e._v(" "),t("td",{staticClass:"value"},[t("openeo-json-schema",{attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})],1)])}))],2)],1)]):t("table",{staticClass:"schema-attrs"},["string"==typeof e.schema.title?t("tr",[t("td",{attrs:{colspan:"2"}},[t("strong",[e._v(e._s(e.schema.title))])])]):e._e(),e._v(" "),"string"==typeof e.schema.description?t("tr",[t("td",{attrs:{colspan:"2"}},[t("Description",{attrs:{description:e.schema.description,compact:!0}})],1)]):e._e(),e._v(" "),e.showAnyType?t("tr",[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey("type"))+":")]),e._v(" "),t("td",{staticClass:"value data-type"},[e._v("any")])]):e.compositeTypes.length>1?[e._m(3),e._v(" "),t("tr",[t("td",{staticClass:"schema-container data-types-container",attrs:{colspan:"2"}},e._l(e.compositeTypes,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1)])]:e._e(),e._v(" "),Array.isArray(this.schema)?e._e():[e._l(e.schema,(function(s,a){return[void 0!==s&&e.showRow(a)?t("tr",{key:a},[t("td",{staticClass:"key"},[e._v(e._s(e.formatKey(a))+":")]),e._v(" "),t("td",{staticClass:"value"},["type"==a?t("span",{staticClass:"data-type"},[e._v(e._s(e.formatType()))]):"allOf"==a&&Array.isArray(s)?t("div",{staticClass:"schema-container"},e._l(s,(function(s,a){return t("openeo-json-schema",{key:a,attrs:{schema:s,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}})})),1):"const"!=a&&"default"!=a&&"examples"!=a&&!0===s?t("span",{attrs:{title:"true"}},[e._v("✓ Yes")]):"const"!=a&&"default"!=a&&"examples"!=a&&!1===s?t("span",{attrs:{title:"false"}},[e._v("✕ No")]):"examples"!=a&&Array.isArray(s)?t("ul",{staticClass:"comma-separated-list"},e._l(s,(function(s,a){return t("li",{key:a},[e._v(e._s(s))])})),0):"examples"==a&&Array.isArray(s)&&s.length>1?t("ul",e._l(s,(function(s,a){return t("li",{key:a},[t("code",[e._v(e._s(s))])])})),0):"examples"==a&&Array.isArray(s)&&1===s.length?t("code",[e._v(e._s(s[0]))]):"description"==a?t("Description",{attrs:{description:s,compact:!0}}):"default"==a&&""===s?t("em",[e._v("Empty string")]):"default"!=a||"object"!=typeof s&&"boolean"!=typeof s?"pattern"==a&&"string"==typeof s?t("code",[e._v(e._s(e._f("regex")(s)))]):"object"==typeof s?t("openeo-json-schema",{attrs:{schema:s,initShown:e.nestingLevel<3,nestingLevel:e.nestingLevel+1,processUrl:e.processUrl}}):t("span",[e._v(e._s(s))]):t("code",[e._v(e._s(JSON.stringify(s)))])],1)]):e._e()]}))]],2)]:t("div",{staticClass:"schema-expand"},[t("a",{on:{click:function(t){return e.show()}}},[e._v("> ...")])])],2):e._e()}),[function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"The parameters that can be used in the process."}},[e("strong",[this._v("Parameters:")])])},function(){var e=this._self._c;return e("p",{staticClass:"schema-attrs",attrs:{title:"Describes what must be returned by the process."}},[e("strong",[this._v("Expected Return Value:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"object-prop-heading",attrs:{colspan:"2"}},[this._v("Object Properties:")])])},function(){var e=this._self._c;return e("tr",[e("th",{staticClass:"data-types-heading",attrs:{colspan:"2"}},[this._v("Data Types:")])])}],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/33.9beba470.js b/assets/js/34.1b7295f8.js similarity index 88% rename from assets/js/33.9beba470.js rename to assets/js/34.1b7295f8.js index 225594ec3..723eb7b46 100644 --- a/assets/js/33.9beba470.js +++ b/assets/js/34.1b7295f8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{288:function(t,e,a){},460:function(t,e,a){"use strict";a(288)},487:function(t,e,a){"use strict";a.r(e);var r=a(157),s={name:"ObjectTree",components:{"openeo-object-tree":()=>Promise.resolve().then(a.bind(null,487))},props:{data:{default:null},collapseAfter:{type:Number,default:10}},data:()=>({expand:!1}),computed:{isSingleValue(){return Array.isArray(this.data)&&1===this.data.length&&0===r.a.size(this.data[0])},size(){return"object"==typeof this.data?r.a.size(this.data):1},indicesShown(){if(!Array.isArray(this.data))return[];let t=this.data;return!this.expand&&null!==this.collapseAfter&&this.size>this.collapseAfter&&(t=Array(this.collapseAfter)),[...t.keys()]}},beforeCreate(){r.a.enableHtmlProps(this)},methods:{prettifyKey:t=>r.a.prettifyString(t),show(){this.expand=!0},isStructured:t=>r.a.size(t)>0,format:t=>null===t?"N/A":!0===t?"✔️":!1===t?"❌":"object"==typeof t&&0===r.a.size(t)?"Empty":"function"==typeof t?"JavaScript Function":"symbol"==typeof t?"JavaScript Symbol":null,isUrl:t=>r.a.isUrl(t,!1)}},i=(a(460),a(4)),n=Object(i.a)(s,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"vue-component object-tree",class:{inline:0===t.size}},[0===t.size?e("em",[t._v(t._s(t.format(t.data)))]):Array.isArray(t.data)?[e("ol",t._l(t.indicesShown,(function(a){return e("li",{key:a},[t.isStructured(t.data[a])?e("openeo-object-tree",{attrs:{data:t.data[a]}}):t.isUrl(t.data[a])?e("a",{attrs:{href:t.data[a],target:"_blank"}},[t._v(t._s(t.data[a]))]):t.format(t.data[a])?e("em",[t._v(t._s(t.format(t.data[a])))]):[t._v(t._s(t.data[a]))]],2)})),0),t._v(" "),t.size!==t.indicesShown.length?e("button",{attrs:{type:"button"},on:{click:t.show}},[t._v("Show all "+t._s(t.data.length)+" entries")]):t._e()]:"object"==typeof t.data?e("ul",t._l(t.data,(function(a,r){return e("li",{key:r},[e("strong",[t._v(t._s(t.prettifyKey(r)))]),t._v(": \n\t\t\t"),t.isStructured(a)?e("openeo-object-tree",{attrs:{data:a}}):t.isUrl(a)?e("a",{attrs:{href:a,target:"_blank"}},[t._v(t._s(a))]):t.format(a)?e("em",[t._v(t._s(t.format(a)))]):[t._v(t._s(a))]],2)})),0):[t._v(t._s(t.data))]],2)}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{289:function(t,e,a){},462:function(t,e,a){"use strict";a(289)},489:function(t,e,a){"use strict";a.r(e);var r=a(157),s={name:"ObjectTree",components:{"openeo-object-tree":()=>Promise.resolve().then(a.bind(null,489))},props:{data:{default:null},collapseAfter:{type:Number,default:10}},data:()=>({expand:!1}),computed:{isSingleValue(){return Array.isArray(this.data)&&1===this.data.length&&0===r.a.size(this.data[0])},size(){return"object"==typeof this.data?r.a.size(this.data):1},indicesShown(){if(!Array.isArray(this.data))return[];let t=this.data;return!this.expand&&null!==this.collapseAfter&&this.size>this.collapseAfter&&(t=Array(this.collapseAfter)),[...t.keys()]}},beforeCreate(){r.a.enableHtmlProps(this)},methods:{prettifyKey:t=>r.a.prettifyString(t),show(){this.expand=!0},isStructured:t=>r.a.size(t)>0,format:t=>null===t?"N/A":!0===t?"✔️":!1===t?"❌":"object"==typeof t&&0===r.a.size(t)?"Empty":"function"==typeof t?"JavaScript Function":"symbol"==typeof t?"JavaScript Symbol":null,isUrl:t=>r.a.isUrl(t,!1)}},i=(a(462),a(4)),n=Object(i.a)(s,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"vue-component object-tree",class:{inline:0===t.size}},[0===t.size?e("em",[t._v(t._s(t.format(t.data)))]):Array.isArray(t.data)?[e("ol",t._l(t.indicesShown,(function(a){return e("li",{key:a},[t.isStructured(t.data[a])?e("openeo-object-tree",{attrs:{data:t.data[a]}}):t.isUrl(t.data[a])?e("a",{attrs:{href:t.data[a],target:"_blank"}},[t._v(t._s(t.data[a]))]):t.format(t.data[a])?e("em",[t._v(t._s(t.format(t.data[a])))]):[t._v(t._s(t.data[a]))]],2)})),0),t._v(" "),t.size!==t.indicesShown.length?e("button",{attrs:{type:"button"},on:{click:t.show}},[t._v("Show all "+t._s(t.data.length)+" entries")]):t._e()]:"object"==typeof t.data?e("ul",t._l(t.data,(function(a,r){return e("li",{key:r},[e("strong",[t._v(t._s(t.prettifyKey(r)))]),t._v(": \n\t\t\t"),t.isStructured(a)?e("openeo-object-tree",{attrs:{data:a}}):t.isUrl(a)?e("a",{attrs:{href:a,target:"_blank"}},[t._v(t._s(a))]):t.format(a)?e("em",[t._v(t._s(t.format(a)))]):[t._v(t._s(a))]],2)})),0):[t._v(t._s(t.data))]],2)}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/34.84af4653.js b/assets/js/35.980662da.js similarity index 86% rename from assets/js/34.84af4653.js rename to assets/js/35.980662da.js index f92dfb16d..e10f4e36c 100644 --- a/assets/js/34.84af4653.js +++ b/assets/js/35.980662da.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{285:function(e,t,s){},457:function(e,t,s){"use strict";s(285)},469:function(e,t,s){"use strict";s.r(t);var i=s(177),n=s(157),a={name:"FederationNotice",mixins:[i.a],props:{entity:{type:String,default:"resource"},backends:{type:Array,default:[]},...i.a.props},computed:{unsupported(){if(0===n.a.size(this.federation))return this.backends;{let e=Object.keys(this.federation),t=Array.isArray(this.backends)?this.backends:e;return e.filter(e=>!t.includes(e))}},services(){return this.backends.map(e=>{let t={title:e};return n.a.isObject(this.federation)&&e in this.federation&&Object.assign(t,this.federation[e]),t})}}},r=(s(457),s(4)),l=Object(r.a)(a,(function(){var e=this,t=e._self._c;return e.unsupported.length>0?t("section",{staticClass:"vue-component message-block federation federation-backends"},[t("strong",{staticClass:"header"},[e._v("Federation")]),e._v(" "),t("p",[e._v("This "+e._s(e.entity)+" is only available through the following services in the federation:")]),e._v(" "),t("ul",e._l(e.services,(function(s){return t("li",{key:s.url},[t("div",{staticClass:"fed-header"},[t("strong",{staticClass:"fed-title"},[e._v(e._s(s.title))]),e._v(" "),t("ul",{staticClass:"badges small inline"},["offline"===s.status?t("li",{staticClass:"badge red"},[e._v("offline")]):t("li",{staticClass:"badge green"},[e._v("online")])])])])})),0)]):e._e()}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{286:function(e,t,s){},459:function(e,t,s){"use strict";s(286)},471:function(e,t,s){"use strict";s.r(t);var i=s(177),n=s(157),a={name:"FederationNotice",mixins:[i.a],props:{entity:{type:String,default:"resource"},backends:{type:Array,default:[]},...i.a.props},computed:{unsupported(){if(0===n.a.size(this.federation))return this.backends;{let e=Object.keys(this.federation),t=Array.isArray(this.backends)?this.backends:e;return e.filter(e=>!t.includes(e))}},services(){return this.backends.map(e=>{let t={title:e};return n.a.isObject(this.federation)&&e in this.federation&&Object.assign(t,this.federation[e]),t})}}},r=(s(459),s(4)),l=Object(r.a)(a,(function(){var e=this,t=e._self._c;return e.unsupported.length>0?t("section",{staticClass:"vue-component message-block federation federation-backends"},[t("strong",{staticClass:"header"},[e._v("Federation")]),e._v(" "),t("p",[e._v("This "+e._s(e.entity)+" is only available through the following services in the federation:")]),e._v(" "),t("ul",e._l(e.services,(function(s){return t("li",{key:s.url},[t("div",{staticClass:"fed-header"},[t("strong",{staticClass:"fed-title"},[e._v(e._s(s.title))]),e._v(" "),t("ul",{staticClass:"badges small inline"},["offline"===s.status?t("li",{staticClass:"badge red"},[e._v("offline")]):t("li",{staticClass:"badge green"},[e._v("online")])])])])})),0)]):e._e()}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/35.68b0e42d.js b/assets/js/36.1cf871d1.js similarity index 82% rename from assets/js/35.68b0e42d.js rename to assets/js/36.1cf871d1.js index a79f35447..5969a2cbf 100644 --- a/assets/js/35.68b0e42d.js +++ b/assets/js/36.1cf871d1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{198:function(e,t,a){},219:function(e,t,a){"use strict";a(198)},227:function(e,t,a){"use strict";a.r(t);var r=a(177),s={name:"ProcessParameter",components:{DeprecationNotice:()=>Promise.all([a.e(0),a.e(5)]).then(a.bind(null,484)),Description:()=>Promise.resolve().then(a.bind(null,462)),ExperimentalNotice:()=>Promise.all([a.e(0),a.e(6)]).then(a.bind(null,485)),JsonSchema:()=>Promise.all([a.e(0),a.e(32)]).then(a.bind(null,468))},mixins:[r.a],props:{parameter:{type:Object},processUrl:{type:String},...r.a.props},computed:{hasDefault(){return void 0!==this.parameter.default},defaultValue(){return JSON.stringify(this.parameter.default)}}},i=(a(219),a(4)),n=Object(i.a)(s,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component process-parameter"},[t("h4",[t("code",[e._v(e._s(e.parameter.name))]),e._v(" "),e.parameter.optional?e._e():t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]),e._v(" "),e.hasDefault?t("code",{staticClass:"default"},[e._v(" = "+e._s(e.defaultValue))]):e._e()]),e._v(" "),t("div",{staticClass:"details"},[e.parameter.description?t("Description",{attrs:{description:e.parameter.description,processUrl:e.processUrl}}):e._e(),e._v(" "),!0===e.parameter.deprecated?t("DeprecationNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),!0===e.parameter.experimental?t("ExperimentalNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),e.parameter["federation:backends"]?t("FederationNotice",{attrs:{backends:e.parameter["federation:backends"],federation:e.federation,entity:"parameter"}}):e._e(),e._v(" "),e.parameter.schema?t("div",{staticClass:"json-schema-container"},[t("JsonSchema",{attrs:{schema:e.parameter.schema,processUrl:e.processUrl}})],1):e._e()],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{198:function(e,t,a){},219:function(e,t,a){"use strict";a(198)},227:function(e,t,a){"use strict";a.r(t);var r=a(177),s={name:"ProcessParameter",components:{DeprecationNotice:()=>Promise.all([a.e(0),a.e(5)]).then(a.bind(null,486)),Description:()=>Promise.resolve().then(a.bind(null,464)),ExperimentalNotice:()=>Promise.all([a.e(0),a.e(6)]).then(a.bind(null,487)),JsonSchema:()=>Promise.all([a.e(0),a.e(33)]).then(a.bind(null,470))},mixins:[r.a],props:{parameter:{type:Object},processUrl:{type:String},...r.a.props},computed:{hasDefault(){return void 0!==this.parameter.default},defaultValue(){return JSON.stringify(this.parameter.default)}}},i=(a(219),a(4)),n=Object(i.a)(s,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component process-parameter"},[t("h4",[t("code",[e._v(e._s(e.parameter.name))]),e._v(" "),e.parameter.optional?e._e():t("strong",{staticClass:"required",attrs:{title:"required"}},[e._v("*")]),e._v(" "),e.hasDefault?t("code",{staticClass:"default"},[e._v(" = "+e._s(e.defaultValue))]):e._e()]),e._v(" "),t("div",{staticClass:"details"},[e.parameter.description?t("Description",{attrs:{description:e.parameter.description,processUrl:e.processUrl}}):e._e(),e._v(" "),!0===e.parameter.deprecated?t("DeprecationNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),!0===e.parameter.experimental?t("ExperimentalNotice",{attrs:{entity:"parameter"}}):e._e(),e._v(" "),e.parameter["federation:backends"]?t("FederationNotice",{attrs:{backends:e.parameter["federation:backends"],federation:e.federation,entity:"parameter"}}):e._e(),e._v(" "),e.parameter.schema?t("div",{staticClass:"json-schema-container"},[t("JsonSchema",{attrs:{schema:e.parameter.schema,processUrl:e.processUrl}})],1):e._e()],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/36.bc9a494e.js b/assets/js/37.4065f6dd.js similarity index 84% rename from assets/js/36.bc9a494e.js rename to assets/js/37.4065f6dd.js index eb1695d8f..1f93083cd 100644 --- a/assets/js/36.bc9a494e.js +++ b/assets/js/37.4065f6dd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{287:function(e,t,a){},459:function(e,t,a){"use strict";a(287)},486:function(e,t,a){"use strict";a.r(t);var s=a(157),l={name:"ParameterViewer",components:{Description:()=>Promise.resolve().then(a.bind(null,462)),ObjectTree:()=>Promise.all([a.e(0),a.e(33)]).then(a.bind(null,487))},props:{title:{type:String,default:"Parameters"},parameters:{type:Array,default:()=>[]},values:{type:Object,default:()=>({})},selectParameterName:{type:String,default:null},parent:{type:Object,default:null}},computed:{data(){return this.parameters.map(e=>{let t=this.values[e.name];return{name:e.name,classes:{highlight:e.name===this.selectParameterName},description:e.description,value:t,isObject:s.a.isObject(t)}})}},beforeCreate(){this.$options.components.ModelBuilder=a(461).default},mounted(){if(this.selectParameterName){let e=this.$el.querySelector("section.highlight");if(e){let t=Math.max(document.documentElement.scrollTop,document.body.scrollTop),a=Math.max(document.documentElement.scrollTop,document.body.scrollTop);e.scrollIntoView(),document.documentElement.scrollTop=document.body.scrollTop=t,document.documentElement.scrollLeft=document.body.scrollLeft=a}}}},r=(a(459),a(4)),o=Object(r.a)(l,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component parameter-viewer"},[t("header",[t("h2",[e._v(e._s(e.title))]),e._v(" "),t("button",{staticClass:"close",on:{click:function(t){return e.$emit("close")}}},[e._v("Close")])]),e._v(" "),0===e.data.length?t("p",[e._v("No parameters available.")]):e._l(e.data,(function(a){return t("section",{key:a.name,class:a.classes},[t("h3",[e._v(e._s(a.name))]),e._v(" "),a.isObject&&a.value.from_node?t("div",{staticClass:"externalData fromNode"},[t("em",[e._v("Output of "),t("tt",[e._v("#"+e._s(a.value.from_node))])],1)]):a.isObject&&a.value.from_parameter?t("div",{staticClass:"externalData fromArgument"},[t("em",[e._v("Value of process parameter "),t("tt",[e._v("#"+e._s(a.value.from_parameter))])],1)]):a.isObject&&a.value.process_graph?t("ModelBuilder",{attrs:{id:a.name,value:a.value,parent:e.parent,explicitZoom:!0}}):t("ObjectTree",{attrs:{data:a.value}}),e._v(" "),a.description?t("div",{staticClass:"description"},[t("i",{staticClass:"fas fa-info-circle"}),e._v(" "),t("Description",{attrs:{description:a.description,compact:!0}})],1):e._e()],1)}))],2)}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{288:function(e,t,a){},461:function(e,t,a){"use strict";a(288)},488:function(e,t,a){"use strict";a.r(t);var s=a(157),l={name:"ParameterViewer",components:{Description:()=>Promise.resolve().then(a.bind(null,464)),ObjectTree:()=>Promise.all([a.e(0),a.e(34)]).then(a.bind(null,489))},props:{title:{type:String,default:"Parameters"},parameters:{type:Array,default:()=>[]},values:{type:Object,default:()=>({})},selectParameterName:{type:String,default:null},parent:{type:Object,default:null}},computed:{data(){return this.parameters.map(e=>{let t=this.values[e.name];return{name:e.name,classes:{highlight:e.name===this.selectParameterName},description:e.description,value:t,isObject:s.a.isObject(t)}})}},beforeCreate(){this.$options.components.ModelBuilder=a(463).default},mounted(){if(this.selectParameterName){let e=this.$el.querySelector("section.highlight");if(e){let t=Math.max(document.documentElement.scrollTop,document.body.scrollTop),a=Math.max(document.documentElement.scrollTop,document.body.scrollTop);e.scrollIntoView(),document.documentElement.scrollTop=document.body.scrollTop=t,document.documentElement.scrollLeft=document.body.scrollLeft=a}}}},r=(a(461),a(4)),o=Object(r.a)(l,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"vue-component parameter-viewer"},[t("header",[t("h2",[e._v(e._s(e.title))]),e._v(" "),t("button",{staticClass:"close",on:{click:function(t){return e.$emit("close")}}},[e._v("Close")])]),e._v(" "),0===e.data.length?t("p",[e._v("No parameters available.")]):e._l(e.data,(function(a){return t("section",{key:a.name,class:a.classes},[t("h3",[e._v(e._s(a.name))]),e._v(" "),a.isObject&&a.value.from_node?t("div",{staticClass:"externalData fromNode"},[t("em",[e._v("Output of "),t("tt",[e._v("#"+e._s(a.value.from_node))])],1)]):a.isObject&&a.value.from_parameter?t("div",{staticClass:"externalData fromArgument"},[t("em",[e._v("Value of process parameter "),t("tt",[e._v("#"+e._s(a.value.from_parameter))])],1)]):a.isObject&&a.value.process_graph?t("ModelBuilder",{attrs:{id:a.name,value:a.value,parent:e.parent,explicitZoom:!0}}):t("ObjectTree",{attrs:{data:a.value}}),e._v(" "),a.description?t("div",{staticClass:"description"},[t("i",{staticClass:"fas fa-info-circle"}),e._v(" "),t("Description",{attrs:{description:a.description,compact:!0}})],1):e._e()],1)}))],2)}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/37.c5fb0e54.js b/assets/js/38.7a205f0f.js similarity index 98% rename from assets/js/37.c5fb0e54.js rename to assets/js/38.7a205f0f.js index c72a131d6..15e93f8df 100644 --- a/assets/js/37.c5fb0e54.js +++ b/assets/js/38.7a205f0f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{155:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return s})),e.d(n,"i",(function(){return o})),e.d(n,"f",(function(){return a})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return l})),e.d(n,"b",(function(){return f})),e.d(n,"e",(function(){return h})),e.d(n,"j",(function(){return p})),e.d(n,"k",(function(){return d})),e.d(n,"c",(function(){return g}));const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function a(t){return o.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function f(t){if(a(t))return t;const n=t.match(r),e=n?n[0]:"",i=u(t);return s.test(i)?t:i+".html"+e}function h(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return u(t.path)===u(n)}function p(t,n,e){if(a(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return p(e,n,r);if(Array.isArray(n))return Object.assign(p(e,n[0],r),{title:n[1]});{const s=n.children||[];return 0===s.length&&n.path?Object.assign(p(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,children:s.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function b(t){const n=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function g(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}},159:function(t,n,e){"use strict";e.r(n);var r=e(155),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=e(4),o=Object(s.a)(i,(function(){var t=this,n=t._self._c;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(n){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{155:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return s})),e.d(n,"i",(function(){return o})),e.d(n,"f",(function(){return a})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return l})),e.d(n,"b",(function(){return f})),e.d(n,"e",(function(){return h})),e.d(n,"j",(function(){return p})),e.d(n,"k",(function(){return d})),e.d(n,"c",(function(){return g}));const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function a(t){return o.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function f(t){if(a(t))return t;const n=t.match(r),e=n?n[0]:"",i=u(t);return s.test(i)?t:i+".html"+e}function h(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return u(t.path)===u(n)}function p(t,n,e){if(a(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return p(e,n,r);if(Array.isArray(n))return Object.assign(p(e,n[0],r),{title:n[1]});{const s=n.children||[];return 0===s.length&&n.path?Object.assign(p(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,children:s.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function b(t){const n=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function g(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}},159:function(t,n,e){"use strict";e.r(n);var r=e(155),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":""}},methods:{focusoutAction(){this.$emit("focusout")}}},s=e(4),o=Object(s.a)(i,(function(){var t=this,n=t._self._c;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(n){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/38.e56db234.js b/assets/js/39.c5838c60.js similarity index 93% rename from assets/js/38.e56db234.js rename to assets/js/39.c5838c60.js index 9206b3e33..f5d2a3c7a 100644 --- a/assets/js/38.e56db234.js +++ b/assets/js/39.c5838c60.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38,52],{164:function(e,t,r){"use strict";r.r(t);var s={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((e,t)=>{var r=this.$site.themeConfig.versions[this.versionIndex],s=this.$site.themeConfig.versions[t];return e.regularPath=this.$page.regularPath.replace(r.path,s.path),e}).filter((e,t)=>t!==this.versionIndex&&this.$site.pages.findIndex(t=>t.regularPath==e.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:e}=this.$site;var t=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(t)&&"string"==typeof t[1])for(var r in e.versions)if(e.versions[r].folder===t[1])return parseInt(r);return 0}}},n=r(4),i=Object(n.a)(s,void 0,void 0,!1,null,null,null);t.default=i.exports},477:function(e,t,r){"use strict";r.r(t);var s={name:"ApiSpec",mixins:[r(164).default],computed:{specUrl(){return"/documentation/"+this.version.folder+"/developers/api/openapi."+(this.version.apiFormat?this.version.apiFormat:"yaml")}},data:()=>({yOffset:0}),mounted(){this.yOffset=Math.round(document.querySelector("header").getBoundingClientRect().bottom);var e=document.createElement("script");e.src="https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js",document.getElementsByTagName("head")[0].appendChild(e)}},n=r(4),i=Object(n.a)(s,(function(){var e=this._self._c;return e("div",{staticClass:"apiSpec"},[e("redoc",{attrs:{"spec-url":this.specUrl,"path-in-middle-panel":"true","expand-responses":"200,201,202,203,204","scroll-y-offset":this.yOffset}})],1)}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[39,52],{164:function(e,t,r){"use strict";r.r(t);var s={computed:{unreleased(){return null!==this.version.apiTag.match(/(draft|alpha|beta)/i)},versioned(){return null!==this.$page.regularPath.match(/\/documentation\/([^\/]+)\//)},otherVersions(){return this.$site.themeConfig.versions.map((e,t)=>{var r=this.$site.themeConfig.versions[this.versionIndex],s=this.$site.themeConfig.versions[t];return e.regularPath=this.$page.regularPath.replace(r.path,s.path),e}).filter((e,t)=>t!==this.versionIndex&&this.$site.pages.findIndex(t=>t.regularPath==e.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:e}=this.$site;var t=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(t)&&"string"==typeof t[1])for(var r in e.versions)if(e.versions[r].folder===t[1])return parseInt(r);return 0}}},n=r(4),i=Object(n.a)(s,void 0,void 0,!1,null,null,null);t.default=i.exports},479:function(e,t,r){"use strict";r.r(t);var s={name:"ApiSpec",mixins:[r(164).default],computed:{specUrl(){return"/documentation/"+this.version.folder+"/developers/api/openapi."+(this.version.apiFormat?this.version.apiFormat:"yaml")}},data:()=>({yOffset:0}),mounted(){this.yOffset=Math.round(document.querySelector("header").getBoundingClientRect().bottom);var e=document.createElement("script");e.src="https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js",document.getElementsByTagName("head")[0].appendChild(e)}},n=r(4),i=Object(n.a)(s,(function(){var e=this._self._c;return e("div",{staticClass:"apiSpec"},[e("redoc",{attrs:{"spec-url":this.specUrl,"path-in-middle-panel":"true","expand-responses":"200,201,202,203,204","scroll-y-offset":this.yOffset}})],1)}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/4.04c82083.js b/assets/js/4.a2a8446f.js similarity index 73% rename from assets/js/4.04c82083.js rename to assets/js/4.a2a8446f.js index 314335963..57d0c7213 100644 --- a/assets/js/4.04c82083.js +++ b/assets/js/4.a2a8446f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{230:function(t,e,n){},298:function(t,e,n){"use strict";n(230)},488:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(298),n(4)),l=Object(p.a)(i,void 0,void 0,!1,null,"385f24c3",null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{230:function(t,e,n){},299:function(t,e,n){"use strict";n(230)},490:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(299),n(4)),l=Object(p.a)(i,void 0,void 0,!1,null,"385f24c3",null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/39.d4a9ff1e.js b/assets/js/40.6bb7c8ad.js similarity index 98% rename from assets/js/39.d4a9ff1e.js rename to assets/js/40.6bb7c8ad.js index 005264279..217d821b5 100644 --- a/assets/js/39.d4a9ff1e.js +++ b/assets/js/40.6bb7c8ad.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{213:function(t,e,r){t.exports=function(){"use strict";var t=6e4,e=36e5,r="millisecond",n="second",s="minute",i="hour",a="day",u="week",o="month",c="quarter",f="year",h="date",d="Invalid Date",l=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,$=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,m={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],r=t%100;return"["+t+(e[(r-20)%10]||e[r]||e[0])+"]"}},M=function(t,e,r){var n=String(t);return!n||n.length>=e?t:""+Array(e+1-n.length).join(r)+t},p={s:M,z:function(t){var e=-t.utcOffset(),r=Math.abs(e),n=Math.floor(r/60),s=r%60;return(e<=0?"+":"-")+M(n,2,"0")+":"+M(s,2,"0")},m:function t(e,r){if(e.date()1)return t(a[0])}else{var u=e.name;D[u]=e,s=u}return!n&&s&&(v=s),s||!n&&v},S=function(t,e){if(w(t))return t.clone();var r="object"==typeof e?e:{};return r.date=t,r.args=arguments,new O(r)},_=p;_.l=y,_.i=w,_.w=function(t,e){return S(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var O=function(){function m(t){this.$L=y(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[g]=!0}var M=m.prototype;return M.parse=function(t){this.$d=function(t){var e=t.date,r=t.utc;if(null===e)return new Date(NaN);if(_.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var n=e.match(l);if(n){var s=n[2]-1||0,i=(n[7]||"0").substring(0,3);return r?new Date(Date.UTC(n[1],s,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)):new Date(n[1],s,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)}}return new Date(e)}(t),this.init()},M.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},M.$utils=function(){return _},M.isValid=function(){return!(this.$d.toString()===d)},M.isSame=function(t,e){var r=S(t);return this.startOf(e)<=r&&r<=this.endOf(e)},M.isAfter=function(t,e){return S(t)({readMore:!1}),computed:{posts(){this.readMore=!1;let t=this.$site.pages.filter(t=>t.frontmatter.news).sort((t,e)=>new Date(e.frontmatter.date)-new Date(t.frontmatter.date)).map(t=>(t.frontmatter.dateFormatted=s()(t.frontmatter.date).format("MMMM D, YYYY"),t));return this.limit>0&&this.limit=e?t:""+Array(e+1-n.length).join(r)+t},p={s:M,z:function(t){var e=-t.utcOffset(),r=Math.abs(e),n=Math.floor(r/60),s=r%60;return(e<=0?"+":"-")+M(n,2,"0")+":"+M(s,2,"0")},m:function t(e,r){if(e.date()1)return t(a[0])}else{var u=e.name;D[u]=e,s=u}return!n&&s&&(v=s),s||!n&&v},S=function(t,e){if(w(t))return t.clone();var r="object"==typeof e?e:{};return r.date=t,r.args=arguments,new O(r)},_=p;_.l=y,_.i=w,_.w=function(t,e){return S(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var O=function(){function m(t){this.$L=y(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[g]=!0}var M=m.prototype;return M.parse=function(t){this.$d=function(t){var e=t.date,r=t.utc;if(null===e)return new Date(NaN);if(_.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var n=e.match(l);if(n){var s=n[2]-1||0,i=(n[7]||"0").substring(0,3);return r?new Date(Date.UTC(n[1],s,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)):new Date(n[1],s,n[3]||1,n[4]||0,n[5]||0,n[6]||0,i)}}return new Date(e)}(t),this.init()},M.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},M.$utils=function(){return _},M.isValid=function(){return!(this.$d.toString()===d)},M.isSame=function(t,e){var r=S(t);return this.startOf(e)<=r&&r<=this.endOf(e)},M.isAfter=function(t,e){return S(t)({readMore:!1}),computed:{posts(){this.readMore=!1;let t=this.$site.pages.filter(t=>t.frontmatter.news).sort((t,e)=>new Date(e.frontmatter.date)-new Date(t.frontmatter.date)).map(t=>(t.frontmatter.dateFormatted=s()(t.frontmatter.date).format("MMMM D, YYYY"),t));return this.limit>0&&this.limit{var t=this.$site.themeConfig.versions[this.versionIndex],i=this.$site.themeConfig.versions[s];return e.regularPath=this.$page.regularPath.replace(t.path,i.path),e}).filter((e,s)=>s!==this.versionIndex&&this.$site.pages.findIndex(s=>s.regularPath==e.regularPath)>=0)},version(){return this.$site.themeConfig.versions[this.versionIndex]},defaultVersion(){return this.$site.themeConfig.versions[this.$site.themeConfig.defaultVersion]},versionIndex(){const{themeConfig:e}=this.$site;var s=this.$page.regularPath.match(/\/documentation\/([^\/]+)\//);if(Array.isArray(s)&&"string"==typeof s[1])for(var t in e.versions)if(e.versions[t].folder===s[1])return parseInt(t);return 0}}},n=t(4),r=Object(n.a)(i,void 0,void 0,!1,null,null,null);s.default=r.exports},482:function(e,s,t){"use strict";t.r(s);var i={name:"ProcessesSpec",mixins:[t(164).default],components:{DocGen:()=>Promise.all([t.e(0),t.e(10)]).then(t.bind(null,474))},data:()=>({notice:"**Note:** This is the list of all processes specified by the openEO project. Back-ends implement a varying set of processes. Thus, the processes you can use at a specific back-end may derive from the specification, may include non-standardized processes and may not implement all processes listed here. Please check each back-end individually for the processes they support. The client libraries usually have a function called `listProcesses` or `list_processes` for that."}),computed:{documentUrl(){return"/documentation/"+this.version.folder+"/processes.json"}}},n=t(4),r=Object(n.a)(i,(function(){return(0,this._self._c)("DocGen",{attrs:{document:this.documentUrl,apiVersion:this.version.apiTag,notice:this.notice,showExperimentalByDefault:""}})}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/41.16c5be1b.js b/assets/js/41.1572ce9d.js similarity index 94% rename from assets/js/41.16c5be1b.js rename to assets/js/41.1572ce9d.js index 6062385ab..af420a7fc 100644 --- a/assets/js/41.16c5be1b.js +++ b/assets/js/41.1572ce9d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{300:function(e,t,a){e.exports=a.p+"assets/img/arch.e75ccb9a.png"},496:function(e,t,a){"use strict";a.r(t);var n=a(4),i=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("The openEO API defines a language how clients communicate to back-ends in order to analyze large Earth observation datasets. The API will be implemented by drivers for specific back-ends. Some first architecture considerations are listed below.")]),e._v(" "),t("ol",[t("li",[e._v("The openEO API is a contract between clients and back-ends that describes the communication only")]),e._v(" "),t("li",[e._v("Each back-end runs its own API instance including the specific back-end driver. There is no API instance that runs more than one driver.")]),e._v(" "),t("li",[e._v("Clients in R, Python, and JavaScript connect directly to the back-ends and communicate with the back-ends over "),t("em",[e._v("HTTPS")]),e._v(" according to the openEO API specification.")]),e._v(" "),t("li",[e._v("API instances can run on back-end servers or additional intermediate layers, which then communicate to back-ends in a back-end specific way.")]),e._v(" "),t("li",[e._v("Back-ends may add functionality and extend the API wherever there is need.")]),e._v(" "),t("li",[e._v("There will be a central back-end registry service (openEO Hub), to allow users to search for back-ends with specific functionality and or data.")]),e._v(" "),t("li",[e._v("The openEO API may define "),t("em",[e._v("profiles")]),e._v(" in order to group specific functionality.")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(300),alt:"Architecture - openEO API shown in dark blue"}})]),e._v(" "),t("h1",{attrs:{id:"microservices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#microservices"}},[e._v("#")]),e._v(" Microservices")]),e._v(" "),t("p",[e._v("To simplify and structure the development, the API is divided into a few microservices.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Microservice")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Capabilities")]),e._v(" "),t("td",[e._v("This microservice reports on the capabilities of the back-end, i.e. which API endpoints are implemented, which authentication methods are supported, and whether and how UDFs can be executed at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("EO Data Discovery")]),e._v(" "),t("td",[e._v("Describes which collections are available at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("Process Discovery")]),e._v(" "),t("td",[e._v("Provides services to find out which processes a back-end provides, i.e., what users can do with the available data.")])]),e._v(" "),t("tr",[t("td",[e._v("UDF")]),e._v(" "),t("td",[e._v("Discovery and execution of user-defined functions.")])]),e._v(" "),t("tr",[t("td",[e._v("Batch Job Management")]),e._v(" "),t("td",[e._v("Organizes and manages batch jobs that run processes on back-ends.")])]),e._v(" "),t("tr",[t("td",[e._v("File Management")]),e._v(" "),t("td",[e._v("Organizes and manages user-uploaded files.")])]),e._v(" "),t("tr",[t("td",[e._v("Process Graph Management")]),e._v(" "),t("td",[e._v("Organizes and manages user-defined process graphs.")])]),e._v(" "),t("tr",[t("td",[e._v("Secondary Services Management")]),e._v(" "),t("td",[e._v("External web services to access data and job results such as a OGC WMTS service.")])]),e._v(" "),t("tr",[t("td",[e._v("Account Management")]),e._v(" "),t("td",[e._v("User management, accounting and authentication.")])])])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{301:function(e,t,a){e.exports=a.p+"assets/img/arch.e75ccb9a.png"},499:function(e,t,a){"use strict";a.r(t);var n=a(4),i=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("The openEO API defines a language how clients communicate to back-ends in order to analyze large Earth observation datasets. The API will be implemented by drivers for specific back-ends. Some first architecture considerations are listed below.")]),e._v(" "),t("ol",[t("li",[e._v("The openEO API is a contract between clients and back-ends that describes the communication only")]),e._v(" "),t("li",[e._v("Each back-end runs its own API instance including the specific back-end driver. There is no API instance that runs more than one driver.")]),e._v(" "),t("li",[e._v("Clients in R, Python, and JavaScript connect directly to the back-ends and communicate with the back-ends over "),t("em",[e._v("HTTPS")]),e._v(" according to the openEO API specification.")]),e._v(" "),t("li",[e._v("API instances can run on back-end servers or additional intermediate layers, which then communicate to back-ends in a back-end specific way.")]),e._v(" "),t("li",[e._v("Back-ends may add functionality and extend the API wherever there is need.")]),e._v(" "),t("li",[e._v("There will be a central back-end registry service (openEO Hub), to allow users to search for back-ends with specific functionality and or data.")]),e._v(" "),t("li",[e._v("The openEO API may define "),t("em",[e._v("profiles")]),e._v(" in order to group specific functionality.")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(301),alt:"Architecture - openEO API shown in dark blue"}})]),e._v(" "),t("h1",{attrs:{id:"microservices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#microservices"}},[e._v("#")]),e._v(" Microservices")]),e._v(" "),t("p",[e._v("To simplify and structure the development, the API is divided into a few microservices.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Microservice")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Capabilities")]),e._v(" "),t("td",[e._v("This microservice reports on the capabilities of the back-end, i.e. which API endpoints are implemented, which authentication methods are supported, and whether and how UDFs can be executed at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("EO Data Discovery")]),e._v(" "),t("td",[e._v("Describes which collections are available at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("Process Discovery")]),e._v(" "),t("td",[e._v("Provides services to find out which processes a back-end provides, i.e., what users can do with the available data.")])]),e._v(" "),t("tr",[t("td",[e._v("UDF")]),e._v(" "),t("td",[e._v("Discovery and execution of user-defined functions.")])]),e._v(" "),t("tr",[t("td",[e._v("Batch Job Management")]),e._v(" "),t("td",[e._v("Organizes and manages batch jobs that run processes on back-ends.")])]),e._v(" "),t("tr",[t("td",[e._v("File Management")]),e._v(" "),t("td",[e._v("Organizes and manages user-uploaded files.")])]),e._v(" "),t("tr",[t("td",[e._v("Process Graph Management")]),e._v(" "),t("td",[e._v("Organizes and manages user-defined process graphs.")])]),e._v(" "),t("tr",[t("td",[e._v("Secondary Services Management")]),e._v(" "),t("td",[e._v("External web services to access data and job results such as a OGC WMTS service.")])]),e._v(" "),t("tr",[t("td",[e._v("Account Management")]),e._v(" "),t("td",[e._v("User management, accounting and authentication.")])])])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/42.015e2dfc.js b/assets/js/42.3d6af854.js similarity index 98% rename from assets/js/42.015e2dfc.js rename to assets/js/42.3d6af854.js index a5eb77854..41d4236aa 100644 --- a/assets/js/42.015e2dfc.js +++ b/assets/js/42.3d6af854.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{301:function(e,a,t){e.exports=t.p+"assets/img/datacube-example.bab870f7.png"},505:function(e,a,t){"use strict";t.r(a);var s=t(4),o=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"glossary"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#glossary"}},[e._v("#")]),e._v(" Glossary")]),e._v(" "),a("p",[e._v("This glossary introduces the major technical terms used in the openEO project.")]),e._v(" "),a("h2",{attrs:{id:"general-terms"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general-terms"}},[e._v("#")]),e._v(" General terms")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("EO")]),e._v(": Earth observation")]),e._v(" "),a("li",[a("strong",[e._v("API")]),e._v(": application programming interface ("),a("a",{attrs:{href:"https://en.wikipedia.org/wiki/Application_programming_interface",target:"_blank",rel:"noopener noreferrer"}},[e._v("wikipedia"),a("OutboundLink")],1),e._v("); a communication protocol between client and back-end")]),e._v(" "),a("li",[a("strong",[e._v("client")]),e._v(": software tool or environment that end-users directly interact with, e.g. R (RStudio), Python (Jupyter notebook), and JavaScript (web browser); R and Python are two major data science platforms; JavaScript is a major language for web development")]),e._v(" "),a("li",[a("strong",[e._v("(cloud) back-end")]),e._v(": server; computer infrastructure (one or more physical computers or virtual machines) used for storing EO data and processing it")]),e._v(" "),a("li",[a("strong",[e._v("big Earth observation cloud back-end")]),e._v(": server infrastructure where industry and researchers analyse large amounts of EO data")])]),e._v(" "),a("h2",{attrs:{id:"processes-and-process-graphs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#processes-and-process-graphs"}},[e._v("#")]),e._v(" Processes and process graphs")]),e._v(" "),a("p",[e._v("The terms "),a("em",[e._v("process")]),e._v(" and "),a("em",[e._v("process graph")]),e._v(" have specific meanings in the openEO API specification.")]),e._v(" "),a("p",[e._v("A "),a("strong",[e._v("process")]),e._v(" is an operation provided by the back end that performs a specific task on a set of parameters and returns a result. An example is computing a statistical operation, such as mean or median, on selected EO data. A process is similar to a function or method in programming languages.")]),e._v(" "),a("p",[e._v("A "),a("strong",[e._v("process graph")]),e._v(" chains specific process calls together. Similarly to scripts in the context of programming, process graphs organize and automate the execution of one or more processes that could alternatively be executed individually. In a process graph, processes need to be specific, i.e. concrete values for input parameters need to be specified. These arguments can again be process graphs, scalar values, arrays or objects.")]),e._v(" "),a("h2",{attrs:{id:"eo-data-collections"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#eo-data-collections"}},[e._v("#")]),e._v(" EO data (Collections)")]),e._v(" "),a("p",[e._v("In our domain, different terms are used to describe EO data(sets). Within openEO, a "),a("strong",[e._v("granule")]),e._v(" (sometimes also called "),a("em",[e._v("item")]),e._v(" or "),a("em",[e._v("asset")]),e._v(" in the specification) typically refers to a limited area and a single overpass leading to a very short observation period (seconds) or a temporal aggregation of such data (e.g. for 16-day MODIS composites). A "),a("strong",[e._v("collection")]),e._v(" is a sequence of granules sharing the same product specification. It typically corresponds to the series of products derived from data acquired by a sensor on board a satellite and having the same mode of operation.")]),e._v(" "),a("p",[e._v("The "),a("a",{attrs:{href:"http://ceos.org/ourwork/workinggroups/wgiss/access/opensearch/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS OpenSearch Best Practice Document v1.2"),a("OutboundLink")],1),e._v(" lists the following synonyms used by other organizations:")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("granule")]),e._v(": dataset (ESA, ISO 19115), granule (NASA), product (ESA, CNES), scene (JAXA)")]),e._v(" "),a("li",[a("strong",[e._v("collection")]),e._v(": dataset series (ESA, ISO 19115), collection (CNES, NASA), dataset (JAXA), product (JAXA)")])]),e._v(" "),a("p",[e._v("In openEO, a back-end offers a set of collections to be processed. All collections can be requested using a client and are described using the "),a("a",{attrs:{href:"https://github.com/radiantearth/stac-spec",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC (SpatioTemporal Asset Catalog) metadata specification"),a("OutboundLink")],1),e._v(" as STAC collections. A user can load (a subset of) a collection using a special process, which returns a (spatial) data cube. All further processing is then applied to the data cube on the back-end.")]),e._v(" "),a("h2",{attrs:{id:"spatial-data-cubes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spatial-data-cubes"}},[e._v("#")]),e._v(" Spatial data cubes")]),e._v(" "),a("p",[e._v("A "),a("em",[e._v("spatiotemporal")]),e._v(" data cube is a multidimensional array with one or more spatial or temporal dimensions.\nIn the EO domain, it is common to be implicit about the temporal dimension and just refer to them as "),a("em",[e._v("spatial")]),e._v(" data cubes in short.\nSpecial cases are raster and vector data cubes.")]),e._v(" "),a("p",[e._v("The figure below shows the data of\na four-dimensional (8 x 8 x 2 x 2) raster data cube, with dimension names\nand values:")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("#")]),e._v(" "),a("th",[e._v("dimension name")]),e._v(" "),a("th",[e._v("dimension values")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("1")]),e._v(" "),a("td",[e._v("x")]),e._v(" "),a("td",[e._v("288790.5, 288819, 288847.5, 288876, 288904.5, 288933, 288961.5, 288990")])]),e._v(" "),a("tr",[a("td",[e._v("2")]),e._v(" "),a("td",[e._v("y")]),e._v(" "),a("td",[e._v("9120747, 9120718, 9120690, 9120661, 9120633, 9120604, 9120576, 9120547")])]),e._v(" "),a("tr",[a("td",[e._v("3")]),e._v(" "),a("td",[e._v("band")]),e._v(" "),a("td",[a("code",[e._v("red")]),e._v(", "),a("code",[e._v("green")])])]),e._v(" "),a("tr",[a("td",[e._v("4")]),e._v(" "),a("td",[e._v("time")]),e._v(" "),a("td",[a("code",[e._v("2018-02-10")]),e._v(", "),a("code",[e._v("2018-02-17")])])])])]),e._v(" "),a("p",[e._v("dimensions x and time are aligned along the x-axis; y and band are aligned along the y-axis.")]),e._v(" "),a("p",[a("img",{attrs:{src:t(301),alt:"Data cube example"}})]),e._v(" "),a("p",[e._v("Data cubes as defined here have a "),a("em",[e._v("single value")]),e._v(" (scalar) for each\nunique combination of dimension values. The value pointed to by\narrows corresponds to the combination of x=288847.5 (red arrow),\ny=9120661 (yellow arrow), band=red (blue arrow), time=2018-02-17 (green arrow),\nand its value is 84 (brown arrow).")]),e._v(" "),a("p",[e._v("If the data concerns grayscale imagery, we could call this "),a("em",[e._v("single")]),e._v("\nvalue a "),a("em",[e._v("pixel value")]),e._v(". One should keep in mind that it is "),a("em",[e._v("never")]),e._v("\na tuple of, say, "),a("code",[e._v("{red, green, blue}")]),e._v(' values. "Cell value of a\nsingle raster layer" would be a better analogy; '),a("em",[e._v("data cube cell\nvalue")]),e._v(" may be a good compromise.")]),e._v(" "),a("p",[e._v("A data cube stores some additional properties per dimension such as:")]),e._v(" "),a("ul",[a("li",[e._v("name")]),e._v(" "),a("li",[e._v("axis / number")]),e._v(" "),a("li",[e._v("type")]),e._v(" "),a("li",[e._v("extents "),a("em",[e._v("or")]),e._v(" nominal dimension values")]),e._v(" "),a("li",[e._v("reference systems / projections")]),e._v(" "),a("li",[e._v("resolutions")])]),e._v(" "),a("p",[e._v("Having these properties available allows to easily resample from one data cube to another for example.")]),e._v(" "),a("h3",{attrs:{id:"apply-processes-that-do-not-change-dimensions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#apply-processes-that-do-not-change-dimensions"}},[e._v("#")]),e._v(" "),a("code",[e._v("apply")]),e._v(": processes that do not change dimensions")]),e._v(" "),a("p",[e._v("Math process that does not reduce or change anything to the array\ndimensions. The process "),a("code",[e._v("apply")]),e._v(" can be used to apply unary functions\nsuch as "),a("code",[e._v("abs")]),e._v(" or "),a("code",[e._v("sqrt")]),e._v(" to all values in a data cube.")]),e._v(" "),a("p",[e._v("The process "),a("code",[e._v("apply_dimension")]),e._v(" applies (maps) an n-ary function to a particular\ndimension. An example along the time dimension is to apply a moving\naverage filter to implement temporal smoothing.\nAn example of "),a("code",[e._v("apply_dimension")]),e._v(" to the spatial dimensions\nis to do a historgram stretch for every spatial (grayscale) image\nof an image time series.")]),e._v(" "),a("h3",{attrs:{id:"filter-subsetting-dimensions-by-dimension-value-selection"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filter-subsetting-dimensions-by-dimension-value-selection"}},[e._v("#")]),e._v(" "),a("code",[e._v("filter")]),e._v(": subsetting dimensions by dimension value selection")]),e._v(" "),a("p",[e._v("The "),a("code",[e._v("filter")]),e._v(" process makes a cube smaller by selecting specific\nvalue ranges for a particular dimension.")]),e._v(" "),a("p",[e._v("Examples:")]),e._v(" "),a("ul",[a("li",[e._v("a band filter that selects the "),a("code",[e._v("red")]),e._v(" band")]),e._v(" "),a("li",[e._v('a bounding box filter "crops" the collection to a spatial extent')])]),e._v(" "),a("h3",{attrs:{id:"reduce-removing-dimensions-entirely-by-computation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reduce-removing-dimensions-entirely-by-computation"}},[e._v("#")]),e._v(" "),a("code",[e._v("reduce")]),e._v(": removing dimensions entirely by computation")]),e._v(" "),a("p",[e._v("The "),a("code",[e._v("reduce")]),e._v(' process removes a dimension by "rolling up" or summarizing\nthe values along that dimension to a single value.\nFor example: eliminate the time dimension by taking the '),a("code",[e._v("mean")]),e._v(" along that dimension.\nAnother example is taking the "),a("code",[e._v("sum")]),e._v(" or "),a("code",[e._v("max")]),e._v(" along the band dimension.")]),e._v(" "),a("h3",{attrs:{id:"aggregate-reducing-resolution"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#aggregate-reducing-resolution"}},[e._v("#")]),e._v(" "),a("code",[e._v("aggregate")]),e._v(": reducing resolution")]),e._v(" "),a("p",[e._v("Aggregation computes new values from sets of values that are "),a("em",[e._v("uniquely")]),e._v(" assigned to groups. It involves a grouping predicate (e.g. monthly, 100 m x 100 m grid cells, or a set of non-overlapping spatial polygons), and an reducer (e.g., "),a("code",[e._v("mean")]),e._v(") that computes one or more new values from the original ones.")]),e._v(" "),a("p",[e._v("In effect, "),a("code",[e._v("aggregate")]),e._v(" combines the following three steps:")]),e._v(" "),a("ul",[a("li",[a("em",[e._v("split")]),e._v(" the data cube in groups, based on dimension constraints (time intervals, band groups, spatial polygons)")]),e._v(" "),a("li",[a("em",[e._v("apply")]),e._v(" a reducer to each group (similar to the "),a("code",[e._v("reduce")]),e._v(" process, but reducing a group rather than an entire dimension)")]),e._v(" "),a("li",[a("em",[e._v("combine")]),e._v(" the result to a new data cube, with some dimensions having reduced resolution (or e.g. raster to vector converted)")])]),e._v(" "),a("p",[e._v("Examples:")]),e._v(" "),a("ul",[a("li",[e._v("a weekly time series may be aggregated to monthly values by computing the "),a("code",[e._v("mean")]),e._v(" for all values in a month (grouping predicate: months)")]),e._v(" "),a("li",[a("em",[e._v("spatial")]),e._v(" aggregation involves computing e.g. "),a("em",[e._v("mean")]),e._v(" pixel values on a 100 x 100 m grid, from 10 m x 10 m pixels, where each original pixel is assigned uniquely to a larger pixel (grouping predicate: 100 m x 100 m grid cells)")])]),e._v(" "),a("h3",{attrs:{id:"resample-changing-data-cube-geometry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#resample-changing-data-cube-geometry"}},[e._v("#")]),e._v(" "),a("code",[e._v("resample")]),e._v(": changing data cube geometry")]),e._v(" "),a("p",[e._v("Resampling considers the case where we have data at one resolution and coordinate reference system, and need values at another. In case we have values at a 100 m x 100 m grid and need values at a 10 m x 10 m grid, the original values will be reused many times, and may be simply assigned to the nearest high resolution grid cells (nearest neighbor method), or may be interpolated using various methods (e.g. by bilinear interpolation). This is often called "),a("em",[e._v("upsampling")]),e._v(" or "),a("em",[e._v("upscaling")]),e._v(".")]),e._v(" "),a("p",[e._v("Resampling from finer to coarser grid is a special case of aggregation often called "),a("em",[e._v("downsampling")]),e._v(" or "),a("em",[e._v("downscaling")]),e._v(".")]),e._v(" "),a("p",[e._v("When the target grid or time series has a lower resolution (larger grid cells) or lower frequency (longer time intervals) than the source grid, aggregation might be used for resampling. For example, if the resolutions are similar, (e.g. the source collection provides 10 day intervals and the target needs values for 16 day intervals), then some form of interpolation may be more appropriate than aggregation as defined here.")]),e._v(" "),a("h2",{attrs:{id:"user-defined-function-udf"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-function-udf"}},[e._v("#")]),e._v(" User-defined function (UDF)")]),e._v(" "),a("p",[e._v("The abbreviation "),a("strong",[e._v("UDF")]),e._v(" stands for "),a("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, or applied to a particular dimension or set of dimensions, allowing custom server-side calculations. See the section on "),a("RouterLink",{attrs:{to:"/documentation/0.4/udfs.html"}},[e._v("UDFs")]),e._v(" for more information.")],1),e._v(" "),a("h2",{attrs:{id:"data-processing-modes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-processing-modes"}},[e._v("#")]),e._v(" Data Processing modes")]),e._v(" "),a("p",[e._v("Process graphs can be processed in three different ways:")]),e._v(" "),a("ol",[a("li",[e._v("Results can be pre-computed by creating a "),a("em",[a("strong",[e._v("batch job")])]),e._v(" using "),a("code",[e._v("POST /jobs")]),e._v(". They are submitted to the back-end's processing system, but will remain inactive until "),a("code",[e._v("POST /jobs/{job_id}/results")]),e._v(" has been called. They will run only once and store results after execution. Results can be downloaded. Batch jobs are typically time consuming and user interaction is not possible. This is the only mode that allows to get an estimate about time, volume and costs beforehand.")]),e._v(" "),a("li",[e._v("A more dynamic way of processing and accessing data is to create a "),a("strong",[e._v("secondary web service")]),e._v(". They allow web-based access using different protocols such as "),a("a",{attrs:{href:"http://www.opengeospatial.org/standards/wms",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WMS"),a("OutboundLink")],1),e._v(" (Open Geospatial Consortium Web Map Service), "),a("a",{attrs:{href:"http://www.opengeospatial.org/standards/wcs",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WCS"),a("OutboundLink")],1),e._v(" (Web Coverage Service) or "),a("a",{attrs:{href:"https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames",target:"_blank",rel:"noopener noreferrer"}},[e._v("XYZ tiles"),a("OutboundLink")],1),e._v(". These protocols usually allow users to change the viewing extent or level of detail (zoom level). Therefore, computations often run "),a("em",[e._v("on demand")]),e._v(" so that the requested data is calculated during the request. Back-ends should make sure to cache processed data to avoid additional/high costs and reduce waiting times for the user.")]),e._v(" "),a("li",[e._v("Process graphs can also be executed "),a("strong",[e._v("on-demand")]),e._v(" (i.e. synchronously) by sending the process graph to "),a("code",[e._v("POST /result")]),e._v(". Results are delivered with the request itself and no job is created. Only lightweight computations, for example small previews, should be executed using this approach as timeouts are to be expected for "),a("a",{attrs:{href:"https://www.pubnub.com/blog/2014-12-01-http-long-polling/",target:"_blank",rel:"noopener noreferrer"}},[e._v("long-polling HTTP requests"),a("OutboundLink")],1),e._v(".")])])])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{302:function(e,a,t){e.exports=t.p+"assets/img/datacube-example.bab870f7.png"},507:function(e,a,t){"use strict";t.r(a);var s=t(4),o=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"glossary"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#glossary"}},[e._v("#")]),e._v(" Glossary")]),e._v(" "),a("p",[e._v("This glossary introduces the major technical terms used in the openEO project.")]),e._v(" "),a("h2",{attrs:{id:"general-terms"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general-terms"}},[e._v("#")]),e._v(" General terms")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("EO")]),e._v(": Earth observation")]),e._v(" "),a("li",[a("strong",[e._v("API")]),e._v(": application programming interface ("),a("a",{attrs:{href:"https://en.wikipedia.org/wiki/Application_programming_interface",target:"_blank",rel:"noopener noreferrer"}},[e._v("wikipedia"),a("OutboundLink")],1),e._v("); a communication protocol between client and back-end")]),e._v(" "),a("li",[a("strong",[e._v("client")]),e._v(": software tool or environment that end-users directly interact with, e.g. R (RStudio), Python (Jupyter notebook), and JavaScript (web browser); R and Python are two major data science platforms; JavaScript is a major language for web development")]),e._v(" "),a("li",[a("strong",[e._v("(cloud) back-end")]),e._v(": server; computer infrastructure (one or more physical computers or virtual machines) used for storing EO data and processing it")]),e._v(" "),a("li",[a("strong",[e._v("big Earth observation cloud back-end")]),e._v(": server infrastructure where industry and researchers analyse large amounts of EO data")])]),e._v(" "),a("h2",{attrs:{id:"processes-and-process-graphs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#processes-and-process-graphs"}},[e._v("#")]),e._v(" Processes and process graphs")]),e._v(" "),a("p",[e._v("The terms "),a("em",[e._v("process")]),e._v(" and "),a("em",[e._v("process graph")]),e._v(" have specific meanings in the openEO API specification.")]),e._v(" "),a("p",[e._v("A "),a("strong",[e._v("process")]),e._v(" is an operation provided by the back end that performs a specific task on a set of parameters and returns a result. An example is computing a statistical operation, such as mean or median, on selected EO data. A process is similar to a function or method in programming languages.")]),e._v(" "),a("p",[e._v("A "),a("strong",[e._v("process graph")]),e._v(" chains specific process calls together. Similarly to scripts in the context of programming, process graphs organize and automate the execution of one or more processes that could alternatively be executed individually. In a process graph, processes need to be specific, i.e. concrete values for input parameters need to be specified. These arguments can again be process graphs, scalar values, arrays or objects.")]),e._v(" "),a("h2",{attrs:{id:"eo-data-collections"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#eo-data-collections"}},[e._v("#")]),e._v(" EO data (Collections)")]),e._v(" "),a("p",[e._v("In our domain, different terms are used to describe EO data(sets). Within openEO, a "),a("strong",[e._v("granule")]),e._v(" (sometimes also called "),a("em",[e._v("item")]),e._v(" or "),a("em",[e._v("asset")]),e._v(" in the specification) typically refers to a limited area and a single overpass leading to a very short observation period (seconds) or a temporal aggregation of such data (e.g. for 16-day MODIS composites). A "),a("strong",[e._v("collection")]),e._v(" is a sequence of granules sharing the same product specification. It typically corresponds to the series of products derived from data acquired by a sensor on board a satellite and having the same mode of operation.")]),e._v(" "),a("p",[e._v("The "),a("a",{attrs:{href:"http://ceos.org/ourwork/workinggroups/wgiss/access/opensearch/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS OpenSearch Best Practice Document v1.2"),a("OutboundLink")],1),e._v(" lists the following synonyms used by other organizations:")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("granule")]),e._v(": dataset (ESA, ISO 19115), granule (NASA), product (ESA, CNES), scene (JAXA)")]),e._v(" "),a("li",[a("strong",[e._v("collection")]),e._v(": dataset series (ESA, ISO 19115), collection (CNES, NASA), dataset (JAXA), product (JAXA)")])]),e._v(" "),a("p",[e._v("In openEO, a back-end offers a set of collections to be processed. All collections can be requested using a client and are described using the "),a("a",{attrs:{href:"https://github.com/radiantearth/stac-spec",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC (SpatioTemporal Asset Catalog) metadata specification"),a("OutboundLink")],1),e._v(" as STAC collections. A user can load (a subset of) a collection using a special process, which returns a (spatial) data cube. All further processing is then applied to the data cube on the back-end.")]),e._v(" "),a("h2",{attrs:{id:"spatial-data-cubes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spatial-data-cubes"}},[e._v("#")]),e._v(" Spatial data cubes")]),e._v(" "),a("p",[e._v("A "),a("em",[e._v("spatiotemporal")]),e._v(" data cube is a multidimensional array with one or more spatial or temporal dimensions.\nIn the EO domain, it is common to be implicit about the temporal dimension and just refer to them as "),a("em",[e._v("spatial")]),e._v(" data cubes in short.\nSpecial cases are raster and vector data cubes.")]),e._v(" "),a("p",[e._v("The figure below shows the data of\na four-dimensional (8 x 8 x 2 x 2) raster data cube, with dimension names\nand values:")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("#")]),e._v(" "),a("th",[e._v("dimension name")]),e._v(" "),a("th",[e._v("dimension values")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("1")]),e._v(" "),a("td",[e._v("x")]),e._v(" "),a("td",[e._v("288790.5, 288819, 288847.5, 288876, 288904.5, 288933, 288961.5, 288990")])]),e._v(" "),a("tr",[a("td",[e._v("2")]),e._v(" "),a("td",[e._v("y")]),e._v(" "),a("td",[e._v("9120747, 9120718, 9120690, 9120661, 9120633, 9120604, 9120576, 9120547")])]),e._v(" "),a("tr",[a("td",[e._v("3")]),e._v(" "),a("td",[e._v("band")]),e._v(" "),a("td",[a("code",[e._v("red")]),e._v(", "),a("code",[e._v("green")])])]),e._v(" "),a("tr",[a("td",[e._v("4")]),e._v(" "),a("td",[e._v("time")]),e._v(" "),a("td",[a("code",[e._v("2018-02-10")]),e._v(", "),a("code",[e._v("2018-02-17")])])])])]),e._v(" "),a("p",[e._v("dimensions x and time are aligned along the x-axis; y and band are aligned along the y-axis.")]),e._v(" "),a("p",[a("img",{attrs:{src:t(302),alt:"Data cube example"}})]),e._v(" "),a("p",[e._v("Data cubes as defined here have a "),a("em",[e._v("single value")]),e._v(" (scalar) for each\nunique combination of dimension values. The value pointed to by\narrows corresponds to the combination of x=288847.5 (red arrow),\ny=9120661 (yellow arrow), band=red (blue arrow), time=2018-02-17 (green arrow),\nand its value is 84 (brown arrow).")]),e._v(" "),a("p",[e._v("If the data concerns grayscale imagery, we could call this "),a("em",[e._v("single")]),e._v("\nvalue a "),a("em",[e._v("pixel value")]),e._v(". One should keep in mind that it is "),a("em",[e._v("never")]),e._v("\na tuple of, say, "),a("code",[e._v("{red, green, blue}")]),e._v(' values. "Cell value of a\nsingle raster layer" would be a better analogy; '),a("em",[e._v("data cube cell\nvalue")]),e._v(" may be a good compromise.")]),e._v(" "),a("p",[e._v("A data cube stores some additional properties per dimension such as:")]),e._v(" "),a("ul",[a("li",[e._v("name")]),e._v(" "),a("li",[e._v("axis / number")]),e._v(" "),a("li",[e._v("type")]),e._v(" "),a("li",[e._v("extents "),a("em",[e._v("or")]),e._v(" nominal dimension values")]),e._v(" "),a("li",[e._v("reference systems / projections")]),e._v(" "),a("li",[e._v("resolutions")])]),e._v(" "),a("p",[e._v("Having these properties available allows to easily resample from one data cube to another for example.")]),e._v(" "),a("h3",{attrs:{id:"apply-processes-that-do-not-change-dimensions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#apply-processes-that-do-not-change-dimensions"}},[e._v("#")]),e._v(" "),a("code",[e._v("apply")]),e._v(": processes that do not change dimensions")]),e._v(" "),a("p",[e._v("Math process that does not reduce or change anything to the array\ndimensions. The process "),a("code",[e._v("apply")]),e._v(" can be used to apply unary functions\nsuch as "),a("code",[e._v("abs")]),e._v(" or "),a("code",[e._v("sqrt")]),e._v(" to all values in a data cube.")]),e._v(" "),a("p",[e._v("The process "),a("code",[e._v("apply_dimension")]),e._v(" applies (maps) an n-ary function to a particular\ndimension. An example along the time dimension is to apply a moving\naverage filter to implement temporal smoothing.\nAn example of "),a("code",[e._v("apply_dimension")]),e._v(" to the spatial dimensions\nis to do a historgram stretch for every spatial (grayscale) image\nof an image time series.")]),e._v(" "),a("h3",{attrs:{id:"filter-subsetting-dimensions-by-dimension-value-selection"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#filter-subsetting-dimensions-by-dimension-value-selection"}},[e._v("#")]),e._v(" "),a("code",[e._v("filter")]),e._v(": subsetting dimensions by dimension value selection")]),e._v(" "),a("p",[e._v("The "),a("code",[e._v("filter")]),e._v(" process makes a cube smaller by selecting specific\nvalue ranges for a particular dimension.")]),e._v(" "),a("p",[e._v("Examples:")]),e._v(" "),a("ul",[a("li",[e._v("a band filter that selects the "),a("code",[e._v("red")]),e._v(" band")]),e._v(" "),a("li",[e._v('a bounding box filter "crops" the collection to a spatial extent')])]),e._v(" "),a("h3",{attrs:{id:"reduce-removing-dimensions-entirely-by-computation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reduce-removing-dimensions-entirely-by-computation"}},[e._v("#")]),e._v(" "),a("code",[e._v("reduce")]),e._v(": removing dimensions entirely by computation")]),e._v(" "),a("p",[e._v("The "),a("code",[e._v("reduce")]),e._v(' process removes a dimension by "rolling up" or summarizing\nthe values along that dimension to a single value.\nFor example: eliminate the time dimension by taking the '),a("code",[e._v("mean")]),e._v(" along that dimension.\nAnother example is taking the "),a("code",[e._v("sum")]),e._v(" or "),a("code",[e._v("max")]),e._v(" along the band dimension.")]),e._v(" "),a("h3",{attrs:{id:"aggregate-reducing-resolution"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#aggregate-reducing-resolution"}},[e._v("#")]),e._v(" "),a("code",[e._v("aggregate")]),e._v(": reducing resolution")]),e._v(" "),a("p",[e._v("Aggregation computes new values from sets of values that are "),a("em",[e._v("uniquely")]),e._v(" assigned to groups. It involves a grouping predicate (e.g. monthly, 100 m x 100 m grid cells, or a set of non-overlapping spatial polygons), and an reducer (e.g., "),a("code",[e._v("mean")]),e._v(") that computes one or more new values from the original ones.")]),e._v(" "),a("p",[e._v("In effect, "),a("code",[e._v("aggregate")]),e._v(" combines the following three steps:")]),e._v(" "),a("ul",[a("li",[a("em",[e._v("split")]),e._v(" the data cube in groups, based on dimension constraints (time intervals, band groups, spatial polygons)")]),e._v(" "),a("li",[a("em",[e._v("apply")]),e._v(" a reducer to each group (similar to the "),a("code",[e._v("reduce")]),e._v(" process, but reducing a group rather than an entire dimension)")]),e._v(" "),a("li",[a("em",[e._v("combine")]),e._v(" the result to a new data cube, with some dimensions having reduced resolution (or e.g. raster to vector converted)")])]),e._v(" "),a("p",[e._v("Examples:")]),e._v(" "),a("ul",[a("li",[e._v("a weekly time series may be aggregated to monthly values by computing the "),a("code",[e._v("mean")]),e._v(" for all values in a month (grouping predicate: months)")]),e._v(" "),a("li",[a("em",[e._v("spatial")]),e._v(" aggregation involves computing e.g. "),a("em",[e._v("mean")]),e._v(" pixel values on a 100 x 100 m grid, from 10 m x 10 m pixels, where each original pixel is assigned uniquely to a larger pixel (grouping predicate: 100 m x 100 m grid cells)")])]),e._v(" "),a("h3",{attrs:{id:"resample-changing-data-cube-geometry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#resample-changing-data-cube-geometry"}},[e._v("#")]),e._v(" "),a("code",[e._v("resample")]),e._v(": changing data cube geometry")]),e._v(" "),a("p",[e._v("Resampling considers the case where we have data at one resolution and coordinate reference system, and need values at another. In case we have values at a 100 m x 100 m grid and need values at a 10 m x 10 m grid, the original values will be reused many times, and may be simply assigned to the nearest high resolution grid cells (nearest neighbor method), or may be interpolated using various methods (e.g. by bilinear interpolation). This is often called "),a("em",[e._v("upsampling")]),e._v(" or "),a("em",[e._v("upscaling")]),e._v(".")]),e._v(" "),a("p",[e._v("Resampling from finer to coarser grid is a special case of aggregation often called "),a("em",[e._v("downsampling")]),e._v(" or "),a("em",[e._v("downscaling")]),e._v(".")]),e._v(" "),a("p",[e._v("When the target grid or time series has a lower resolution (larger grid cells) or lower frequency (longer time intervals) than the source grid, aggregation might be used for resampling. For example, if the resolutions are similar, (e.g. the source collection provides 10 day intervals and the target needs values for 16 day intervals), then some form of interpolation may be more appropriate than aggregation as defined here.")]),e._v(" "),a("h2",{attrs:{id:"user-defined-function-udf"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-function-udf"}},[e._v("#")]),e._v(" User-defined function (UDF)")]),e._v(" "),a("p",[e._v("The abbreviation "),a("strong",[e._v("UDF")]),e._v(" stands for "),a("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, or applied to a particular dimension or set of dimensions, allowing custom server-side calculations. See the section on "),a("RouterLink",{attrs:{to:"/documentation/0.4/udfs.html"}},[e._v("UDFs")]),e._v(" for more information.")],1),e._v(" "),a("h2",{attrs:{id:"data-processing-modes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-processing-modes"}},[e._v("#")]),e._v(" Data Processing modes")]),e._v(" "),a("p",[e._v("Process graphs can be processed in three different ways:")]),e._v(" "),a("ol",[a("li",[e._v("Results can be pre-computed by creating a "),a("em",[a("strong",[e._v("batch job")])]),e._v(" using "),a("code",[e._v("POST /jobs")]),e._v(". They are submitted to the back-end's processing system, but will remain inactive until "),a("code",[e._v("POST /jobs/{job_id}/results")]),e._v(" has been called. They will run only once and store results after execution. Results can be downloaded. Batch jobs are typically time consuming and user interaction is not possible. This is the only mode that allows to get an estimate about time, volume and costs beforehand.")]),e._v(" "),a("li",[e._v("A more dynamic way of processing and accessing data is to create a "),a("strong",[e._v("secondary web service")]),e._v(". They allow web-based access using different protocols such as "),a("a",{attrs:{href:"http://www.opengeospatial.org/standards/wms",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WMS"),a("OutboundLink")],1),e._v(" (Open Geospatial Consortium Web Map Service), "),a("a",{attrs:{href:"http://www.opengeospatial.org/standards/wcs",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WCS"),a("OutboundLink")],1),e._v(" (Web Coverage Service) or "),a("a",{attrs:{href:"https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames",target:"_blank",rel:"noopener noreferrer"}},[e._v("XYZ tiles"),a("OutboundLink")],1),e._v(". These protocols usually allow users to change the viewing extent or level of detail (zoom level). Therefore, computations often run "),a("em",[e._v("on demand")]),e._v(" so that the requested data is calculated during the request. Back-ends should make sure to cache processed data to avoid additional/high costs and reduce waiting times for the user.")]),e._v(" "),a("li",[e._v("Process graphs can also be executed "),a("strong",[e._v("on-demand")]),e._v(" (i.e. synchronously) by sending the process graph to "),a("code",[e._v("POST /result")]),e._v(". Results are delivered with the request itself and no job is created. Only lightweight computations, for example small previews, should be executed using this approach as timeouts are to be expected for "),a("a",{attrs:{href:"https://www.pubnub.com/blog/2014-12-01-http-long-polling/",target:"_blank",rel:"noopener noreferrer"}},[e._v("long-polling HTTP requests"),a("OutboundLink")],1),e._v(".")])])])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/43.3de23151.js b/assets/js/43.4be98c2f.js similarity index 95% rename from assets/js/43.3de23151.js rename to assets/js/43.4be98c2f.js index ee45840c4..d66985d3c 100644 --- a/assets/js/43.3de23151.js +++ b/assets/js/43.4be98c2f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{321:function(e,t,a){e.exports=a.p+"assets/img/arch.e75ccb9a.png"},517:function(e,t,a){"use strict";a.r(t);var i=a(4),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("The openEO API defines a language for how clients communicate to back-ends in order to analyze large Earth observation datasets. The API will be implemented by drivers for specific back-ends. Some first architecture considerations are listed below.")]),e._v(" "),t("ol",[t("li",[e._v("The openEO API is a contract between clients and back-ends that describes the communication only")]),e._v(" "),t("li",[e._v("Each back-end runs its own API instance including the specific back-end driver. There is no API instance that runs more than one driver.")]),e._v(" "),t("li",[e._v("Clients in R, Python, and JavaScript connect directly to the back-ends and communicate with the back-ends over "),t("em",[e._v("HTTPS")]),e._v(" according to the openEO API specification.")]),e._v(" "),t("li",[e._v("API instances can run on back-end servers or additional intermediate layers, which then communicate to back-ends in a back-end specific way.")]),e._v(" "),t("li",[e._v("Back-ends may add functionality and extend the API wherever there is need.")]),e._v(" "),t("li",[e._v("There will be a central back-end registry service (openEO Hub), to allow users to search for back-ends with specific functionality and or data.")]),e._v(" "),t("li",[e._v("The openEO API may define "),t("em",[e._v("profiles")]),e._v(" in order to group specific functionality.")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(321),alt:"Architecture - openEO API shown in dark blue"}})]),e._v(" "),t("h1",{attrs:{id:"microservices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#microservices"}},[e._v("#")]),e._v(" Microservices")]),e._v(" "),t("p",[e._v("To simplify and structure the development, the API is divided into a few microservices.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Microservice")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Capabilities")]),e._v(" "),t("td",[e._v("This microservice reports on the capabilities of the back-end, i.e. which API endpoints are implemented, which authentication methods are supported, and whether and how UDFs can be executed at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("EO Data Discovery")]),e._v(" "),t("td",[e._v("Describes which collections are available at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("Process Discovery")]),e._v(" "),t("td",[e._v("Provides services to find out which processes a back-end provides, i.e., what users can do with the available data.")])]),e._v(" "),t("tr",[t("td",[e._v("Data Processing")]),e._v(" "),t("td",[e._v("Organizes and manages data processing on the back-end, either as synchronous on-demand computation or batch jobs.")])]),e._v(" "),t("tr",[t("td",[e._v("File Storage")]),e._v(" "),t("td",[e._v("Organizes and manages user-uploaded files.")])]),e._v(" "),t("tr",[t("td",[e._v("User-Defined Processes")]),e._v(" "),t("td",[e._v("Organizes and manages user-defined processes (process graphs).")])]),e._v(" "),t("tr",[t("td",[e._v("Secondary Services")]),e._v(" "),t("td",[e._v("External web services to access data and job results such as a OGC WMTS service.")])]),e._v(" "),t("tr",[t("td",[e._v("Account Management")]),e._v(" "),t("td",[e._v("User management, accounting and authentication.")])]),e._v(" "),t("tr",[t("td",[e._v("UDF Runtime")]),e._v(" "),t("td",[e._v("Execution of user-defined functions, not part of the Core API. See the "),t("RouterLink",{attrs:{to:"/documentation/1.0/udfs.html"}},[e._v("UDF documentation")]),e._v(" for more information.")],1)])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{322:function(e,t,a){e.exports=a.p+"assets/img/arch.e75ccb9a.png"},518:function(e,t,a){"use strict";a.r(t);var i=a(4),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("The openEO API defines a language for how clients communicate to back-ends in order to analyze large Earth observation datasets. The API will be implemented by drivers for specific back-ends. Some first architecture considerations are listed below.")]),e._v(" "),t("ol",[t("li",[e._v("The openEO API is a contract between clients and back-ends that describes the communication only")]),e._v(" "),t("li",[e._v("Each back-end runs its own API instance including the specific back-end driver. There is no API instance that runs more than one driver.")]),e._v(" "),t("li",[e._v("Clients in R, Python, and JavaScript connect directly to the back-ends and communicate with the back-ends over "),t("em",[e._v("HTTPS")]),e._v(" according to the openEO API specification.")]),e._v(" "),t("li",[e._v("API instances can run on back-end servers or additional intermediate layers, which then communicate to back-ends in a back-end specific way.")]),e._v(" "),t("li",[e._v("Back-ends may add functionality and extend the API wherever there is need.")]),e._v(" "),t("li",[e._v("There will be a central back-end registry service (openEO Hub), to allow users to search for back-ends with specific functionality and or data.")]),e._v(" "),t("li",[e._v("The openEO API may define "),t("em",[e._v("profiles")]),e._v(" in order to group specific functionality.")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(322),alt:"Architecture - openEO API shown in dark blue"}})]),e._v(" "),t("h1",{attrs:{id:"microservices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#microservices"}},[e._v("#")]),e._v(" Microservices")]),e._v(" "),t("p",[e._v("To simplify and structure the development, the API is divided into a few microservices.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Microservice")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Capabilities")]),e._v(" "),t("td",[e._v("This microservice reports on the capabilities of the back-end, i.e. which API endpoints are implemented, which authentication methods are supported, and whether and how UDFs can be executed at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("EO Data Discovery")]),e._v(" "),t("td",[e._v("Describes which collections are available at the back-end.")])]),e._v(" "),t("tr",[t("td",[e._v("Process Discovery")]),e._v(" "),t("td",[e._v("Provides services to find out which processes a back-end provides, i.e., what users can do with the available data.")])]),e._v(" "),t("tr",[t("td",[e._v("Data Processing")]),e._v(" "),t("td",[e._v("Organizes and manages data processing on the back-end, either as synchronous on-demand computation or batch jobs.")])]),e._v(" "),t("tr",[t("td",[e._v("File Storage")]),e._v(" "),t("td",[e._v("Organizes and manages user-uploaded files.")])]),e._v(" "),t("tr",[t("td",[e._v("User-Defined Processes")]),e._v(" "),t("td",[e._v("Organizes and manages user-defined processes (process graphs).")])]),e._v(" "),t("tr",[t("td",[e._v("Secondary Services")]),e._v(" "),t("td",[e._v("External web services to access data and job results such as a OGC WMTS service.")])]),e._v(" "),t("tr",[t("td",[e._v("Account Management")]),e._v(" "),t("td",[e._v("User management, accounting and authentication.")])]),e._v(" "),t("tr",[t("td",[e._v("UDF Runtime")]),e._v(" "),t("td",[e._v("Execution of user-defined functions, not part of the Core API. See the "),t("RouterLink",{attrs:{to:"/documentation/1.0/udfs.html"}},[e._v("UDF documentation")]),e._v(" for more information.")],1)])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/44.ce46d682.js b/assets/js/44.03d8deb4.js similarity index 99% rename from assets/js/44.ce46d682.js rename to assets/js/44.03d8deb4.js index 1e25b1a00..7a8b72c3e 100644 --- a/assets/js/44.ce46d682.js +++ b/assets/js/44.03d8deb4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{322:function(t,e,v){t.exports=v.p+"assets/img/api.30c653d6.png"},523:function(t,e,v){"use strict";v.r(e);var s=v(4),_=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"api-profiles"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-profiles"}},[t._v("#")]),t._v(" API Profiles")]),t._v(" "),e("p",[t._v('The following image provides an overview of the openEO API profiles.\nThe minimal profile that allows an openEO API implementation to be called "openEO-compliant" is '),e("em",[t._v("L1 Minimal")]),t._v(" with additionally compliance to at least of L1A, L1B, or L1C.")]),t._v(" "),e("figure",[e("img",{attrs:{src:v(322),alt:"The hierarchy of openEO API profiles: L1 Minimal -> L1A/B/C -> L2 Recommended -> L3 Advanced (with sub-profiles) -> L4 Above and Beyond"}}),t._v(" "),e("figcaption",[t._v("An overview of the openEO API profiles.")])]),t._v(" "),e("ul",[e("li",[e("em",[t._v("L1 Minimal")]),t._v(" ensures that the openEO implementation has a minimal set of functionality which allow users to execute basic use-cases.")]),t._v(" "),e("li",[e("em",[t._v("L2 Recommended")]),t._v(" add functionality that we recommend to be available so that users can more effectively make use of the openEO implementation.")]),t._v(" "),e("li",[e("em",[t._v("L3 Advanced")]),t._v(" allows users to execute more advanced use cases. The sub-profiles can add a specific set of functionalities centered around specific needs:\n"),e("ul",[e("li",[e("em",[t._v("L3-UDF")]),t._v(" adds support for User-Defined Functions (users can run custom source code)")]),t._v(" "),e("li",[e("em",[t._v("L3-FS")]),t._v(" adds support for File Storage (users can upload, use, and delete custom files)")]),t._v(" "),e("li",[e("em",[t._v("L3-SWS")]),t._v(" adds advanced suppoort for Secondary Web Services (e.g. on-demand processing through a tiling service such as OGC WMTS)")])])]),t._v(" "),e("li",[e("em",[t._v("L4 Above and Beyond")]),t._v(" adds very specific and complex requirements for very specific and highly advanced use cases. Additionally, there are also various API extensions defined in the API specification, which are not listed as part of the profiles.")])]),t._v(" "),e("p",[t._v("In the following chapter you can find a list of requirements per profile, grouped by categories.")]),t._v(" "),e("h2",{attrs:{id:"requirements-per-profile"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements-per-profile"}},[t._v("#")]),t._v(" Requirements per Profile")]),t._v(" "),e("h3",{attrs:{id:"l1-minimal"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1-minimal"}},[t._v("#")]),t._v(" L1: Minimal")]),t._v(" "),e("h4",{attrs:{id:"api-fundamentals"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals"}},[t._v("#")]),t._v(" API fundamentals")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("1")]),t._v(" "),e("td",[t._v("All > CORS")]),t._v(" "),e("td",[t._v("OPTIONS method with all headers")])]),t._v(" "),e("tr",[e("td",[t._v("2")]),t._v(" "),e("td",[t._v("All > CORS")]),t._v(" "),e("td",[t._v("Access-Control-Allow-Origin for GET, POST, PUT, PATCH, DELETE")])]),t._v(" "),e("tr",[e("td",[t._v("3")]),t._v(" "),e("td",[t._v("All > CORS")]),t._v(" "),e("td",[t._v("Access-Control-Expose-Headers for GET, POST, PUT, PATCH, DELETE")])]),t._v(" "),e("tr",[e("td",[t._v("4")]),t._v(" "),e("td",[t._v("All > HTTPS")]),t._v(" "),e("td",[t._v("HTTPS supported")])]),t._v(" "),e("tr",[e("td",[t._v("5")]),t._v(" "),e("td",[t._v("All > UTF-8")]),t._v(" "),e("td",[t._v("Charset is UTF-8 for all requests and responses")])]),t._v(" "),e("tr",[e("td",[t._v("6")]),t._v(" "),e("td",[t._v("All > Error Handling")]),t._v(" "),e("td",[t._v("Returns HTTP status codes between 400 and 599 for errors")])]),t._v(" "),e("tr",[e("td",[t._v("7")]),t._v(" "),e("td",[t._v("All > Error Handling")]),t._v(" "),e("td",[t._v("Returns a JSON object with at least code and message properties")])]),t._v(" "),e("tr",[e("td",[t._v("13")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Callback support")])])])]),t._v(" "),e("h4",{attrs:{id:"well-known-discovery"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#well-known-discovery"}},[t._v("#")]),t._v(" Well-known Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("21")]),t._v(" "),e("td",[e("code",[t._v("GET /.well-known/openeo")])]),t._v(" "),e("td",[t._v("Valid response with at least url and api_version per instance (without authentication)")])])])]),t._v(" "),e("h4",{attrs:{id:"capabilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#capabilities"}},[t._v("#")]),t._v(" Capabilities")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("30")]),t._v(" "),e("td",[e("code",[t._v("GET /")])]),t._v(" "),e("td",[t._v("Valid response with at least api/backend/stac_version, id, title, description, endpoints and links (w/o auth)")])]),t._v(" "),e("tr",[e("td",[t._v("31")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > endpoints")]),t._v(" "),e("td",[t._v("All implemented endpoints listed with methods")])]),t._v(" "),e("tr",[e("td",[t._v("32")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > endpoints")]),t._v(" "),e("td",[t._v("No endpoints listed that are not implemented or faulty")])]),t._v(" "),e("tr",[e("td",[t._v("33")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > api_version")]),t._v(" "),e("td",[t._v("Implements openEO API version 1.2.0 (or 1.1.0)")])]),t._v(" "),e("tr",[e("td",[t._v("34")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > stac_version")]),t._v(" "),e("td",[t._v("Implements STAC version 1.0.0 (or 0.9.0)")])])])]),t._v(" "),e("h4",{attrs:{id:"file-formats"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[t._v("#")]),t._v(" File Formats")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("40")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Valid response with input and output properties")])]),t._v(" "),e("tr",[e("td",[t._v("41")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("42")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("43")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")]),t._v(" > output")]),t._v(" "),e("td",[t._v("At least one output file format available")])]),t._v(" "),e("tr",[e("td",[t._v("46")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("File format names get accepted case Insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("48")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Each format has at least gis_data_types and parameters")])])])]),t._v(" "),e("h4",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("100")]),t._v(" "),e("td"),t._v(" "),e("td",[t._v("Bearer token follows the specified format (method/identityProviderId/token)")])]),t._v(" "),e("tr",[e("td",[t._v("101")]),t._v(" "),e("td",[t._v("All that require a Bearer token > Error Handling")]),t._v(" "),e("td",[t._v("Returns HTTP status codes 401 if no authentication details are provided")])]),t._v(" "),e("tr",[e("td",[t._v("102")]),t._v(" "),e("td",[t._v("All that require a Bearer token > Error Handling")]),t._v(" "),e("td",[t._v("Returns HTTP status codes 403 if invalid credentials or credentials with insufficient permissions are provided")])]),t._v(" "),e("tr",[e("td",[t._v("110")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/*")])]),t._v(" "),e("td",[t._v("At least one authentication method is supported (HTTP Basic or OIDC)")])])])]),t._v(" "),e("h4",{attrs:{id:"pre-defined-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes"}},[t._v("#")]),t._v(" Pre-defined Processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("200")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[t._v("Valid response with at least processes and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("201")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("202")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("204")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All processes are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("209")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("Missing properties in the process objects are not set to null if not valid according to the OpenAPI schema")])])])]),t._v(" "),e("h4",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("300")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Valid response with at least collections and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("301")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("302")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("303")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Supports a valid STAC version (0.9.0 or later, preferrably 1.0.0).")])]),t._v(" "),e("tr",[e("td",[t._v("306")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All collections are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("307")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("All collections are valid according to the STAC specification 0.9 or later (stac_version, id, description, license, extent and links are required)")])]),t._v(" "),e("tr",[e("td",[t._v("313")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("Missing properties in the collection objects are not set to null if not valid according to the OpenAPI schema")])]),t._v(" "),e("tr",[e("td",[t._v("320")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("321")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Response is valid according to the STAC specification 0.9 or later (additionally, cube:dimensions and summaries are required)")])]),t._v(" "),e("tr",[e("td",[t._v("322")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("323")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("326")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")]),t._v(" > cube:dimensions")]),t._v(" "),e("td",[t._v("All collections provide their actual data cube dimensions")])])])]),t._v(" "),e("h4",{attrs:{id:"data-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-processing"}},[t._v("#")]),t._v(" Data Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("700")]),t._v(" "),e("td",[t._v("status")]),t._v(" "),e("td",[t._v("Job follows described status changes (see description of status property in GET /jobs/{id})")])]),t._v(" "),e("tr",[e("td",[t._v("701")]),t._v(" "),e("td"),t._v(" "),e("td",[t._v("At least one of batch jobs, secondary web services or synchronous processing is implemented")])])])]),t._v(" "),e("h3",{attrs:{id:"l1a-minimal-synchronous-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1a-minimal-synchronous-processing"}},[t._v("#")]),t._v(" L1A: Minimal - Synchronous Processing")]),t._v(" "),e("h4",{attrs:{id:"synchronous-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing"}},[t._v("#")]),t._v(" Synchronous Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("900")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("901")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("905")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Returns HTTP status 200 on success with the data in the response body, HTTP status codes 4XX or 5XX on failure with valid response body")])]),t._v(" "),e("tr",[e("td",[t._v("906")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > Content-Type header")]),t._v(" "),e("td",[t._v("Returns suitable media type for the requested file format (not always application/octet-stream) in the Content-Type header")])]),t._v(" "),e("tr",[e("td",[t._v("910")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Rejects processing if a payment is required.")])])])]),t._v(" "),e("h3",{attrs:{id:"l1b-minimal-batch-jobs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1b-minimal-batch-jobs"}},[t._v("#")]),t._v(" L1B: Minimal - Batch Jobs")]),t._v(" "),e("h4",{attrs:{id:"batch-jobs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("710")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("711")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Valid response with at least jobs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("713")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All jobs are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("714")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("The served job metadata is valid according to the specification (id, status and created are required)")])]),t._v(" "),e("tr",[e("td",[t._v("715")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("title is provided for all jobs (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("730")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports creating batch jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("731")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("734")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports storing title and description")])]),t._v(" "),e("tr",[e("td",[t._v("736")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("737")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > status")]),t._v(" "),e("td",[t._v('Job status is "created" after successful creation of the job, the data processing does not start yet')])]),t._v(" "),e("tr",[e("td",[t._v("750")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("751")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, process, status and created")])]),t._v(" "),e("tr",[e("td",[t._v("752")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("754")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")]),t._v(" > status")]),t._v(" "),e("td",[t._v("Correctly reports status (and progress, if supported)")])]),t._v(" "),e("tr",[e("td",[t._v("780")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("781")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Deletes the job and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("850")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Supports queueing/starting jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("851")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Queues or starts the processing, which is reflected in the job status. Does nothing if already queued or running. Responds with HTTP status 202.")])]),t._v(" "),e("tr",[e("td",[t._v("852")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Rejects queueing a job if a payment is required.")])]),t._v(" "),e("tr",[e("td",[t._v("860")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("861")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v('Returns HTTP status code 200 if the result is available, HTTP status code 424 with error message if the job status is "error", 4XX/5XX otherwise.')])]),t._v(" "),e("tr",[e("td",[t._v("863")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > partial parameter")]),t._v(" "),e("td",[t._v("If processing has not finished and the partial parameter is not set to true, requests are rejected with openEO error JobNotFinished.")])]),t._v(" "),e("tr",[e("td",[t._v("865")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Response is a valid STAC Item or Collection")])]),t._v(" "),e("tr",[e("td",[t._v("866")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Supports a valid STAC version (0.9.0 or later, preferrably 1.0.0).")])]),t._v(" "),e("tr",[e("td",[t._v("869")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Assets all have an href and type, ideally also a title")])]),t._v(" "),e("tr",[e("td",[t._v("870")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Additional metadata is provided for the results (e.g. extents, projection, bands, dimensions). Please provide details in the comments.")])]),t._v(" "),e("tr",[e("td",[t._v("871")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Support canonical links (a public access signed URL, exposed as link with relation type canonical)")])]),t._v(" "),e("tr",[e("td",[t._v("872")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Exposes the expires property in the response body")])]),t._v(" "),e("tr",[e("td",[t._v("890")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("891")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Cancels data processing (if queued or running), optionally deletes the batch job results and returns a HTTP 202 on success.")])])])]),t._v(" "),e("h3",{attrs:{id:"l1c-minimal-secondary-web-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1c-minimal-secondary-web-services"}},[t._v("#")]),t._v(" L1C: Minimal - Secondary Web Services")]),t._v(" "),e("h4",{attrs:{id:"secondary-web-service-discovery"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-service-discovery"}},[t._v("#")]),t._v(" Secondary Web Service Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("600")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("601")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("602")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("603")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Valid response with at least configuration and process_parameters per service")])])])]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services"}},[t._v("#")]),t._v(" Secondary Web Services")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("610")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("611")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Valid response with at least services and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("613")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All services are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("614")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("The served service metadata is valid according to the specification (id, url, type and enabled are required)")])]),t._v(" "),e("tr",[e("td",[t._v("615")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("title is provided for all services (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("630")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports creating services (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("631")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("632")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Supports configuration parameters, rejects invalid configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("633")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > type")]),t._v(" "),e("td",[t._v("Rejects invalid types, accepts types case insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("636")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports storing title, description and enabled")])]),t._v(" "),e("tr",[e("td",[t._v("638")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("650")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("651")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, url, type, enabled, process, configuration and attributes")])]),t._v(" "),e("tr",[e("td",[t._v("652")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("680")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("681")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Deletes the service and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h3",{attrs:{id:"l2-recommended"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l2-recommended"}},[t._v("#")]),t._v(" L2: Recommended")]),t._v(" "),e("h4",{attrs:{id:"api-fundamentals-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals-2"}},[t._v("#")]),t._v(" API fundamentals")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("9")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Namespace support")])]),t._v(" "),e("tr",[e("td",[t._v("11")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Use user-defined processes (in process_id)")])]),t._v(" "),e("tr",[e("td",[t._v("12")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Parameter support (use of from_parameter)")])])])]),t._v(" "),e("h4",{attrs:{id:"well-known-discovery-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#well-known-discovery-2"}},[t._v("#")]),t._v(" Well-known Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("20")]),t._v(" "),e("td",[e("code",[t._v("GET /.well-known/openeo")])]),t._v(" "),e("td",[t._v("Not part of the main API tree / not versioned")])])])]),t._v(" "),e("h4",{attrs:{id:"capabilities-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#capabilities-2"}},[t._v("#")]),t._v(" Capabilities")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("35")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Billing information are provided")])])])]),t._v(" "),e("h4",{attrs:{id:"file-formats-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#file-formats-2"}},[t._v("#")]),t._v(" File Formats")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("44")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("File format names aligned with GDAL")])]),t._v(" "),e("tr",[e("td",[t._v("47")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Each format has a description describing their structure and relation to data cubes.")])]),t._v(" "),e("tr",[e("td",[t._v("49")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("title and description are provided for all file formats")])])])]),t._v(" "),e("h4",{attrs:{id:"authentication-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication-2"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("112")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/oidc")])]),t._v(" "),e("td",[t._v("OIDC is supported (without authentication for discovery requests)")])])])]),t._v(" "),e("h4",{attrs:{id:"user-account"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-account"}},[t._v("#")]),t._v(" User Account")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("120")]),t._v(" "),e("td",[e("code",[t._v("GET /me")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("121")]),t._v(" "),e("td",[e("code",[t._v("GET /me")]),t._v(" > user_id")]),t._v(" "),e("td",[t._v("Returns a unique user ID")])])])]),t._v(" "),e("h4",{attrs:{id:"pre-defined-processes-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes-2"}},[t._v("#")]),t._v(" Pre-defined Processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("206")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("All processes are customized to reflect the actual implementation status (removal of unsupported parameters, updates to parameter schemas, etc.)")])]),t._v(" "),e("tr",[e("td",[t._v("207")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("Summaries and categories are provided for all processes")])])])]),t._v(" "),e("h4",{attrs:{id:"collections-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections-2"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("304")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Implements STAC API - Collections (https://api.stacspec.org/v1.0.0/collections)")])]),t._v(" "),e("tr",[e("td",[t._v("308")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("License links are provided for non-SPDX license identifiers")])]),t._v(" "),e("tr",[e("td",[t._v("309")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("All collections provide a title and keywords")])]),t._v(" "),e("tr",[e("td",[t._v("310")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("Extents report the actual availability of data and don't overpromise")])]),t._v(" "),e("tr",[e("td",[t._v("325")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")]),t._v(" > stac_extensions")]),t._v(" "),e("td",[t._v("Lists all extensions that are used in the document")])])])]),t._v(" "),e("h4",{attrs:{id:"user-defined-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-processes"}},[t._v("#")]),t._v(" User-defined processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("400")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("401")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")])]),t._v(" "),e("td",[t._v("Valid response with at least processes and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("403")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All processes are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("404")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("All stored processes are valid according to the specification (id is required)")])]),t._v(" "),e("tr",[e("td",[t._v("405")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("Missing properties in the process objects are not set to null if missing (allowed only for: summary, description, parameters, returns)")])]),t._v(" "),e("tr",[e("td",[t._v("410")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")]),t._v(" > create")]),t._v(" "),e("td",[t._v("Supports creating new processes (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("411")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")]),t._v(" > update")]),t._v(" "),e("td",[t._v("Supports updating existing processes (required only if creating new processes is supported)")])]),t._v(" "),e("tr",[e("td",[t._v("412")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Only accepts valid process submissions (id and process_graph required, given process must be valid)")])]),t._v(" "),e("tr",[e("td",[t._v("413")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")]),t._v(" > id")]),t._v(" "),e("td",[t._v("If the id given in the request body is not equal to the given process_graph_id in the path, updates the id given in the request body.")])]),t._v(" "),e("tr",[e("td",[t._v("414")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Fully replaces the process if a user-defined process with the given ID exists.")])]),t._v(" "),e("tr",[e("td",[t._v("420")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("421")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Valid response with at least id and process_graph")])]),t._v(" "),e("tr",[e("td",[t._v("422")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Missing properties in the process objects are not set to null if missing (allowed only for: summary, description, parameters, returns)")])]),t._v(" "),e("tr",[e("td",[t._v("430")]),t._v(" "),e("td",[e("code",[t._v("DELETE /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("431")]),t._v(" "),e("td",[e("code",[t._v("DELETE /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Deletes the process and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h4",{attrs:{id:"data-processing-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-processing-2"}},[t._v("#")]),t._v(" Data Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("702")]),t._v(" "),e("td"),t._v(" "),e("td",[t._v("At least two of batch jobs, secondary web services or synchronous processing are implemented")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-2"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("710")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("711")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Valid response with at least jobs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("713")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All jobs are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("714")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("The served job metadata is valid according to the specification (id, status and created are required)")])]),t._v(" "),e("tr",[e("td",[t._v("715")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("title is provided for all jobs (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("730")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports creating batch jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("731")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("734")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports storing title and description")])]),t._v(" "),e("tr",[e("td",[t._v("736")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("737")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > status")]),t._v(" "),e("td",[t._v('Job status is "created" after successful creation of the job, the data processing does not start yet')])]),t._v(" "),e("tr",[e("td",[t._v("750")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("751")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, process, status and created")])]),t._v(" "),e("tr",[e("td",[t._v("752")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("754")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")]),t._v(" > status")]),t._v(" "),e("td",[t._v("Correctly reports status (and progress, if supported)")])]),t._v(" "),e("tr",[e("td",[t._v("780")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("781")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Deletes the job and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-logs"}},[t._v("#")]),t._v(" Batch Jobs > Logs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("800")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("801")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > offset parameter")]),t._v(" "),e("td",[t._v("Supports query parameter offset, only returns log entries that were logged after the given offset")])]),t._v(" "),e("tr",[e("td",[t._v("804")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")])]),t._v(" "),e("td",[t._v("Valid response with at least logs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("805")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > level")]),t._v(" "),e("td",[t._v("level property is available if log_level has been set for the job or the level parameter has been provided")])]),t._v(" "),e("tr",[e("td",[t._v("806")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The served log entries are valid according to the specification (id, level and message are required)")])]),t._v(" "),e("tr",[e("td",[t._v("807")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("time is supported, core and data is supported if applicable")])]),t._v(" "),e("tr",[e("td",[t._v("808")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The message is short and concise, doesn't contain full stack traces.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results-2"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("850")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Supports queueing/starting jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("851")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Queues or starts the processing, which is reflected in the job status. Does nothing if already queued or running. Responds with HTTP status 202.")])]),t._v(" "),e("tr",[e("td",[t._v("852")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Rejects queueing a job if a payment is required.")])]),t._v(" "),e("tr",[e("td",[t._v("860")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("861")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v('Returns HTTP status code 200 if the result is available, HTTP status code 424 with error message if the job status is "error", 4XX/5XX otherwise.')])]),t._v(" "),e("tr",[e("td",[t._v("863")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > partial parameter")]),t._v(" "),e("td",[t._v("If processing has not finished and the partial parameter is not set to true, requests are rejected with openEO error JobNotFinished.")])]),t._v(" "),e("tr",[e("td",[t._v("865")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Response is a valid STAC Item or Collection")])]),t._v(" "),e("tr",[e("td",[t._v("866")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Supports a valid STAC version (0.9.0 or later, preferrably 1.0.0).")])]),t._v(" "),e("tr",[e("td",[t._v("869")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Assets all have an href and type, ideally also a title")])]),t._v(" "),e("tr",[e("td",[t._v("870")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Additional metadata is provided for the results (e.g. extents, projection, bands, dimensions). Please provide details in the comments.")])]),t._v(" "),e("tr",[e("td",[t._v("871")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Support canonical links (a public access signed URL, exposed as link with relation type canonical)")])]),t._v(" "),e("tr",[e("td",[t._v("872")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Exposes the expires property in the response body")])]),t._v(" "),e("tr",[e("td",[t._v("890")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("891")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Cancels data processing (if queued or running), optionally deletes the batch job results and returns a HTTP 202 on success.")])])])]),t._v(" "),e("h4",{attrs:{id:"synchronous-processing-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing-2"}},[t._v("#")]),t._v(" Synchronous Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("900")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("901")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("905")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Returns HTTP status 200 on success with the data in the response body, HTTP status codes 4XX or 5XX on failure with valid response body")])]),t._v(" "),e("tr",[e("td",[t._v("906")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > Content-Type header")]),t._v(" "),e("td",[t._v("Returns suitable media type for the requested file format (not always application/octet-stream) in the Content-Type header")])]),t._v(" "),e("tr",[e("td",[t._v("910")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Rejects processing if a payment is required.")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-advanced"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-advanced"}},[t._v("#")]),t._v(" L3: Advanced")]),t._v(" "),e("h4",{attrs:{id:"api-fundamentals-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals-3"}},[t._v("#")]),t._v(" API fundamentals")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("8")]),t._v(" "),e("td",[t._v("All > Error Handling")]),t._v(" "),e("td",[t._v("Additionally returns id and/or url properties")])]),t._v(" "),e("tr",[e("td",[t._v("10")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Multiple result nodes (e.g. save result as GeoTiff and netCDF)")])])])]),t._v(" "),e("h4",{attrs:{id:"well-known-discovery-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#well-known-discovery-3"}},[t._v("#")]),t._v(" Well-known Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("22")]),t._v(" "),e("td",[e("code",[t._v("GET /.well-known/openeo")])]),t._v(" "),e("td",[t._v("Lists production and development instance (if applicable)")])])])]),t._v(" "),e("h4",{attrs:{id:"conformance-classes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#conformance-classes"}},[t._v("#")]),t._v(" Conformance Classes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("60")]),t._v(" "),e("td",[e("code",[t._v("GET /conformance")])]),t._v(" "),e("td",[t._v("Is supported (without authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("61")]),t._v(" "),e("td",[e("code",[t._v("GET /conformance")])]),t._v(" "),e("td",[t._v("Valid response with at least conformsTo")])])])]),t._v(" "),e("h4",{attrs:{id:"authentication-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication-3"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("111")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/basic")])]),t._v(" "),e("td",[t._v("HTTP Basic is not supported in production")])])])]),t._v(" "),e("h4",{attrs:{id:"pre-defined-processes-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes-3"}},[t._v("#")]),t._v(" Pre-defined Processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("203")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])])])]),t._v(" "),e("h4",{attrs:{id:"collections-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections-3"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("305")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("330")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}/queryables")])]),t._v(" "),e("td",[t._v("Is supported and valid JSON Schema")])])])]),t._v(" "),e("h4",{attrs:{id:"user-defined-processes-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-processes-2"}},[t._v("#")]),t._v(" User-defined processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("402")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. Pagination links")])])])]),t._v(" "),e("h4",{attrs:{id:"validation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#validation"}},[t._v("#")]),t._v(" Validation")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("490")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("491")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("For valid input: HTTP 200 returning an empty errors array")])]),t._v(" "),e("tr",[e("td",[t._v("492")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("For invalid input: HTTP 200 with a non-empty errors array. Each objects contains at least code and message.")])]),t._v(" "),e("tr",[e("td",[t._v("493")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("HTTP status codes 4XX and 5XX are not used to indicate errors in the process. They only indicate invalid HTTP requests or server errors")])]),t._v(" "),e("tr",[e("td",[t._v("494")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > id")]),t._v(" "),e("td",[t._v("Checks validity of process id")])]),t._v(" "),e("tr",[e("td",[t._v("495")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > parameters")]),t._v(" "),e("td",[t._v("Checks validity of parameters (e.g. JSON Schema)")])]),t._v(" "),e("tr",[e("td",[t._v("496")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > returns")]),t._v(" "),e("td",[t._v("Checks validity of return value (e.g. JSON Schema)")])]),t._v(" "),e("tr",[e("td",[t._v("497")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > process_graph")]),t._v(" "),e("td",[t._v("Checks validity of provided process graph (e.g. parameters used, processes available, parameters provided valid, …)")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-3"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("712")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("732")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("733")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports setting a min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("735")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable) - please provide a list of them in the comments")])]),t._v(" "),e("tr",[e("td",[t._v("753")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Has billing support (plan, costs, budget, usage)")])]),t._v(" "),e("tr",[e("td",[t._v("755")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Correctly reflects additional properties set during job creation (or after job update)")])]),t._v(" "),e("tr",[e("td",[t._v("760")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")])]),t._v(" "),e("td",[t._v("Supports updating batch jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("764")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")])]),t._v(" "),e("td",[t._v("Supports updating title and description")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-logs-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-logs-2"}},[t._v("#")]),t._v(" Batch Jobs > Logs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("802")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > level parameter")]),t._v(" "),e("td",[t._v("Supports query parameter level")])]),t._v(" "),e("tr",[e("td",[t._v("803")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-estimates"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-estimates"}},[t._v("#")]),t._v(" Batch Jobs > Estimates")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("820")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")])]),t._v(" "),e("td",[t._v("Is supported (with authentication), provides at least one of costs, duration or size")])]),t._v(" "),e("tr",[e("td",[t._v("821")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > costs")]),t._v(" "),e("td",[t._v("Supports cost estimates")])]),t._v(" "),e("tr",[e("td",[t._v("824")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > downloads_included")]),t._v(" "),e("td",[t._v("Specifies how many full downloads of the processed data are included in the estimate.")])]),t._v(" "),e("tr",[e("td",[t._v("825")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > expires")]),t._v(" "),e("td",[t._v("Specifies the time until the estimate is valid.")])]),t._v(" "),e("tr",[e("td",[t._v("826")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")])]),t._v(" "),e("td",[t._v("Returns with HTTP 200 on success and returns with HTTP status 500 and error code EstimateComplexity if an estimate can't be computed.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results-3"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("864")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > OpenEO-Costs header")]),t._v(" "),e("td",[t._v("Supports the OpenEO-Costs header")])]),t._v(" "),e("tr",[e("td",[t._v("867")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Supports a full STAC hierachy (i.e. childs/items in a Collection)")])])])]),t._v(" "),e("h4",{attrs:{id:"synchronous-processing-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing-3"}},[t._v("#")]),t._v(" Synchronous Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("902")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("903")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports setting a min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("904")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable) - please provide a list of them in the comments")])]),t._v(" "),e("tr",[e("td",[t._v("907")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > OpenEO-Costs header")]),t._v(" "),e("td",[t._v("Returns OpenEO-Costs header")])]),t._v(" "),e("tr",[e("td",[t._v("908")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > Link header")]),t._v(" "),e("td",[t._v('Returns a link to logs in the Link header (relation type "monitor")')])]),t._v(" "),e("tr",[e("td",[t._v("909")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > multiple files")]),t._v(" "),e("td",[t._v("Supports TAR file format (or other archive format) if multiple files get generated")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-udf-udf"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-udf-udf"}},[t._v("#")]),t._v(" L3-UDF: UDF")]),t._v(" "),e("h4",{attrs:{id:"udf-runtimes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#udf-runtimes"}},[t._v("#")]),t._v(" UDF Runtimes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("71")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("72")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("73")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("74")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Valid response with at least type, default and versions per UDF runtime")])]),t._v(" "),e("tr",[e("td",[t._v("75")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("title and description are provided for all fUDF runtimes")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-fs-file-storage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-fs-file-storage"}},[t._v("#")]),t._v(" L3-FS: File Storage")]),t._v(" "),e("h4",{attrs:{id:"file-storage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#file-storage"}},[t._v("#")]),t._v(" File Storage")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("500")]),t._v(" "),e("td",[e("code",[t._v("GET /files")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("501")]),t._v(" "),e("td",[e("code",[t._v("GET /files")])]),t._v(" "),e("td",[t._v("Valid response with at least files and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("502")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("503")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All processes are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("504")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > files")]),t._v(" "),e("td",[t._v("The served file metadata is valid according to the specification (path is required)")])]),t._v(" "),e("tr",[e("td",[t._v("505")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > files")]),t._v(" "),e("td",[t._v("File sizes and modification dates are provided")])]),t._v(" "),e("tr",[e("td",[t._v("506")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > files")]),t._v(" "),e("td",[t._v("Paths are valid according to the specification (no leading slash, unix-style separator, no URL encoding)")])]),t._v(" "),e("tr",[e("td",[t._v("510")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Supports uploading files (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("511")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Paths are correctly parsed (works around the OpenAPI limitation)")])]),t._v(" "),e("tr",[e("td",[t._v("512")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Support for folders")])]),t._v(" "),e("tr",[e("td",[t._v("513")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Overrides existing files if applicable")])]),t._v(" "),e("tr",[e("td",[t._v("520")]),t._v(" "),e("td",[e("code",[t._v("GET /files/{path}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("521")]),t._v(" "),e("td",[e("code",[t._v("GET /files/{path}")])]),t._v(" "),e("td",[t._v("Provides the file content, correctly encoded (upload + download don't change the checksum of the files) and with a suitable media type")])]),t._v(" "),e("tr",[e("td",[t._v("530")]),t._v(" "),e("td",[e("code",[t._v("DELETE /files/{path}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("531")]),t._v(" "),e("td",[e("code",[t._v("DELETE /files/{path}")])]),t._v(" "),e("td",[t._v("Deletes the file and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-sws-secondary-web-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-sws-secondary-web-services"}},[t._v("#")]),t._v(" L3-SWS: Secondary Web Services")]),t._v(" "),e("h4",{attrs:{id:"secondary-web-service-discovery-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-service-discovery-2"}},[t._v("#")]),t._v(" Secondary Web Service Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("600")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("601")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("602")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("603")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Valid response with at least configuration and process_parameters per service")])]),t._v(" "),e("tr",[e("td",[t._v("604")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("title and description are provided for all services")])])])]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services-2"}},[t._v("#")]),t._v(" Secondary Web Services")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("610")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("611")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Valid response with at least services and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("612")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("613")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All services are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("614")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("The served service metadata is valid according to the specification (id, url, type and enabled are required)")])]),t._v(" "),e("tr",[e("td",[t._v("615")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("title is provided for all services (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("630")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports creating services (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("631")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("632")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Supports configuration parameters, rejects invalid configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("633")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > type")]),t._v(" "),e("td",[t._v("Rejects invalid types, accepts types case insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("634")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("635")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports setting a min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("636")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports storing title, description and enabled")])]),t._v(" "),e("tr",[e("td",[t._v("638")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("650")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("651")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, url, type, enabled, process, configuration and attributes")])]),t._v(" "),e("tr",[e("td",[t._v("652")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("653")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Has billing support (plan, costs, budget, usage)")])]),t._v(" "),e("tr",[e("td",[t._v("660")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")])]),t._v(" "),e("td",[t._v("Supports updating services (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("661")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Allows updating processes, but only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("662")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Supports updating configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("663")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Rejects invalid configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("664")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > type")]),t._v(" "),e("td",[t._v("Rejects invalid types, accepts types case insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("665")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("666")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports updating the min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("667")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > enabled")]),t._v(" "),e("td",[t._v("Supports enabling/disabling the service")])]),t._v(" "),e("tr",[e("td",[t._v("668")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")])]),t._v(" "),e("td",[t._v("Supports updating title and description")])]),t._v(" "),e("tr",[e("td",[t._v("680")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("681")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Deletes the service and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h3",{attrs:{id:"l4-above-and-beyond"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l4-above-and-beyond"}},[t._v("#")]),t._v(" L4: Above and Beyond")]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services-3"}},[t._v("#")]),t._v(" Secondary Web Services")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("616")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Supports on-demand web services (processing while using the service)")])]),t._v(" "),e("tr",[e("td",[t._v("617")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Supports viewing of batch job results (processing beforehand as batch job, i.e. load_result -> save process)")])]),t._v(" "),e("tr",[e("td",[t._v("637")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable) - please provide a list of them in the comments")])]),t._v(" "),e("tr",[e("td",[t._v("654")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Correctly reflects additional properties set during service creation (or after service update)")])]),t._v(" "),e("tr",[e("td",[t._v("669")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable)")])])])]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services-logs"}},[t._v("#")]),t._v(" Secondary Web Services > Logs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("690")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("691")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > offset parameter")]),t._v(" "),e("td",[t._v("Supports query parameter offset, only returns log entries that were logged after the given offset")])]),t._v(" "),e("tr",[e("td",[t._v("692")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > level parameter")]),t._v(" "),e("td",[t._v("Supports query parameter level")])]),t._v(" "),e("tr",[e("td",[t._v("693")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("694")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")])]),t._v(" "),e("td",[t._v("Valid response with at least logs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("695")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > level")]),t._v(" "),e("td",[t._v("level property is available if log_level has been set for the service or the level parameter has been provided")])]),t._v(" "),e("tr",[e("td",[t._v("696")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The served log entries are valid according to the specification (id, level and message are required)")])]),t._v(" "),e("tr",[e("td",[t._v("697")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("time is supported, core and data is supported if applicable")])]),t._v(" "),e("tr",[e("td",[t._v("698")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The message is short and concise, doesn't contain full stack traces.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-4"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("761")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Allows updating processes, but only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("762")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("763")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports updating the min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("765")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable)")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-estimates-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-estimates-2"}},[t._v("#")]),t._v(" Batch Jobs > Estimates")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("822")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > duration")]),t._v(" "),e("td",[t._v("Supports runtime duration estimates")])]),t._v(" "),e("tr",[e("td",[t._v("823")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > size")]),t._v(" "),e("td",[t._v("Supports result file size estimates")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results-4"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("862")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > partial parameter")]),t._v(" "),e("td",[t._v("Supports partial query parameter")])])])])])}),[],!1,null,null,null);e.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{323:function(t,e,v){t.exports=v.p+"assets/img/api.30c653d6.png"},525:function(t,e,v){"use strict";v.r(e);var s=v(4),_=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"api-profiles"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-profiles"}},[t._v("#")]),t._v(" API Profiles")]),t._v(" "),e("p",[t._v('The following image provides an overview of the openEO API profiles.\nThe minimal profile that allows an openEO API implementation to be called "openEO-compliant" is '),e("em",[t._v("L1 Minimal")]),t._v(" with additionally compliance to at least of L1A, L1B, or L1C.")]),t._v(" "),e("figure",[e("img",{attrs:{src:v(323),alt:"The hierarchy of openEO API profiles: L1 Minimal -> L1A/B/C -> L2 Recommended -> L3 Advanced (with sub-profiles) -> L4 Above and Beyond"}}),t._v(" "),e("figcaption",[t._v("An overview of the openEO API profiles.")])]),t._v(" "),e("ul",[e("li",[e("em",[t._v("L1 Minimal")]),t._v(" ensures that the openEO implementation has a minimal set of functionality which allow users to execute basic use-cases.")]),t._v(" "),e("li",[e("em",[t._v("L2 Recommended")]),t._v(" add functionality that we recommend to be available so that users can more effectively make use of the openEO implementation.")]),t._v(" "),e("li",[e("em",[t._v("L3 Advanced")]),t._v(" allows users to execute more advanced use cases. The sub-profiles can add a specific set of functionalities centered around specific needs:\n"),e("ul",[e("li",[e("em",[t._v("L3-UDF")]),t._v(" adds support for User-Defined Functions (users can run custom source code)")]),t._v(" "),e("li",[e("em",[t._v("L3-FS")]),t._v(" adds support for File Storage (users can upload, use, and delete custom files)")]),t._v(" "),e("li",[e("em",[t._v("L3-SWS")]),t._v(" adds advanced suppoort for Secondary Web Services (e.g. on-demand processing through a tiling service such as OGC WMTS)")])])]),t._v(" "),e("li",[e("em",[t._v("L4 Above and Beyond")]),t._v(" adds very specific and complex requirements for very specific and highly advanced use cases. Additionally, there are also various API extensions defined in the API specification, which are not listed as part of the profiles.")])]),t._v(" "),e("p",[t._v("In the following chapter you can find a list of requirements per profile, grouped by categories.")]),t._v(" "),e("h2",{attrs:{id:"requirements-per-profile"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements-per-profile"}},[t._v("#")]),t._v(" Requirements per Profile")]),t._v(" "),e("h3",{attrs:{id:"l1-minimal"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1-minimal"}},[t._v("#")]),t._v(" L1: Minimal")]),t._v(" "),e("h4",{attrs:{id:"api-fundamentals"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals"}},[t._v("#")]),t._v(" API fundamentals")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("1")]),t._v(" "),e("td",[t._v("All > CORS")]),t._v(" "),e("td",[t._v("OPTIONS method with all headers")])]),t._v(" "),e("tr",[e("td",[t._v("2")]),t._v(" "),e("td",[t._v("All > CORS")]),t._v(" "),e("td",[t._v("Access-Control-Allow-Origin for GET, POST, PUT, PATCH, DELETE")])]),t._v(" "),e("tr",[e("td",[t._v("3")]),t._v(" "),e("td",[t._v("All > CORS")]),t._v(" "),e("td",[t._v("Access-Control-Expose-Headers for GET, POST, PUT, PATCH, DELETE")])]),t._v(" "),e("tr",[e("td",[t._v("4")]),t._v(" "),e("td",[t._v("All > HTTPS")]),t._v(" "),e("td",[t._v("HTTPS supported")])]),t._v(" "),e("tr",[e("td",[t._v("5")]),t._v(" "),e("td",[t._v("All > UTF-8")]),t._v(" "),e("td",[t._v("Charset is UTF-8 for all requests and responses")])]),t._v(" "),e("tr",[e("td",[t._v("6")]),t._v(" "),e("td",[t._v("All > Error Handling")]),t._v(" "),e("td",[t._v("Returns HTTP status codes between 400 and 599 for errors")])]),t._v(" "),e("tr",[e("td",[t._v("7")]),t._v(" "),e("td",[t._v("All > Error Handling")]),t._v(" "),e("td",[t._v("Returns a JSON object with at least code and message properties")])]),t._v(" "),e("tr",[e("td",[t._v("13")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Callback support")])])])]),t._v(" "),e("h4",{attrs:{id:"well-known-discovery"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#well-known-discovery"}},[t._v("#")]),t._v(" Well-known Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("21")]),t._v(" "),e("td",[e("code",[t._v("GET /.well-known/openeo")])]),t._v(" "),e("td",[t._v("Valid response with at least url and api_version per instance (without authentication)")])])])]),t._v(" "),e("h4",{attrs:{id:"capabilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#capabilities"}},[t._v("#")]),t._v(" Capabilities")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("30")]),t._v(" "),e("td",[e("code",[t._v("GET /")])]),t._v(" "),e("td",[t._v("Valid response with at least api/backend/stac_version, id, title, description, endpoints and links (w/o auth)")])]),t._v(" "),e("tr",[e("td",[t._v("31")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > endpoints")]),t._v(" "),e("td",[t._v("All implemented endpoints listed with methods")])]),t._v(" "),e("tr",[e("td",[t._v("32")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > endpoints")]),t._v(" "),e("td",[t._v("No endpoints listed that are not implemented or faulty")])]),t._v(" "),e("tr",[e("td",[t._v("33")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > api_version")]),t._v(" "),e("td",[t._v("Implements openEO API version 1.2.0 (or 1.1.0)")])]),t._v(" "),e("tr",[e("td",[t._v("34")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > stac_version")]),t._v(" "),e("td",[t._v("Implements STAC version 1.0.0 (or 0.9.0)")])])])]),t._v(" "),e("h4",{attrs:{id:"file-formats"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[t._v("#")]),t._v(" File Formats")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("40")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Valid response with input and output properties")])]),t._v(" "),e("tr",[e("td",[t._v("41")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("42")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("43")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")]),t._v(" > output")]),t._v(" "),e("td",[t._v("At least one output file format available")])]),t._v(" "),e("tr",[e("td",[t._v("46")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("File format names get accepted case Insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("48")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Each format has at least gis_data_types and parameters")])])])]),t._v(" "),e("h4",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("100")]),t._v(" "),e("td"),t._v(" "),e("td",[t._v("Bearer token follows the specified format (method/identityProviderId/token)")])]),t._v(" "),e("tr",[e("td",[t._v("101")]),t._v(" "),e("td",[t._v("All that require a Bearer token > Error Handling")]),t._v(" "),e("td",[t._v("Returns HTTP status codes 401 if no authentication details are provided")])]),t._v(" "),e("tr",[e("td",[t._v("102")]),t._v(" "),e("td",[t._v("All that require a Bearer token > Error Handling")]),t._v(" "),e("td",[t._v("Returns HTTP status codes 403 if invalid credentials or credentials with insufficient permissions are provided")])]),t._v(" "),e("tr",[e("td",[t._v("110")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/*")])]),t._v(" "),e("td",[t._v("At least one authentication method is supported (HTTP Basic or OIDC)")])])])]),t._v(" "),e("h4",{attrs:{id:"pre-defined-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes"}},[t._v("#")]),t._v(" Pre-defined Processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("200")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[t._v("Valid response with at least processes and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("201")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("202")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("204")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All processes are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("209")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("Missing properties in the process objects are not set to null if not valid according to the OpenAPI schema")])])])]),t._v(" "),e("h4",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("300")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Valid response with at least collections and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("301")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("302")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("303")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Supports a valid STAC version (0.9.0 or later, preferrably 1.0.0).")])]),t._v(" "),e("tr",[e("td",[t._v("306")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All collections are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("307")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("All collections are valid according to the STAC specification 0.9 or later (stac_version, id, description, license, extent and links are required)")])]),t._v(" "),e("tr",[e("td",[t._v("313")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("Missing properties in the collection objects are not set to null if not valid according to the OpenAPI schema")])]),t._v(" "),e("tr",[e("td",[t._v("320")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("321")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Response is valid according to the STAC specification 0.9 or later (additionally, cube:dimensions and summaries are required)")])]),t._v(" "),e("tr",[e("td",[t._v("322")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("323")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("326")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")]),t._v(" > cube:dimensions")]),t._v(" "),e("td",[t._v("All collections provide their actual data cube dimensions")])])])]),t._v(" "),e("h4",{attrs:{id:"data-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-processing"}},[t._v("#")]),t._v(" Data Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("700")]),t._v(" "),e("td",[t._v("status")]),t._v(" "),e("td",[t._v("Job follows described status changes (see description of status property in GET /jobs/{id})")])]),t._v(" "),e("tr",[e("td",[t._v("701")]),t._v(" "),e("td"),t._v(" "),e("td",[t._v("At least one of batch jobs, secondary web services or synchronous processing is implemented")])])])]),t._v(" "),e("h3",{attrs:{id:"l1a-minimal-synchronous-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1a-minimal-synchronous-processing"}},[t._v("#")]),t._v(" L1A: Minimal - Synchronous Processing")]),t._v(" "),e("h4",{attrs:{id:"synchronous-processing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing"}},[t._v("#")]),t._v(" Synchronous Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("900")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("901")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("905")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Returns HTTP status 200 on success with the data in the response body, HTTP status codes 4XX or 5XX on failure with valid response body")])]),t._v(" "),e("tr",[e("td",[t._v("906")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > Content-Type header")]),t._v(" "),e("td",[t._v("Returns suitable media type for the requested file format (not always application/octet-stream) in the Content-Type header")])]),t._v(" "),e("tr",[e("td",[t._v("910")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Rejects processing if a payment is required.")])])])]),t._v(" "),e("h3",{attrs:{id:"l1b-minimal-batch-jobs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1b-minimal-batch-jobs"}},[t._v("#")]),t._v(" L1B: Minimal - Batch Jobs")]),t._v(" "),e("h4",{attrs:{id:"batch-jobs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("710")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("711")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Valid response with at least jobs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("713")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All jobs are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("714")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("The served job metadata is valid according to the specification (id, status and created are required)")])]),t._v(" "),e("tr",[e("td",[t._v("715")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("title is provided for all jobs (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("730")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports creating batch jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("731")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("734")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports storing title and description")])]),t._v(" "),e("tr",[e("td",[t._v("736")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("737")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > status")]),t._v(" "),e("td",[t._v('Job status is "created" after successful creation of the job, the data processing does not start yet')])]),t._v(" "),e("tr",[e("td",[t._v("750")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("751")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, process, status and created")])]),t._v(" "),e("tr",[e("td",[t._v("752")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("754")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")]),t._v(" > status")]),t._v(" "),e("td",[t._v("Correctly reports status (and progress, if supported)")])]),t._v(" "),e("tr",[e("td",[t._v("780")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("781")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Deletes the job and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("850")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Supports queueing/starting jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("851")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Queues or starts the processing, which is reflected in the job status. Does nothing if already queued or running. Responds with HTTP status 202.")])]),t._v(" "),e("tr",[e("td",[t._v("852")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Rejects queueing a job if a payment is required.")])]),t._v(" "),e("tr",[e("td",[t._v("860")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("861")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v('Returns HTTP status code 200 if the result is available, HTTP status code 424 with error message if the job status is "error", 4XX/5XX otherwise.')])]),t._v(" "),e("tr",[e("td",[t._v("863")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > partial parameter")]),t._v(" "),e("td",[t._v("If processing has not finished and the partial parameter is not set to true, requests are rejected with openEO error JobNotFinished.")])]),t._v(" "),e("tr",[e("td",[t._v("865")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Response is a valid STAC Item or Collection")])]),t._v(" "),e("tr",[e("td",[t._v("866")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Supports a valid STAC version (0.9.0 or later, preferrably 1.0.0).")])]),t._v(" "),e("tr",[e("td",[t._v("869")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Assets all have an href and type, ideally also a title")])]),t._v(" "),e("tr",[e("td",[t._v("870")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Additional metadata is provided for the results (e.g. extents, projection, bands, dimensions). Please provide details in the comments.")])]),t._v(" "),e("tr",[e("td",[t._v("871")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Support canonical links (a public access signed URL, exposed as link with relation type canonical)")])]),t._v(" "),e("tr",[e("td",[t._v("872")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Exposes the expires property in the response body")])]),t._v(" "),e("tr",[e("td",[t._v("890")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("891")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Cancels data processing (if queued or running), optionally deletes the batch job results and returns a HTTP 202 on success.")])])])]),t._v(" "),e("h3",{attrs:{id:"l1c-minimal-secondary-web-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l1c-minimal-secondary-web-services"}},[t._v("#")]),t._v(" L1C: Minimal - Secondary Web Services")]),t._v(" "),e("h4",{attrs:{id:"secondary-web-service-discovery"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-service-discovery"}},[t._v("#")]),t._v(" Secondary Web Service Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("600")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("601")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("602")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("603")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Valid response with at least configuration and process_parameters per service")])])])]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services"}},[t._v("#")]),t._v(" Secondary Web Services")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("610")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("611")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Valid response with at least services and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("613")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All services are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("614")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("The served service metadata is valid according to the specification (id, url, type and enabled are required)")])]),t._v(" "),e("tr",[e("td",[t._v("615")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("title is provided for all services (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("630")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports creating services (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("631")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("632")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Supports configuration parameters, rejects invalid configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("633")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > type")]),t._v(" "),e("td",[t._v("Rejects invalid types, accepts types case insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("636")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports storing title, description and enabled")])]),t._v(" "),e("tr",[e("td",[t._v("638")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("650")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("651")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, url, type, enabled, process, configuration and attributes")])]),t._v(" "),e("tr",[e("td",[t._v("652")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("680")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("681")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Deletes the service and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h3",{attrs:{id:"l2-recommended"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l2-recommended"}},[t._v("#")]),t._v(" L2: Recommended")]),t._v(" "),e("h4",{attrs:{id:"api-fundamentals-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals-2"}},[t._v("#")]),t._v(" API fundamentals")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("9")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Namespace support")])]),t._v(" "),e("tr",[e("td",[t._v("11")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Use user-defined processes (in process_id)")])]),t._v(" "),e("tr",[e("td",[t._v("12")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Parameter support (use of from_parameter)")])])])]),t._v(" "),e("h4",{attrs:{id:"well-known-discovery-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#well-known-discovery-2"}},[t._v("#")]),t._v(" Well-known Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("20")]),t._v(" "),e("td",[e("code",[t._v("GET /.well-known/openeo")])]),t._v(" "),e("td",[t._v("Not part of the main API tree / not versioned")])])])]),t._v(" "),e("h4",{attrs:{id:"capabilities-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#capabilities-2"}},[t._v("#")]),t._v(" Capabilities")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("35")]),t._v(" "),e("td",[e("code",[t._v("GET /")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Billing information are provided")])])])]),t._v(" "),e("h4",{attrs:{id:"file-formats-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#file-formats-2"}},[t._v("#")]),t._v(" File Formats")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("44")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("File format names aligned with GDAL")])]),t._v(" "),e("tr",[e("td",[t._v("47")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("Each format has a description describing their structure and relation to data cubes.")])]),t._v(" "),e("tr",[e("td",[t._v("49")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[t._v("title and description are provided for all file formats")])])])]),t._v(" "),e("h4",{attrs:{id:"authentication-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication-2"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("112")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/oidc")])]),t._v(" "),e("td",[t._v("OIDC is supported (without authentication for discovery requests)")])])])]),t._v(" "),e("h4",{attrs:{id:"user-account"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-account"}},[t._v("#")]),t._v(" User Account")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("120")]),t._v(" "),e("td",[e("code",[t._v("GET /me")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("121")]),t._v(" "),e("td",[e("code",[t._v("GET /me")]),t._v(" > user_id")]),t._v(" "),e("td",[t._v("Returns a unique user ID")])])])]),t._v(" "),e("h4",{attrs:{id:"pre-defined-processes-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes-2"}},[t._v("#")]),t._v(" Pre-defined Processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("206")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("All processes are customized to reflect the actual implementation status (removal of unsupported parameters, updates to parameter schemas, etc.)")])]),t._v(" "),e("tr",[e("td",[t._v("207")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("Summaries and categories are provided for all processes")])])])]),t._v(" "),e("h4",{attrs:{id:"collections-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections-2"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("304")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[t._v("Implements STAC API - Collections (https://api.stacspec.org/v1.0.0/collections)")])]),t._v(" "),e("tr",[e("td",[t._v("308")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("License links are provided for non-SPDX license identifiers")])]),t._v(" "),e("tr",[e("td",[t._v("309")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("All collections provide a title and keywords")])]),t._v(" "),e("tr",[e("td",[t._v("310")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > collections")]),t._v(" "),e("td",[t._v("Extents report the actual availability of data and don't overpromise")])]),t._v(" "),e("tr",[e("td",[t._v("325")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}")]),t._v(" > stac_extensions")]),t._v(" "),e("td",[t._v("Lists all extensions that are used in the document")])])])]),t._v(" "),e("h4",{attrs:{id:"user-defined-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-processes"}},[t._v("#")]),t._v(" User-defined processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("400")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("401")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")])]),t._v(" "),e("td",[t._v("Valid response with at least processes and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("403")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All processes are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("404")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("All stored processes are valid according to the specification (id is required)")])]),t._v(" "),e("tr",[e("td",[t._v("405")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > processes")]),t._v(" "),e("td",[t._v("Missing properties in the process objects are not set to null if missing (allowed only for: summary, description, parameters, returns)")])]),t._v(" "),e("tr",[e("td",[t._v("410")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")]),t._v(" > create")]),t._v(" "),e("td",[t._v("Supports creating new processes (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("411")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")]),t._v(" > update")]),t._v(" "),e("td",[t._v("Supports updating existing processes (required only if creating new processes is supported)")])]),t._v(" "),e("tr",[e("td",[t._v("412")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Only accepts valid process submissions (id and process_graph required, given process must be valid)")])]),t._v(" "),e("tr",[e("td",[t._v("413")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")]),t._v(" > id")]),t._v(" "),e("td",[t._v("If the id given in the request body is not equal to the given process_graph_id in the path, updates the id given in the request body.")])]),t._v(" "),e("tr",[e("td",[t._v("414")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Fully replaces the process if a user-defined process with the given ID exists.")])]),t._v(" "),e("tr",[e("td",[t._v("420")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("421")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Valid response with at least id and process_graph")])]),t._v(" "),e("tr",[e("td",[t._v("422")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Missing properties in the process objects are not set to null if missing (allowed only for: summary, description, parameters, returns)")])]),t._v(" "),e("tr",[e("td",[t._v("430")]),t._v(" "),e("td",[e("code",[t._v("DELETE /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("431")]),t._v(" "),e("td",[e("code",[t._v("DELETE /process_graphs/{id}")])]),t._v(" "),e("td",[t._v("Deletes the process and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h4",{attrs:{id:"data-processing-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#data-processing-2"}},[t._v("#")]),t._v(" Data Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("702")]),t._v(" "),e("td"),t._v(" "),e("td",[t._v("At least two of batch jobs, secondary web services or synchronous processing are implemented")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-2"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("710")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("711")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[t._v("Valid response with at least jobs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("713")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All jobs are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("714")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("The served job metadata is valid according to the specification (id, status and created are required)")])]),t._v(" "),e("tr",[e("td",[t._v("715")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > jobs")]),t._v(" "),e("td",[t._v("title is provided for all jobs (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("730")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports creating batch jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("731")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("734")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Supports storing title and description")])]),t._v(" "),e("tr",[e("td",[t._v("736")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("737")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > status")]),t._v(" "),e("td",[t._v('Job status is "created" after successful creation of the job, the data processing does not start yet')])]),t._v(" "),e("tr",[e("td",[t._v("750")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("751")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, process, status and created")])]),t._v(" "),e("tr",[e("td",[t._v("752")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("754")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")]),t._v(" > status")]),t._v(" "),e("td",[t._v("Correctly reports status (and progress, if supported)")])]),t._v(" "),e("tr",[e("td",[t._v("780")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("781")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}")])]),t._v(" "),e("td",[t._v("Deletes the job and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-logs"}},[t._v("#")]),t._v(" Batch Jobs > Logs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("800")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("801")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > offset parameter")]),t._v(" "),e("td",[t._v("Supports query parameter offset, only returns log entries that were logged after the given offset")])]),t._v(" "),e("tr",[e("td",[t._v("804")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")])]),t._v(" "),e("td",[t._v("Valid response with at least logs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("805")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > level")]),t._v(" "),e("td",[t._v("level property is available if log_level has been set for the job or the level parameter has been provided")])]),t._v(" "),e("tr",[e("td",[t._v("806")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The served log entries are valid according to the specification (id, level and message are required)")])]),t._v(" "),e("tr",[e("td",[t._v("807")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("time is supported, core and data is supported if applicable")])]),t._v(" "),e("tr",[e("td",[t._v("808")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The message is short and concise, doesn't contain full stack traces.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results-2"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("850")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Supports queueing/starting jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("851")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Queues or starts the processing, which is reflected in the job status. Does nothing if already queued or running. Responds with HTTP status 202.")])]),t._v(" "),e("tr",[e("td",[t._v("852")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Rejects queueing a job if a payment is required.")])]),t._v(" "),e("tr",[e("td",[t._v("860")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("861")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")])]),t._v(" "),e("td",[t._v('Returns HTTP status code 200 if the result is available, HTTP status code 424 with error message if the job status is "error", 4XX/5XX otherwise.')])]),t._v(" "),e("tr",[e("td",[t._v("863")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > partial parameter")]),t._v(" "),e("td",[t._v("If processing has not finished and the partial parameter is not set to true, requests are rejected with openEO error JobNotFinished.")])]),t._v(" "),e("tr",[e("td",[t._v("865")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Response is a valid STAC Item or Collection")])]),t._v(" "),e("tr",[e("td",[t._v("866")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Supports a valid STAC version (0.9.0 or later, preferrably 1.0.0).")])]),t._v(" "),e("tr",[e("td",[t._v("869")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Assets all have an href and type, ideally also a title")])]),t._v(" "),e("tr",[e("td",[t._v("870")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Additional metadata is provided for the results (e.g. extents, projection, bands, dimensions). Please provide details in the comments.")])]),t._v(" "),e("tr",[e("td",[t._v("871")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Support canonical links (a public access signed URL, exposed as link with relation type canonical)")])]),t._v(" "),e("tr",[e("td",[t._v("872")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > public access link")]),t._v(" "),e("td",[t._v("Exposes the expires property in the response body")])]),t._v(" "),e("tr",[e("td",[t._v("890")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("891")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{id}/results")])]),t._v(" "),e("td",[t._v("Cancels data processing (if queued or running), optionally deletes the batch job results and returns a HTTP 202 on success.")])])])]),t._v(" "),e("h4",{attrs:{id:"synchronous-processing-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing-2"}},[t._v("#")]),t._v(" Synchronous Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("900")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("901")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("905")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Returns HTTP status 200 on success with the data in the response body, HTTP status codes 4XX or 5XX on failure with valid response body")])]),t._v(" "),e("tr",[e("td",[t._v("906")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > Content-Type header")]),t._v(" "),e("td",[t._v("Returns suitable media type for the requested file format (not always application/octet-stream) in the Content-Type header")])]),t._v(" "),e("tr",[e("td",[t._v("910")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[t._v("Rejects processing if a payment is required.")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-advanced"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-advanced"}},[t._v("#")]),t._v(" L3: Advanced")]),t._v(" "),e("h4",{attrs:{id:"api-fundamentals-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-fundamentals-3"}},[t._v("#")]),t._v(" API fundamentals")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("8")]),t._v(" "),e("td",[t._v("All > Error Handling")]),t._v(" "),e("td",[t._v("Additionally returns id and/or url properties")])]),t._v(" "),e("tr",[e("td",[t._v("10")]),t._v(" "),e("td",[t._v("All > Process Graphs")]),t._v(" "),e("td",[t._v("Multiple result nodes (e.g. save result as GeoTiff and netCDF)")])])])]),t._v(" "),e("h4",{attrs:{id:"well-known-discovery-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#well-known-discovery-3"}},[t._v("#")]),t._v(" Well-known Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("22")]),t._v(" "),e("td",[e("code",[t._v("GET /.well-known/openeo")])]),t._v(" "),e("td",[t._v("Lists production and development instance (if applicable)")])])])]),t._v(" "),e("h4",{attrs:{id:"conformance-classes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#conformance-classes"}},[t._v("#")]),t._v(" Conformance Classes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("60")]),t._v(" "),e("td",[e("code",[t._v("GET /conformance")])]),t._v(" "),e("td",[t._v("Is supported (without authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("61")]),t._v(" "),e("td",[e("code",[t._v("GET /conformance")])]),t._v(" "),e("td",[t._v("Valid response with at least conformsTo")])])])]),t._v(" "),e("h4",{attrs:{id:"authentication-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication-3"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("111")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/basic")])]),t._v(" "),e("td",[t._v("HTTP Basic is not supported in production")])])])]),t._v(" "),e("h4",{attrs:{id:"pre-defined-processes-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pre-defined-processes-3"}},[t._v("#")]),t._v(" Pre-defined Processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("203")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])])])]),t._v(" "),e("h4",{attrs:{id:"collections-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections-3"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("305")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("330")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{id}/queryables")])]),t._v(" "),e("td",[t._v("Is supported and valid JSON Schema")])])])]),t._v(" "),e("h4",{attrs:{id:"user-defined-processes-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-processes-2"}},[t._v("#")]),t._v(" User-defined processes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("402")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. Pagination links")])])])]),t._v(" "),e("h4",{attrs:{id:"validation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#validation"}},[t._v("#")]),t._v(" Validation")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("490")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("491")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("For valid input: HTTP 200 returning an empty errors array")])]),t._v(" "),e("tr",[e("td",[t._v("492")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("For invalid input: HTTP 200 with a non-empty errors array. Each objects contains at least code and message.")])]),t._v(" "),e("tr",[e("td",[t._v("493")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[t._v("HTTP status codes 4XX and 5XX are not used to indicate errors in the process. They only indicate invalid HTTP requests or server errors")])]),t._v(" "),e("tr",[e("td",[t._v("494")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > id")]),t._v(" "),e("td",[t._v("Checks validity of process id")])]),t._v(" "),e("tr",[e("td",[t._v("495")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > parameters")]),t._v(" "),e("td",[t._v("Checks validity of parameters (e.g. JSON Schema)")])]),t._v(" "),e("tr",[e("td",[t._v("496")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > returns")]),t._v(" "),e("td",[t._v("Checks validity of return value (e.g. JSON Schema)")])]),t._v(" "),e("tr",[e("td",[t._v("497")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")]),t._v(" > process_graph")]),t._v(" "),e("td",[t._v("Checks validity of provided process graph (e.g. parameters used, processes available, parameters provided valid, …)")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-3"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("712")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("732")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("733")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports setting a min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("735")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable) - please provide a list of them in the comments")])]),t._v(" "),e("tr",[e("td",[t._v("753")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")])]),t._v(" "),e("td",[t._v("Has billing support (plan, costs, budget, usage)")])]),t._v(" "),e("tr",[e("td",[t._v("755")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Correctly reflects additional properties set during job creation (or after job update)")])]),t._v(" "),e("tr",[e("td",[t._v("760")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")])]),t._v(" "),e("td",[t._v("Supports updating batch jobs (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("764")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")])]),t._v(" "),e("td",[t._v("Supports updating title and description")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-logs-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-logs-2"}},[t._v("#")]),t._v(" Batch Jobs > Logs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("802")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > level parameter")]),t._v(" "),e("td",[t._v("Supports query parameter level")])]),t._v(" "),e("tr",[e("td",[t._v("803")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/logs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-estimates"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-estimates"}},[t._v("#")]),t._v(" Batch Jobs > Estimates")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("820")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")])]),t._v(" "),e("td",[t._v("Is supported (with authentication), provides at least one of costs, duration or size")])]),t._v(" "),e("tr",[e("td",[t._v("821")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > costs")]),t._v(" "),e("td",[t._v("Supports cost estimates")])]),t._v(" "),e("tr",[e("td",[t._v("824")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > downloads_included")]),t._v(" "),e("td",[t._v("Specifies how many full downloads of the processed data are included in the estimate.")])]),t._v(" "),e("tr",[e("td",[t._v("825")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > expires")]),t._v(" "),e("td",[t._v("Specifies the time until the estimate is valid.")])]),t._v(" "),e("tr",[e("td",[t._v("826")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")])]),t._v(" "),e("td",[t._v("Returns with HTTP 200 on success and returns with HTTP status 500 and error code EstimateComplexity if an estimate can't be computed.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results-3"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("864")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > OpenEO-Costs header")]),t._v(" "),e("td",[t._v("Supports the OpenEO-Costs header")])]),t._v(" "),e("tr",[e("td",[t._v("867")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > STAC")]),t._v(" "),e("td",[t._v("Supports a full STAC hierachy (i.e. childs/items in a Collection)")])])])]),t._v(" "),e("h4",{attrs:{id:"synchronous-processing-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronous-processing-3"}},[t._v("#")]),t._v(" Synchronous Processing")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("902")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("903")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports setting a min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("904")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable) - please provide a list of them in the comments")])]),t._v(" "),e("tr",[e("td",[t._v("907")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > OpenEO-Costs header")]),t._v(" "),e("td",[t._v("Returns OpenEO-Costs header")])]),t._v(" "),e("tr",[e("td",[t._v("908")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > Link header")]),t._v(" "),e("td",[t._v('Returns a link to logs in the Link header (relation type "monitor")')])]),t._v(" "),e("tr",[e("td",[t._v("909")]),t._v(" "),e("td",[e("code",[t._v("POST /result")]),t._v(" > multiple files")]),t._v(" "),e("td",[t._v("Supports TAR file format (or other archive format) if multiple files get generated")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-udf-udf"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-udf-udf"}},[t._v("#")]),t._v(" L3-UDF: UDF")]),t._v(" "),e("h4",{attrs:{id:"udf-runtimes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#udf-runtimes"}},[t._v("#")]),t._v(" UDF Runtimes")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("71")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("72")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("73")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("74")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("Valid response with at least type, default and versions per UDF runtime")])]),t._v(" "),e("tr",[e("td",[t._v("75")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[t._v("title and description are provided for all fUDF runtimes")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-fs-file-storage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-fs-file-storage"}},[t._v("#")]),t._v(" L3-FS: File Storage")]),t._v(" "),e("h4",{attrs:{id:"file-storage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#file-storage"}},[t._v("#")]),t._v(" File Storage")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("500")]),t._v(" "),e("td",[e("code",[t._v("GET /files")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("501")]),t._v(" "),e("td",[e("code",[t._v("GET /files")])]),t._v(" "),e("td",[t._v("Valid response with at least files and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("502")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("503")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All processes are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("504")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > files")]),t._v(" "),e("td",[t._v("The served file metadata is valid according to the specification (path is required)")])]),t._v(" "),e("tr",[e("td",[t._v("505")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > files")]),t._v(" "),e("td",[t._v("File sizes and modification dates are provided")])]),t._v(" "),e("tr",[e("td",[t._v("506")]),t._v(" "),e("td",[e("code",[t._v("GET /files")]),t._v(" > files")]),t._v(" "),e("td",[t._v("Paths are valid according to the specification (no leading slash, unix-style separator, no URL encoding)")])]),t._v(" "),e("tr",[e("td",[t._v("510")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Supports uploading files (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("511")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Paths are correctly parsed (works around the OpenAPI limitation)")])]),t._v(" "),e("tr",[e("td",[t._v("512")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Support for folders")])]),t._v(" "),e("tr",[e("td",[t._v("513")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[t._v("Overrides existing files if applicable")])]),t._v(" "),e("tr",[e("td",[t._v("520")]),t._v(" "),e("td",[e("code",[t._v("GET /files/{path}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("521")]),t._v(" "),e("td",[e("code",[t._v("GET /files/{path}")])]),t._v(" "),e("td",[t._v("Provides the file content, correctly encoded (upload + download don't change the checksum of the files) and with a suitable media type")])]),t._v(" "),e("tr",[e("td",[t._v("530")]),t._v(" "),e("td",[e("code",[t._v("DELETE /files/{path}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("531")]),t._v(" "),e("td",[e("code",[t._v("DELETE /files/{path}")])]),t._v(" "),e("td",[t._v("Deletes the file and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h3",{attrs:{id:"l3-sws-secondary-web-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l3-sws-secondary-web-services"}},[t._v("#")]),t._v(" L3-SWS: Secondary Web Services")]),t._v(" "),e("h4",{attrs:{id:"secondary-web-service-discovery-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-service-discovery-2"}},[t._v("#")]),t._v(" Secondary Web Service Discovery")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("600")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Is supported")])]),t._v(" "),e("tr",[e("td",[t._v("601")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works without authentication")])]),t._v(" "),e("tr",[e("td",[t._v("602")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Works with authentication")])]),t._v(" "),e("tr",[e("td",[t._v("603")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("Valid response with at least configuration and process_parameters per service")])]),t._v(" "),e("tr",[e("td",[t._v("604")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[t._v("title and description are provided for all services")])])])]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services-2"}},[t._v("#")]),t._v(" Secondary Web Services")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("610")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("611")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Valid response with at least services and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("612")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("613")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("All services are returned if no limit parameter is provided")])]),t._v(" "),e("tr",[e("td",[t._v("614")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("The served service metadata is valid according to the specification (id, url, type and enabled are required)")])]),t._v(" "),e("tr",[e("td",[t._v("615")]),t._v(" "),e("td",[e("code",[t._v("GET /services")]),t._v(" > services")]),t._v(" "),e("td",[t._v("title is provided for all services (if provided by the user)")])]),t._v(" "),e("tr",[e("td",[t._v("630")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports creating services (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("631")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("632")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Supports configuration parameters, rejects invalid configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("633")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > type")]),t._v(" "),e("td",[t._v("Rejects invalid types, accepts types case insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("634")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("635")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports setting a min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("636")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Supports storing title, description and enabled")])]),t._v(" "),e("tr",[e("td",[t._v("638")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[t._v("Returns HTTP status 201 and OpenEO-Identifier + Location header if successful")])]),t._v(" "),e("tr",[e("td",[t._v("650")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("651")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Returns at least id, url, type, enabled, process, configuration and attributes")])]),t._v(" "),e("tr",[e("td",[t._v("652")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("title and description are available if provided by the user")])]),t._v(" "),e("tr",[e("td",[t._v("653")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")])]),t._v(" "),e("td",[t._v("Has billing support (plan, costs, budget, usage)")])]),t._v(" "),e("tr",[e("td",[t._v("660")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")])]),t._v(" "),e("td",[t._v("Supports updating services (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("661")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Allows updating processes, but only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("662")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Supports updating configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("663")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > configuration")]),t._v(" "),e("td",[t._v("Rejects invalid configuration parameters")])]),t._v(" "),e("tr",[e("td",[t._v("664")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > type")]),t._v(" "),e("td",[t._v("Rejects invalid types, accepts types case insensitive")])]),t._v(" "),e("tr",[e("td",[t._v("665")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("666")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports updating the min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("667")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > enabled")]),t._v(" "),e("td",[t._v("Supports enabling/disabling the service")])]),t._v(" "),e("tr",[e("td",[t._v("668")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")])]),t._v(" "),e("td",[t._v("Supports updating title and description")])]),t._v(" "),e("tr",[e("td",[t._v("680")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("681")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{id}")])]),t._v(" "),e("td",[t._v("Deletes the service and returns a HTTP 204 on success, otherwise a 4XX.")])])])]),t._v(" "),e("h3",{attrs:{id:"l4-above-and-beyond"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#l4-above-and-beyond"}},[t._v("#")]),t._v(" L4: Above and Beyond")]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services-3"}},[t._v("#")]),t._v(" Secondary Web Services")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("616")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Supports on-demand web services (processing while using the service)")])]),t._v(" "),e("tr",[e("td",[t._v("617")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[t._v("Supports viewing of batch job results (processing beforehand as batch job, i.e. load_result -> save process)")])]),t._v(" "),e("tr",[e("td",[t._v("637")]),t._v(" "),e("td",[e("code",[t._v("POST /services")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable) - please provide a list of them in the comments")])]),t._v(" "),e("tr",[e("td",[t._v("654")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Correctly reflects additional properties set during service creation (or after service update)")])]),t._v(" "),e("tr",[e("td",[t._v("669")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable)")])])])]),t._v(" "),e("h4",{attrs:{id:"secondary-web-services-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#secondary-web-services-logs"}},[t._v("#")]),t._v(" Secondary Web Services > Logs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("690")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")])]),t._v(" "),e("td",[t._v("Is supported (with authentication)")])]),t._v(" "),e("tr",[e("td",[t._v("691")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > offset parameter")]),t._v(" "),e("td",[t._v("Supports query parameter offset, only returns log entries that were logged after the given offset")])]),t._v(" "),e("tr",[e("td",[t._v("692")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > level parameter")]),t._v(" "),e("td",[t._v("Supports query parameter level")])]),t._v(" "),e("tr",[e("td",[t._v("693")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > limit parameter")]),t._v(" "),e("td",[t._v("Support for pagination, incl. pagination links")])]),t._v(" "),e("tr",[e("td",[t._v("694")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")])]),t._v(" "),e("td",[t._v("Valid response with at least logs and links as arrays")])]),t._v(" "),e("tr",[e("td",[t._v("695")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > level")]),t._v(" "),e("td",[t._v("level property is available if log_level has been set for the service or the level parameter has been provided")])]),t._v(" "),e("tr",[e("td",[t._v("696")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The served log entries are valid according to the specification (id, level and message are required)")])]),t._v(" "),e("tr",[e("td",[t._v("697")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("time is supported, core and data is supported if applicable")])]),t._v(" "),e("tr",[e("td",[t._v("698")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{id}/logs")]),t._v(" > logs")]),t._v(" "),e("td",[t._v("The message is short and concise, doesn't contain full stack traces.")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-4"}},[t._v("#")]),t._v(" Batch Jobs")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("761")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > process")]),t._v(" "),e("td",[t._v("Allows updating processes, but only accepts valid process submissions")])]),t._v(" "),e("tr",[e("td",[t._v("762")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > billing")]),t._v(" "),e("td",[t._v("Has billing support (plan, budget)")])]),t._v(" "),e("tr",[e("td",[t._v("763")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > log_level")]),t._v(" "),e("td",[t._v("Supports updating the min. log level")])]),t._v(" "),e("tr",[e("td",[t._v("765")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{id}")]),t._v(" > additionalProperties")]),t._v(" "),e("td",[t._v("Accepts/supports additional properties (if applicable)")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-estimates-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-estimates-2"}},[t._v("#")]),t._v(" Batch Jobs > Estimates")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("822")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > duration")]),t._v(" "),e("td",[t._v("Supports runtime duration estimates")])]),t._v(" "),e("tr",[e("td",[t._v("823")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/estimate")]),t._v(" > size")]),t._v(" "),e("td",[t._v("Supports result file size estimates")])])])]),t._v(" "),e("h4",{attrs:{id:"batch-jobs-results-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-jobs-results-4"}},[t._v("#")]),t._v(" Batch Jobs > Results")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("#")]),t._v(" "),e("th",[t._v("Functionality")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("862")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{id}/results")]),t._v(" > partial parameter")]),t._v(" "),e("td",[t._v("Supports partial query parameter")])])])])])}),[],!1,null,null,null);e.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/45.62c3ee19.js b/assets/js/45.ad42f7c7.js similarity index 99% rename from assets/js/45.62c3ee19.js rename to assets/js/45.ad42f7c7.js index d6593f059..b80bbc9c7 100644 --- a/assets/js/45.62c3ee19.js +++ b/assets/js/45.ad42f7c7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{323:function(e,a,o){e.exports=o.p+"assets/img/processes.9a2105e4.png"},524:function(e,a,o){"use strict";o.r(a);var t=o(4),r=Object(t.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"process-profiles"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#process-profiles"}},[e._v("#")]),e._v(" Process Profiles")]),e._v(" "),a("p",[e._v('The following image provides an overview of the openEO Processes profiles.\nThe minimal profile that allows an openEO implementation to be called "openEO-compliant" is '),a("em",[e._v("L1 Minimal")]),e._v(".")]),e._v(" "),a("figure",[a("img",{attrs:{src:o(323),alt:"The hierarchy of openEO Processes profiles: L1 Minimal -> L2 Recommended (with sub-profiles) -> L2A/B Raster/Vector -> L3 Advanced (with sub-profiles) -> L4 Above and Beyond"}}),e._v(" "),a("figcaption",[e._v("An overview of the openEO Processes profiles.")])]),e._v(" "),a("ul",[a("li",[a("em",[e._v("L1 Minimal")]),e._v(" ensures that the openEO implementation has a minimal set of functionality which allow users to execute basic use-cases.")]),e._v(" "),a("li",[a("em",[e._v("L2 Recommended")]),e._v(" add functionality that we recommend to be available so that users can more effectively make use of the openEO implementation.")]),e._v(" "),a("li",[a("em",[e._v("L3 Advanced")]),e._v(" allows users to execute more advanced use cases.")]),e._v(" "),a("li",[a("em",[e._v("L4 Above and Beyond")]),e._v(" adds very specific and complex requirements for very specific and highly advanced use cases.")])]),e._v(" "),a("p",[e._v("There are various sub-profiles in L2 (e.g., L2-Date) and L3 (e.g., L3-ML) that add a specific set of functionalities centered around specific needs such as date/time manipulation or execution of machine learning workflows.")]),e._v(" "),a("p",[e._v("In the following chapter you can find a list of requirements per profile.")]),e._v(" "),a("h2",{attrs:{id:"requirements-per-profile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements-per-profile"}},[e._v("#")]),e._v(" Requirements per Profile")]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),a("p",[e._v('Missing experimental processes should (by default) lead to a "warning", but not lead to a rejection of that level in openEO.')])]),e._v(" "),a("h3",{attrs:{id:"l1-minimal"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l1-minimal"}},[e._v("#")]),e._v(" L1: Minimal")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("absolute")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("add")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("and")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("All dimensions that your datacubes can include are supported - x and y can usually be excluded")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arccos")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arcsin")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arctan")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_concat")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_create")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_element")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("between")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ceil")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("clip")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("constant")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cos")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("divide")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("e")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("eq")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("exp")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("first")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("floor")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("gt")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("gte")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("int")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("last")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ln")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("temporal_extent")]),e._v(": All temporal formats are supported (date-time and date)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("log")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("lt")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("lte")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("max")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mean")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("median")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("min")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mod")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("multiply")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("neq")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("not")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("or")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("pi")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("power")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("product")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("quantiles")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to L1) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All dimensions that your datacubes can include are supported - x and y are excluded as they are handled with reduce_spatial")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("round")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("save_result")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sd")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sgn")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sin")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sqrt")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("subtract")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sum")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("tan")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("variance")])])])]),e._v(" "),a("h3",{attrs:{id:"l2-recommended"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2-recommended"}},[e._v("#")]),e._v(" L2: Recommended")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("add_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("name")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal_period")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("period")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("all")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("any")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": Supports access to labels in the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arcosh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arctan2")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_element")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_find")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arsinh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("artanh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cosh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("count")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("dimension_labels")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("drop_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("name")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("extrema")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bbox")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")]),e._v(" "),a("li",[e._v("All temporal formats are supported (date-time and date)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("if")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("inspect")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("level")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_nan")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_nodata")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_valid")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("linear_scale_range")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("nan")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("normalized_difference")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to L2) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("rename_dimension")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("rename_labels")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All dimensions that your datacubes can include are supported - x and y can usually be excluded")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sinh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sort")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("tanh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("xor")])])])]),e._v(" "),a("h3",{attrs:{id:"l2a-recommended-raster"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2a-recommended-raster"}},[e._v("#")]),e._v(" L2A: Recommended Raster")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("aggregate_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_kernel")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("border")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bands")])]),e._v(" "),a("ul",[a("li",[e._v("Supports filtering by band name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_spatial")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("bands")]),e._v(": Supports filtering by band name and common name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mask")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mask_polygon")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])])]),e._v(" "),a("h3",{attrs:{id:"l2b-recommended-vector"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2b-recommended-vector"}},[e._v("#")]),e._v(" L2B: Recommended Vector")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("filter_vector")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_buffer")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_reproject")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l2-date-date-time-manipulation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2-date-date-time-manipulation"}},[e._v("#")]),e._v(" L2-Date: Date & Time manipulation")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("date_between")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("date_difference")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("date_shift")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l2-text-text-manipulation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2-text-text-manipulation"}},[e._v("#")]),e._v(" L2-Text: Text manipulation")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("text_begins")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("text_concat (text_merge)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("text_contains")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("text_ends")])])])]),e._v(" "),a("h3",{attrs:{id:"l3-advanced"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-advanced"}},[e._v("#")]),e._v(" L3: Advanced")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("add_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("type")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_spatial_window")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("All temporal formats are supported (date-time, date and time)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal_period")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_neighborhood")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("data")]),e._v(": All listed label types supported.")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("size")]),e._v(" / "),a("code",[e._v("overlap")]),e._v(": Units "),a("code",[e._v("m")]),e._v(", "),a("code",[e._v("px")]),e._v(" and "),a("code",[e._v("null")]),e._v(" are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_append")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_apply")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_concat")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_contains")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_create_labeled")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_filter")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_find_label")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_interpolate_linear")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_labels")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_modify")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cloud_detection")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("count")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("create_data_cube (create_raster_cube)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cummax")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cummin")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cumproduct")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cumsum")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bands")])]),e._v(" "),a("ul",[a("li",[e._v("Supports filtering by common name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_labels")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("flatten_dimensions")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_infinite")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("properties")]),e._v(": Supports querying by queryables defined via the API.")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_geojson")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_stac (load_result)")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Supports loading from STAC API - Features.")]),e._v(" "),a("li",[e._v("Supports loading from STAC API - Item Search.")]),e._v(" "),a("li",[e._v("Supports loading from static STAC.")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("temporal_extent")]),e._v(": All temporal formats are supported (date-time and date)")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("bands")]),e._v(": Supports filtering by band name and common name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("merge_cubes")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ndvi")])]),e._v(" "),a("ul",[a("li",[e._v("Supports common names as band names")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("order")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("rearrange")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_spatial")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_cube_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_cube_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("align")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("trim_cube")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("unflatten_dimensions")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_to_random_points")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_to_regular_points")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l3-ml-machine-learning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-ml-machine-learning"}},[e._v("#")]),e._v(" L3-ML: Machine Learning")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("fit_curve")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("fit_regr_random_forest")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_ml_model")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("predict_curve")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("save_ml_model")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l3-udf-user-defined-functions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-udf-user-defined-functions"}},[e._v("#")]),e._v(" L3-UDF: User-Defined Functions")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("run_udf")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("run_udf_externally")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l3-clim-cimatology"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-clim-cimatology"}},[e._v("#")]),e._v(" L3-Clim: Cimatology")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("anomaly")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("climatological_normal")])])])]),e._v(" "),a("h3",{attrs:{id:"l3-ard-analysis-ready-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-ard-analysis-ready-data"}},[e._v("#")]),e._v(" L3-ARD: Analysis-Ready Data")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("ard_normalized_radar_backscatter")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("options")]),e._v(" parameter")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ard_surface_reflectance")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("atmospheric_correction_method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("cloud_detection_method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("atmospheric_correction_options")]),e._v(" and/or "),a("code",[e._v("cloud_detection_options")]),e._v(" parameters")])])])]),e._v(" "),a("h3",{attrs:{id:"l4-above-and-beyond"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l4-above-and-beyond"}},[e._v("#")]),e._v(" L4: Above and Beyond")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("aggregate_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal_period")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_neighborhood")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_polygon (chunk_polygon)")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_apply")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("atmospheric_correction")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("options")]),e._v(" parameter")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bands")])]),e._v(" "),a("ul",[a("li",[e._v("Supports filtering by wavelength")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bbox")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("extent")]),e._v(": Supports filtering by base/height")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("spatial_extent")]),e._v(": Supports filtering by base/height")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_stac (load_result)")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("spatial_extent")]),e._v(": Supports filtering by base/height")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_uploaded_files")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_url")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_spatial")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sar_backscatter")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("coefficient")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("options")]),e._v(" parameter")])])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{324:function(e,a,o){e.exports=o.p+"assets/img/processes.9a2105e4.png"},529:function(e,a,o){"use strict";o.r(a);var t=o(4),r=Object(t.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"process-profiles"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#process-profiles"}},[e._v("#")]),e._v(" Process Profiles")]),e._v(" "),a("p",[e._v('The following image provides an overview of the openEO Processes profiles.\nThe minimal profile that allows an openEO implementation to be called "openEO-compliant" is '),a("em",[e._v("L1 Minimal")]),e._v(".")]),e._v(" "),a("figure",[a("img",{attrs:{src:o(324),alt:"The hierarchy of openEO Processes profiles: L1 Minimal -> L2 Recommended (with sub-profiles) -> L2A/B Raster/Vector -> L3 Advanced (with sub-profiles) -> L4 Above and Beyond"}}),e._v(" "),a("figcaption",[e._v("An overview of the openEO Processes profiles.")])]),e._v(" "),a("ul",[a("li",[a("em",[e._v("L1 Minimal")]),e._v(" ensures that the openEO implementation has a minimal set of functionality which allow users to execute basic use-cases.")]),e._v(" "),a("li",[a("em",[e._v("L2 Recommended")]),e._v(" add functionality that we recommend to be available so that users can more effectively make use of the openEO implementation.")]),e._v(" "),a("li",[a("em",[e._v("L3 Advanced")]),e._v(" allows users to execute more advanced use cases.")]),e._v(" "),a("li",[a("em",[e._v("L4 Above and Beyond")]),e._v(" adds very specific and complex requirements for very specific and highly advanced use cases.")])]),e._v(" "),a("p",[e._v("There are various sub-profiles in L2 (e.g., L2-Date) and L3 (e.g., L3-ML) that add a specific set of functionalities centered around specific needs such as date/time manipulation or execution of machine learning workflows.")]),e._v(" "),a("p",[e._v("In the following chapter you can find a list of requirements per profile.")]),e._v(" "),a("h2",{attrs:{id:"requirements-per-profile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements-per-profile"}},[e._v("#")]),e._v(" Requirements per Profile")]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),a("p",[e._v('Missing experimental processes should (by default) lead to a "warning", but not lead to a rejection of that level in openEO.')])]),e._v(" "),a("h3",{attrs:{id:"l1-minimal"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l1-minimal"}},[e._v("#")]),e._v(" L1: Minimal")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("absolute")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("add")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("and")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("All dimensions that your datacubes can include are supported - x and y can usually be excluded")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arccos")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arcsin")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arctan")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_concat")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_create")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_element")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("between")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ceil")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("clip")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("constant")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cos")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("divide")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("e")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("eq")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("exp")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("first")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("floor")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("gt")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("gte")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("int")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("last")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ln")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("temporal_extent")]),e._v(": All temporal formats are supported (date-time and date)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("log")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("lt")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("lte")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("max")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mean")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("median")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("min")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mod")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("multiply")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("neq")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("not")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("or")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("pi")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("power")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("product")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("quantiles")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to L1) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All dimensions that your datacubes can include are supported - x and y are excluded as they are handled with reduce_spatial")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("round")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("save_result")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sd")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sgn")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sin")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sqrt")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("subtract")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sum")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("tan")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("variance")])])])]),e._v(" "),a("h3",{attrs:{id:"l2-recommended"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2-recommended"}},[e._v("#")]),e._v(" L2: Recommended")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("add_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("name")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal_period")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("period")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("all")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("any")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": Supports access to labels in the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arcosh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arctan2")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_element")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_find")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("arsinh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("artanh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cosh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("count")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("dimension_labels")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("drop_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("name")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("extrema")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bbox")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")]),e._v(" "),a("li",[e._v("All temporal formats are supported (date-time and date)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("if")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("inspect")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("level")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_nan")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_nodata")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_valid")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("linear_scale_range")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("nan")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("normalized_difference")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to L2) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("rename_dimension")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("rename_labels")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All dimensions that your datacubes can include are supported - x and y can usually be excluded")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sinh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sort")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("tanh")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("xor")])])])]),e._v(" "),a("h3",{attrs:{id:"l2a-recommended-raster"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2a-recommended-raster"}},[e._v("#")]),e._v(" L2A: Recommended Raster")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("aggregate_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_kernel")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("border")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bands")])]),e._v(" "),a("ul",[a("li",[e._v("Supports filtering by band name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_spatial")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("bands")]),e._v(": Supports filtering by band name and common name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mask")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("mask_polygon")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])])]),e._v(" "),a("h3",{attrs:{id:"l2b-recommended-vector"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2b-recommended-vector"}},[e._v("#")]),e._v(" L2B: Recommended Vector")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("filter_vector")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_buffer")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_reproject")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l2-date-date-time-manipulation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2-date-date-time-manipulation"}},[e._v("#")]),e._v(" L2-Date: Date & Time manipulation")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("date_between")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("date_difference")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("date_shift")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l2-text-text-manipulation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l2-text-text-manipulation"}},[e._v("#")]),e._v(" L2-Text: Text manipulation")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("text_begins")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("text_concat (text_merge)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("text_contains")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("text_ends")])])])]),e._v(" "),a("h3",{attrs:{id:"l3-advanced"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-advanced"}},[e._v("#")]),e._v(" L3: Advanced")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("add_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("type")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_spatial_window")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("All temporal formats are supported (date-time, date and time)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal_period")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_neighborhood")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("data")]),e._v(": All listed label types supported.")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("size")]),e._v(" / "),a("code",[e._v("overlap")]),e._v(": Units "),a("code",[e._v("m")]),e._v(", "),a("code",[e._v("px")]),e._v(" and "),a("code",[e._v("null")]),e._v(" are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_append")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_apply")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_concat")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_contains")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_create_labeled")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_filter")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_find_label")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_interpolate_linear")])]),e._v(" "),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_labels")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_modify")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Supports labeled arrays")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cloud_detection")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("count")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("create_data_cube (create_raster_cube)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cummax")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cummin")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cumproduct")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("cumsum")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bands")])]),e._v(" "),a("ul",[a("li",[e._v("Supports filtering by common name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_labels")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("flatten_dimensions")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("is_infinite")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("properties")]),e._v(": Supports querying by queryables defined via the API.")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_geojson")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_stac (load_result)")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Supports loading from STAC API - Features.")]),e._v(" "),a("li",[e._v("Supports loading from STAC API - Item Search.")]),e._v(" "),a("li",[e._v("Supports loading from static STAC.")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("temporal_extent")]),e._v(": All temporal formats are supported (date-time and date)")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("bands")]),e._v(": Supports filtering by band name and common name")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("merge_cubes")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ndvi")])]),e._v(" "),a("ul",[a("li",[e._v("Supports common names as band names")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("order")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("rearrange")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_spatial")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the category "),a("code",[e._v("reducer")]),e._v(" that accept an array as input and return a single value as output can be used (also in a chain of processes).")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": Supports access to labels in the callback")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_cube_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_cube_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("dimension")]),e._v(": All suitable dimensions are supported")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("resample_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("align")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("trim_cube")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("unflatten_dimensions")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_to_random_points")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("vector_to_regular_points")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l3-ml-machine-learning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-ml-machine-learning"}},[e._v("#")]),e._v(" L3-ML: Machine Learning")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("fit_curve")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("fit_regr_random_forest")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_ml_model")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("predict_curve")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("save_ml_model")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l3-udf-user-defined-functions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-udf-user-defined-functions"}},[e._v("#")]),e._v(" L3-UDF: User-Defined Functions")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("run_udf")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("context")]),e._v(": is supported and passed to the callback")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("run_udf_externally")])]),e._v(" (experimental)")])]),e._v(" "),a("h3",{attrs:{id:"l3-clim-cimatology"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-clim-cimatology"}},[e._v("#")]),e._v(" L3-Clim: Cimatology")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("anomaly")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("climatological_normal")])])])]),e._v(" "),a("h3",{attrs:{id:"l3-ard-analysis-ready-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l3-ard-analysis-ready-data"}},[e._v("#")]),e._v(" L3-ARD: Analysis-Ready Data")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("ard_normalized_radar_backscatter")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("has been tested on > 100x100km at 10m resolution (or equivalent)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("options")]),e._v(" parameter")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("ard_surface_reflectance")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("atmospheric_correction_method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Parameter "),a("code",[e._v("cloud_detection_method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("atmospheric_correction_options")]),e._v(" and/or "),a("code",[e._v("cloud_detection_options")]),e._v(" parameters")])])])]),e._v(" "),a("h3",{attrs:{id:"l4-above-and-beyond"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#l4-above-and-beyond"}},[e._v("#")]),e._v(" L4: Above and Beyond")]),e._v(" "),a("ul",[a("li",[a("strong",[a("code",[e._v("aggregate_spatial")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("aggregate_temporal_period")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_neighborhood")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("apply_polygon (chunk_polygon)")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("array_apply")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("process")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("atmospheric_correction")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("method")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("options")]),e._v(" parameter")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bands")])]),e._v(" "),a("ul",[a("li",[e._v("Supports filtering by wavelength")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("filter_bbox")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("extent")]),e._v(": Supports filtering by base/height")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_collection")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("spatial_extent")]),e._v(": Supports filtering by base/height")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_stac (load_result)")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("spatial_extent")]),e._v(": Supports filtering by base/height")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_uploaded_files")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("load_url")])]),e._v(" (experimental)")]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_dimension")])]),e._v(" "),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("reduce_spatial")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("reducer")]),e._v(": At least all processes (up to the level of this requirement) in the categories "),a("code",[e._v("array")]),e._v(", "),a("code",[e._v("comparison")]),e._v(", "),a("code",[e._v("logic")]),e._v(" and "),a("code",[e._v("math")]),e._v(" can be used (also in a chain of processes).")])])]),e._v(" "),a("li",[a("strong",[a("code",[e._v("sar_backscatter")])]),e._v(" (experimental)\n"),a("ul",[a("li",[e._v("Parameter "),a("code",[e._v("coefficient")]),e._v(": "),a("code",[e._v("enum")]),e._v(" reflects implemention (all values are supported)")]),e._v(" "),a("li",[e._v("Custom parameters are provided via the "),a("code",[e._v("options")]),e._v(" parameter")])])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/46.c8389f69.js b/assets/js/46.980033df.js similarity index 99% rename from assets/js/46.c8389f69.js rename to assets/js/46.980033df.js index 0b1e2fdb6..f3dcffafe 100644 --- a/assets/js/46.c8389f69.js +++ b/assets/js/46.980033df.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{193:function(t,s,a){t.exports=a.p+"assets/img/getting-started-result-example.7820ee84.jpg"},529:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"javascript-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#javascript-client"}},[t._v("#")]),t._v(" JavaScript Client")]),t._v(" "),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),s("p",[t._v("The openEO JavaScript Client can be used in all modern browsers (excludes Internet Explorer) and all maintained Node.js versions (>= 10.x).\nIt can also been used for mobile app development with the "),s("a",{attrs:{href:"https://ionicframework.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ionic Framework"),s("OutboundLink")],1),t._v(", for example.")]),t._v(" "),s("p",[t._v("The easiest way to try out the client is using one of the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/v2.0.0/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("examples"),s("OutboundLink")],1),t._v(".\nAlternatively, you can create an HTML file and include the client with the following HTML "),s("code",[t._v("script")]),t._v(" tags:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("This gives you a minified version for production environments. If you'd like a better development experience, use the following code:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("If you are working on a Node.js application or you are using a Node.js-based build tool for web development (e.g. Webpack), you can install the client via "),s("a",{attrs:{href:"https://npmjs.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("npm"),s("OutboundLink")],1),t._v(" by using the following command:")]),t._v(" "),s("div",{staticClass:"language-shell script extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" @openeo/js-client\n")])])]),s("p",[t._v("Afterwards you can load the library. Depending on whether you are directly working in Node.js or are just using a Node.js build tool, the import can be different. Please inform yourself which import is suited for your project.")]),t._v(" "),s("p",[t._v("This is usually used directly in Node.js:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This may be used in build tools such as Webpack:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now that the installation was successfully finished, we can now connect to openEO compliant back-ends.\nIn the following chapters we quickly walk through the main features of the JavaScript client.")]),t._v(" "),s("p",[t._v("If you have trouble installing the client, feel free to "),s("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" or leave an issue at the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),s("OutboundLink")],1),t._v(".")],1),t._v(" "),s("h2",{attrs:{id:"exploring-a-back-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-back-end"}},[t._v("#")]),t._v(" Exploring a back-end")]),t._v(" "),s("p",[t._v("If you do not know an openEO back-end that you want to connect to yet, you can have a look at the "),s("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(", to find all known back-ends with information on their capabilities.")]),t._v(" "),s("p",[t._v("For this tutorial we will use the openEO instance of Google Earth Engine, which is available at "),s("code",[t._v("https://earthengine.openeo.org")]),t._v(".\nNote that the code snippets in this guide works the same way for the other back-ends listed in the openEO Hub. Just the collection identifier and band names might differ.")]),t._v(" "),s("p",[t._v("First we need to establish a connection to the back-end.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("The JavaScript client uses "),s("a",{attrs:{href:"https://medium.com/jspoint/javascript-promises-and-async-await-as-fast-as-possible-d7c8c8ff0abc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Promises (async/await)"),s("OutboundLink")],1),t._v(". So there are two ways to express the code above:")]),t._v(" "),s("p",[t._v("Promises:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("con")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("async/await:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To simplify the code here, we use async/await in all examples and don't catch errors. So we assume you run the code in an async function and also in a try/catch block.")])]),t._v(" "),s("p",[t._v("After establishing the connection to the back-end, it can be explored using the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Connection.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Connection object"),s("OutboundLink")],1),t._v(" returned. The basic service's metadata (capabilities) can be accessed via")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" info "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This allows to request a couple of "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Capabilities.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("different information"),s("OutboundLink")],1),t._v(", like API version, description, related links or the billing plans. You can print some of these information to the console as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"API Version: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Description: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Billing plans:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listPlans")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("plan")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Related links:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("links")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("link")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"collections"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),s("p",[t._v("Collections represent the basic data the back-end provides (e.g. Sentinel 2 collection).\nCollections are used as input data for job executions ("),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#eo-data-collections"}},[t._v("more info on collections")]),t._v(").\nWith the following code snippet you can print all 400+ available collection names and their summary.")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listCollections")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("collections"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("collection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("To get detailed information about a single collection, you can pass any of the collection IDs requested earlier to "),s("code",[t._v("describeCollection")]),t._v(" and get a full object of "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/tree/v1.0.0/collection-spec/collection-spec.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC compliant Collection metadata"),s("OutboundLink")],1),t._v(" back.\nIn this example we request information about the Sentinel-2 Level 1C data from Google:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The collections descriptions returned by "),s("code",[t._v("listCollections")]),t._v(" are usually not complete. To get the full set of metadata you should always use "),s("code",[t._v("describeCollection")]),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"processes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),s("p",[t._v("Processes in openEO are small tasks that can be applied on (EO) data.\nThe input of a process might be the output of another process, so that several connected processes form a new (user-defined) process itself.\nTherefore, a process resembles the smallest unit of task descriptions in openEO ("),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[t._v("more details on processes")]),t._v(").\nWith the following code snippet you can print all available process IDs and their summaries.")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("process")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In contrast to the collections, the process descriptions returned by "),s("code",[t._v("listProcesses")]),t._v(" are complete.\nThere's no need to call "),s("code",[t._v("describeProcess")]),t._v(" to get the full set of metadata.\n"),s("code",[t._v("describeProcess")]),t._v(" is just a convenience function to get a single process from "),s("code",[t._v("listProcesses")]),t._v(".\nIn this example we request the process specification for the "),s("code",[t._v("apply")]),t._v(" process:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apply"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("For a graphical overview of the openEO processes, there is an "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("online documentation")]),t._v(" for general process descriptions and the "),s("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(" for back-end specific process descriptions.")],1),t._v(" "),s("h2",{attrs:{id:"authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),s("p",[t._v("In the code snippets above, authentication is usually not necessary, since we only fetch general information about the back-end.\nTo run your own jobs at the back-end or to access job results, you need to authenticate at the back-end.")]),t._v(" "),s("p",[t._v("Depending on the back-end, there might be two different approaches to authenticate.\nYou need to inform yourself at your back-end provider of choice, which authentication approach you have to carry out.\nYou can also have a look at the "),s("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(" to see the available authentication types of the back-ends.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Recommendation")]),t._v(" "),s("p",[t._v("The Google Earth Engine implementation for openEO only supports Basic authentication, but generally the preferred authentication method is "),s("a",{attrs:{href:"#openid-connect-authentication"}},[t._v("OpenID Connect")]),t._v(" due to better security mechanisms implemented in the OpenID Connect protocol.")])]),t._v(" "),s("h3",{attrs:{id:"basic-authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#basic-authentication"}},[t._v("#")]),t._v(" Basic Authentication")]),t._v(" "),s("p",[t._v("The Basic authentication method is a common way of authenticate HTTP requests given username and password.")]),t._v(" "),s("p",[t._v("The following code snippet shows how to log in via Basic authentication:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("authenticateBasic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You can get username and password here: "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver#demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/Open-EO/openeo-earthengine-driver#demo"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("After successfully calling the "),s("code",[t._v("authenticateBasic")]),t._v(" method, you are logged into the back-end with your account.\nThis means, that every call that comes after that via the "),s("code",[t._v("con")]),t._v(" variable is executed by your user account.")]),t._v(" "),s("h3",{attrs:{id:"openid-connect-authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect-authentication"}},[t._v("#")]),t._v(" OpenID Connect Authentication")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("For Google Earth Engine, only "),s("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")])]),t._v(" "),s("p",[t._v("The OIDC ("),s("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect"),s("OutboundLink")],1),t._v(") authentication can be used to authenticate via an external service given a client ID.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),s("p",[t._v("If you have included the library using HTML "),s("code",[t._v("script")]),t._v(" tags, then you need to include the following OIDC client before the openEO client:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/oidc-client@1/lib/oidc-client.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("No further action is required, if you have installed the client via npm.")])]),t._v(" "),s("p",[t._v("As OpenID Connect authentication is a bit more complex and depends on the environment your are using it in, please refer to the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/OidcProvider.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaScript client documentation"),s("OutboundLink")],1),t._v(" for more information.")]),t._v(" "),s("h2",{attrs:{id:"creating-a-user-defined-process"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),s("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.\nFirst we need to create a user-defined process and for that a process builder is the easiest method.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("With the builder, a "),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#spatial-datacubes"}},[t._v("datacube")]),t._v(" can be initialized by selecting a collection from the back-end with the process "),s("code",[t._v("load_collection")]),t._v(":")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v('This results in a datacube containing the "COPERNICUS/S1_GRD" data restricted to the given spatial extent, the given temporal extend and the given bands .')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You can also filter the datacube at a later stage by using the following filter methods:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bbox")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Still, it is recommended to always use the filters in "),s("code",[t._v("load_collection")]),t._v(" to avoid loading too much data upfront.")])]),t._v(" "),s("p",[t._v("Having the input data ready, we want to apply a process on the datacube, which returns a datacube with the process applied:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" min"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The datacube is now reduced by the time dimension named "),s("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values.\nNow the datacube has no time dimension left.\nOther so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),s("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"batch-job-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),s("p",[t._v("After you finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process (here defined using the process builder) is called a "),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[t._v("(batch) job")]),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),s("code",[t._v("Example Title")]),t._v(".")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The "),s("code",[t._v("createJob")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now the execution of the job can be monitored by requesting the job status and the log files every once in a while (30 seconds in this example):")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n logs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("log")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("level"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The monitoring stops automatically once the job has finished, was canceled or errored out.\nBut with the return value of the "),s("code",[t._v("monitorJob")]),t._v(" function, you can also stop monitoring the job manually:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopFn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, calling "),s("code",[t._v("listResults")]),t._v(" gets you the URLs to the results.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This only works if the job execution has finished.\nWe recommend to use "),s("code",[t._v("listResults")]),t._v(" in combination with "),s("code",[t._v("monitorJob")]),t._v(", for example as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"finished"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("url")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Download result from: ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("There's also the method "),s("code",[t._v("downloadResults")]),t._v(" to download the results directly.\nUnfortunately, you can only download files from a Node.js environment where file access to your local drive is possible.\nIn a Browser environment, it is also an option to download the STAC Item or Collection for the results using the "),s("code",[t._v("getResultsAsStac")]),t._v(" method and point a "),s("a",{attrs:{href:"https://stacindex.org/ecosystem?category=Client",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC client"),s("OutboundLink")],1),t._v(" to it for downloading.")])]),t._v(" "),s("p",[t._v("Now you know the general workflow of job executions.")]),t._v(" "),s("h2",{attrs:{id:"full-example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#full-example"}},[t._v("#")]),t._v(" Full Example")]),t._v(" "),s("p",[t._v("In this chapter we will show a full example of an earth observation use case using the JavaScript client in a Node.js environment and the Google Earth Engine back-end.\nInstead of batch job processing, we compute the image synchronously. Synchronous processing means the result is directly returned in the response, which usually works only for smaller amounts of data.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Use Case")]),t._v(" "),s("p",[t._v("We want to produce a monthly RGB composite of Sentinel 1 backscatter data over the area of Vienna, Austria for three\nmonths in 2017. This can be used for classification and crop monitoring.")])]),t._v(" "),s("p",[t._v("In the following code example, we use inline code comments to describe what we are doing.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("The username and password in the example above work at the time of writing, but may be invalid at the time you read this. Please "),s("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" for credentials.")],1)]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Make the client available to the Node.js script")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Also include the Formula library for simple math expressions")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Formula "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("example")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Connect to the back-end")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Authenticate ourselves via Basic authentication")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("authenticateBasic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group11"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test123"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a process builder")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We are now loading the Sentinel-1 data over the Area of Interest")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since we are creating a monthly RGB composite, we need three separated time ranges (March aas R, April as G and May as G).")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Therefore, we split the datacube into three datacubes using a temporal filter.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" march "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" april "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" may "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We aggregate the timeseries values into a single image by reducing the time dimension using a mean reducer.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("mean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n march "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("march"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n april "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("april"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n may "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("may"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Now the three images will be combined into the temporal composite.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We rename the bands to R, G and B as otherwise the bands are overlapping and the merge process would fail.")]),t._v("\n march "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("march"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n april "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("april"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n may "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("may"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge_cubes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("march"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" april"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge_cubes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" may"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To make the values match the RGB values from 0 to 255 in a PNG file, we need to scale them.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We can simplify expressing math formulas using the openEO Formula parser.")]),t._v("\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"linear_scale_range(x, -20, -5, 0, 255)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finally, save the result as PNG file.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// In the options we specify which band should be used for "red", "green" and "blue" color.')]),t._v("\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PNG"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("red")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("green")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("blue")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Now send the processing instructions to the back-end for (synchronous) execution and save the file as result.png")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("downloadResult")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Run the example, write errors to the console.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("example")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now the resulting PNG file of the RGB backscatter composite is stored as "),s("code",[t._v("result.png")]),t._v(" in the node.JS working directory and should look as follows:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(193),alt:"RGB composite"}})]),t._v(" "),s("h2",{attrs:{id:"user-defined-functions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[t._v("#")]),t._v(" User Defined Functions")]),t._v(" "),s("p",[t._v("If your use case can not be accomplished with the "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("default processes")]),t._v(" of openEO, you can define a "),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#user-defined-function-udf"}},[t._v("user defined function")]),t._v(".\nUnfortunately, you can only create Python and R functions at the moment.\nTherefore, this guide doesn't get into detail.\nFor more information check out the Python or R tutorials on UDFs.")],1),t._v(" "),s("h2",{attrs:{id:"additional-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Examples"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{193:function(t,s,a){t.exports=a.p+"assets/img/getting-started-result-example.7820ee84.jpg"},528:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"javascript-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#javascript-client"}},[t._v("#")]),t._v(" JavaScript Client")]),t._v(" "),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),s("p",[t._v("The openEO JavaScript Client can be used in all modern browsers (excludes Internet Explorer) and all maintained Node.js versions (>= 10.x).\nIt can also been used for mobile app development with the "),s("a",{attrs:{href:"https://ionicframework.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ionic Framework"),s("OutboundLink")],1),t._v(", for example.")]),t._v(" "),s("p",[t._v("The easiest way to try out the client is using one of the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/v2.0.0/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("examples"),s("OutboundLink")],1),t._v(".\nAlternatively, you can create an HTML file and include the client with the following HTML "),s("code",[t._v("script")]),t._v(" tags:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("This gives you a minified version for production environments. If you'd like a better development experience, use the following code:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/axios@0.21/dist/axios.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/@openeo/js-client@2/openeo.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("If you are working on a Node.js application or you are using a Node.js-based build tool for web development (e.g. Webpack), you can install the client via "),s("a",{attrs:{href:"https://npmjs.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("npm"),s("OutboundLink")],1),t._v(" by using the following command:")]),t._v(" "),s("div",{staticClass:"language-shell script extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" @openeo/js-client\n")])])]),s("p",[t._v("Afterwards you can load the library. Depending on whether you are directly working in Node.js or are just using a Node.js build tool, the import can be different. Please inform yourself which import is suited for your project.")]),t._v(" "),s("p",[t._v("This is usually used directly in Node.js:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This may be used in build tools such as Webpack:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now that the installation was successfully finished, we can now connect to openEO compliant back-ends.\nIn the following chapters we quickly walk through the main features of the JavaScript client.")]),t._v(" "),s("p",[t._v("If you have trouble installing the client, feel free to "),s("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" or leave an issue at the "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),s("OutboundLink")],1),t._v(".")],1),t._v(" "),s("h2",{attrs:{id:"exploring-a-back-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-back-end"}},[t._v("#")]),t._v(" Exploring a back-end")]),t._v(" "),s("p",[t._v("If you do not know an openEO back-end that you want to connect to yet, you can have a look at the "),s("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(", to find all known back-ends with information on their capabilities.")]),t._v(" "),s("p",[t._v("For this tutorial we will use the openEO instance of Google Earth Engine, which is available at "),s("code",[t._v("https://earthengine.openeo.org")]),t._v(".\nNote that the code snippets in this guide works the same way for the other back-ends listed in the openEO Hub. Just the collection identifier and band names might differ.")]),t._v(" "),s("p",[t._v("First we need to establish a connection to the back-end.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("The JavaScript client uses "),s("a",{attrs:{href:"https://medium.com/jspoint/javascript-promises-and-async-await-as-fast-as-possible-d7c8c8ff0abc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Promises (async/await)"),s("OutboundLink")],1),t._v(". So there are two ways to express the code above:")]),t._v(" "),s("p",[t._v("Promises:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("con")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("async/await:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Success")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Error")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To simplify the code here, we use async/await in all examples and don't catch errors. So we assume you run the code in an async function and also in a try/catch block.")])]),t._v(" "),s("p",[t._v("After establishing the connection to the back-end, it can be explored using the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Connection.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Connection object"),s("OutboundLink")],1),t._v(" returned. The basic service's metadata (capabilities) can be accessed via")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" info "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("This allows to request a couple of "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Capabilities.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("different information"),s("OutboundLink")],1),t._v(", like API version, description, related links or the billing plans. You can print some of these information to the console as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"API Version: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Description: "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Billing plans:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listPlans")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("plan")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("plan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Related links:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ninfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("links")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("link")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("title"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"collections"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),s("p",[t._v("Collections represent the basic data the back-end provides (e.g. Sentinel 2 collection).\nCollections are used as input data for job executions ("),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#eo-data-collections"}},[t._v("more info on collections")]),t._v(").\nWith the following code snippet you can print all 400+ available collection names and their summary.")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listCollections")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("collections"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("collection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("To get detailed information about a single collection, you can pass any of the collection IDs requested earlier to "),s("code",[t._v("describeCollection")]),t._v(" and get a full object of "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/tree/v1.0.0/collection-spec/collection-spec.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC compliant Collection metadata"),s("OutboundLink")],1),t._v(" back.\nIn this example we request information about the Sentinel-2 Level 1C data from Google:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The collections descriptions returned by "),s("code",[t._v("listCollections")]),t._v(" are usually not complete. To get the full set of metadata you should always use "),s("code",[t._v("describeCollection")]),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"processes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),s("p",[t._v("Processes in openEO are small tasks that can be applied on (EO) data.\nThe input of a process might be the output of another process, so that several connected processes form a new (user-defined) process itself.\nTherefore, a process resembles the smallest unit of task descriptions in openEO ("),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[t._v("more details on processes")]),t._v(").\nWith the following code snippet you can print all available process IDs and their summaries.")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Available Collections:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" response "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nresponse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("process")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("summary"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("In contrast to the collections, the process descriptions returned by "),s("code",[t._v("listProcesses")]),t._v(" are complete.\nThere's no need to call "),s("code",[t._v("describeProcess")]),t._v(" to get the full set of metadata.\n"),s("code",[t._v("describeProcess")]),t._v(" is just a convenience function to get a single process from "),s("code",[t._v("listProcesses")]),t._v(".\nIn this example we request the process specification for the "),s("code",[t._v("apply")]),t._v(" process:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"apply"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("For a graphical overview of the openEO processes, there is an "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("online documentation")]),t._v(" for general process descriptions and the "),s("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(" for back-end specific process descriptions.")],1),t._v(" "),s("h2",{attrs:{id:"authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),s("p",[t._v("In the code snippets above, authentication is usually not necessary, since we only fetch general information about the back-end.\nTo run your own jobs at the back-end or to access job results, you need to authenticate at the back-end.")]),t._v(" "),s("p",[t._v("Depending on the back-end, there might be two different approaches to authenticate.\nYou need to inform yourself at your back-end provider of choice, which authentication approach you have to carry out.\nYou can also have a look at the "),s("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),s("OutboundLink")],1),t._v(" to see the available authentication types of the back-ends.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Recommendation")]),t._v(" "),s("p",[t._v("The Google Earth Engine implementation for openEO only supports Basic authentication, but generally the preferred authentication method is "),s("a",{attrs:{href:"#openid-connect-authentication"}},[t._v("OpenID Connect")]),t._v(" due to better security mechanisms implemented in the OpenID Connect protocol.")])]),t._v(" "),s("h3",{attrs:{id:"basic-authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#basic-authentication"}},[t._v("#")]),t._v(" Basic Authentication")]),t._v(" "),s("p",[t._v("The Basic authentication method is a common way of authenticate HTTP requests given username and password.")]),t._v(" "),s("p",[t._v("The following code snippet shows how to log in via Basic authentication:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("authenticateBasic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You can get username and password here: "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver#demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/Open-EO/openeo-earthengine-driver#demo"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("After successfully calling the "),s("code",[t._v("authenticateBasic")]),t._v(" method, you are logged into the back-end with your account.\nThis means, that every call that comes after that via the "),s("code",[t._v("con")]),t._v(" variable is executed by your user account.")]),t._v(" "),s("h3",{attrs:{id:"openid-connect-authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect-authentication"}},[t._v("#")]),t._v(" OpenID Connect Authentication")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("For Google Earth Engine, only "),s("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")])]),t._v(" "),s("p",[t._v("The OIDC ("),s("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect"),s("OutboundLink")],1),t._v(") authentication can be used to authenticate via an external service given a client ID.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),s("p",[t._v("If you have included the library using HTML "),s("code",[t._v("script")]),t._v(" tags, then you need to include the following OIDC client before the openEO client:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://cdn.jsdelivr.net/npm/oidc-client@1/lib/oidc-client.min.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("No further action is required, if you have installed the client via npm.")])]),t._v(" "),s("p",[t._v("As OpenID Connect authentication is a bit more complex and depends on the environment your are using it in, please refer to the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/OidcProvider.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("JavaScript client documentation"),s("OutboundLink")],1),t._v(" for more information.")]),t._v(" "),s("h2",{attrs:{id:"creating-a-user-defined-process"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),s("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.\nFirst we need to create a user-defined process and for that a process builder is the easiest method.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("With the builder, a "),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#spatial-datacubes"}},[t._v("datacube")]),t._v(" can be initialized by selecting a collection from the back-end with the process "),s("code",[t._v("load_collection")]),t._v(":")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v('This results in a datacube containing the "COPERNICUS/S1_GRD" data restricted to the given spatial extent, the given temporal extend and the given bands .')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You can also filter the datacube at a later stage by using the following filter methods:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bbox")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_bands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Still, it is recommended to always use the filters in "),s("code",[t._v("load_collection")]),t._v(" to avoid loading too much data upfront.")])]),t._v(" "),s("p",[t._v("Having the input data ready, we want to apply a process on the datacube, which returns a datacube with the process applied:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("min")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ndatacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" min"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The datacube is now reduced by the time dimension named "),s("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values.\nNow the datacube has no time dimension left.\nOther so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),s("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"batch-job-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),s("p",[t._v("After you finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process (here defined using the process builder) is called a "),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[t._v("(batch) job")]),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),s("code",[t._v("Example Title")]),t._v(".")],1),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The "),s("code",[t._v("createJob")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now the execution of the job can be monitored by requesting the job status and the log files every once in a while (30 seconds in this example):")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n logs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("log")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("level"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(": ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("log"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The monitoring stops automatically once the job has finished, was canceled or errored out.\nBut with the return value of the "),s("code",[t._v("monitorJob")]),t._v(" function, you can also stop monitoring the job manually:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stopFn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("When the job is finished, calling "),s("code",[t._v("listResults")]),t._v(" gets you the URLs to the results.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This only works if the job execution has finished.\nWe recommend to use "),s("code",[t._v("listResults")]),t._v(" in combination with "),s("code",[t._v("monitorJob")]),t._v(", for example as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" stopFn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("monitorJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"finished"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" urls "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("url")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Download result from: ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("href"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("There's also the method "),s("code",[t._v("downloadResults")]),t._v(" to download the results directly.\nUnfortunately, you can only download files from a Node.js environment where file access to your local drive is possible.\nIn a Browser environment, it is also an option to download the STAC Item or Collection for the results using the "),s("code",[t._v("getResultsAsStac")]),t._v(" method and point a "),s("a",{attrs:{href:"https://stacindex.org/ecosystem?category=Client",target:"_blank",rel:"noopener noreferrer"}},[t._v("STAC client"),s("OutboundLink")],1),t._v(" to it for downloading.")])]),t._v(" "),s("p",[t._v("Now you know the general workflow of job executions.")]),t._v(" "),s("h2",{attrs:{id:"full-example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#full-example"}},[t._v("#")]),t._v(" Full Example")]),t._v(" "),s("p",[t._v("In this chapter we will show a full example of an earth observation use case using the JavaScript client in a Node.js environment and the Google Earth Engine back-end.\nInstead of batch job processing, we compute the image synchronously. Synchronous processing means the result is directly returned in the response, which usually works only for smaller amounts of data.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Use Case")]),t._v(" "),s("p",[t._v("We want to produce a monthly RGB composite of Sentinel 1 backscatter data over the area of Vienna, Austria for three\nmonths in 2017. This can be used for classification and crop monitoring.")])]),t._v(" "),s("p",[t._v("In the following code example, we use inline code comments to describe what we are doing.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("The username and password in the example above work at the time of writing, but may be invalid at the time you read this. Please "),s("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" for credentials.")],1)]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Make the client available to the Node.js script")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Also include the Formula library for simple math expressions")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Formula "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'@openeo/js-client'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("example")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Connect to the back-end")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Authenticate ourselves via Basic authentication")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("authenticateBasic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group11"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test123"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a process builder")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcess")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We are now loading the Sentinel-1 data over the Area of Interest")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("load_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since we are creating a monthly RGB composite, we need three separated time ranges (March aas R, April as G and May as G).")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Therefore, we split the datacube into three datacubes using a temporal filter.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" march "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" april "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" may "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter_temporal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We aggregate the timeseries values into a single image by reducing the time dimension using a mean reducer.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("mean")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n march "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("march"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n april "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("april"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n may "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce_dimension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("may"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Now the three images will be combined into the temporal composite.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We rename the bands to R, G and B as otherwise the bands are overlapping and the merge process would fail.")]),t._v("\n march "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("march"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n april "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("april"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n may "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rename_labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("may"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge_cubes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("march"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" april"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("merge_cubes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" may"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To make the values match the RGB values from 0 to 255 in a PNG file, we need to scale them.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We can simplify expressing math formulas using the openEO Formula parser.")]),t._v("\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("builder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Formula")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"linear_scale_range(x, -20, -5, 0, 255)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finally, save the result as PNG file.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// In the options we specify which band should be used for "red", "green" and "blue" color.')]),t._v("\n datacube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("save_result")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PNG"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("red")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("green")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("blue")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Now send the processing instructions to the back-end for (synchronous) execution and save the file as result.png")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("downloadResult")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datacube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Run the example, write errors to the console.")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("example")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("catch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("error")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now the resulting PNG file of the RGB backscatter composite is stored as "),s("code",[t._v("result.png")]),t._v(" in the node.JS working directory and should look as follows:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(193),alt:"RGB composite"}})]),t._v(" "),s("h2",{attrs:{id:"user-defined-functions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[t._v("#")]),t._v(" User Defined Functions")]),t._v(" "),s("p",[t._v("If your use case can not be accomplished with the "),s("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("default processes")]),t._v(" of openEO, you can define a "),s("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#user-defined-function-udf"}},[t._v("user defined function")]),t._v(".\nUnfortunately, you can only create Python and R functions at the moment.\nTherefore, this guide doesn't get into detail.\nFor more information check out the Python or R tutorials on UDFs.")],1),t._v(" "),s("h2",{attrs:{id:"additional-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Examples"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/47.1ef9a29e.js b/assets/js/47.2743281b.js similarity index 99% rename from assets/js/47.1ef9a29e.js rename to assets/js/47.2743281b.js index 16e1bfa2d..ccf0e5704 100644 --- a/assets/js/47.1ef9a29e.js +++ b/assets/js/47.2743281b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{193:function(t,e,a){t.exports=a.p+"assets/img/getting-started-result-example.7820ee84.jpg"},530:function(t,e,a){"use strict";a.r(e);var n=a(4),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"python-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#python-client"}},[t._v("#")]),t._v(" Python Client")]),t._v(" "),e("p",[t._v("This Getting Started guide will give you just a simple overview of the capabilities of the openEO Python client library.\nMore in-depth information can be found in its "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("The openEO Python client library is available on "),e("a",{attrs:{href:"https://pypi.org/project/openeo/",target:"_blank",rel:"noopener noreferrer"}},[t._v("PyPI"),e("OutboundLink")],1),t._v("\nand can easily be installed with a tool like "),e("code",[t._v("pip")]),t._v(", for example:")]),t._v(" "),e("div",{staticClass:"language-shell script extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("pip "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openeo\n")])])]),e("p",[t._v("The client library is also available on "),e("a",{attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Conda Forge"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("It's recommended to work in a virtual environment of some kind ("),e("code",[t._v("venv")]),t._v(", "),e("code",[t._v("conda")]),t._v(", ...),\ncontaining Python 3.6 or higher.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("For more details, alternative installation procedures or troubleshooting tips:\nsee the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/installation.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official "),e("code",[t._v("openeo")]),t._v(" package installation documentation"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"exploring-a-back-end"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-back-end"}},[t._v("#")]),t._v(" Exploring a back-end")]),t._v(" "),e("p",[t._v("If you do not know an openEO back-end that you want to connect to yet, you can have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(", to find all known back-ends with information on their capabilities.")]),t._v(" "),e("p",[t._v("For this tutorial we will use the openEO instance of Google Earth Engine, which is available at "),e("code",[t._v("https://earthengine.openeo.org")]),t._v(".\nNote that the code snippets in this guide work the same way for the other back-ends listed in the openEO Hub. Just the collection identifier and band names might differ.")]),t._v(" "),e("p",[t._v("First we need to establish a connection to the back-end.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\nconnection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#module-openeo.rest.connection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection")]),t._v(" object"),e("OutboundLink")],1),t._v("\nis your central gateway to")]),t._v(" "),e("ul",[e("li",[t._v("list data collections, available processes, file formats and other capabilities of the back-end")]),t._v(" "),e("li",[t._v("start building your openEO algorithm from the desired data on the back-end")]),t._v(" "),e("li",[t._v("execute and monitor (batch) jobs on the back-end")]),t._v(" "),e("li",[t._v("etc.")])]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v('The EO data available at a back-end is organised in so-called collections.\nFor example, a back-end might provide fundamental satellite collections like "Sentinel 1" or "Sentinel 2",\nor preprocessed collections like "NDVI".\nCollections are used as input data for your openEO jobs.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('More information on how openEO "collections" relate to terminology used in other systems can be found in\n('),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#eo-data-collections"}},[t._v("the openEO glossary")]),t._v(").")],1)]),t._v(" "),e("p",[t._v("Let's list all available collections on the back-end,\nusing "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_collections",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_collections")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("which returns list of collection metadata dictionaries, e.g. something like:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[{'id': 'AGERA5', 'title': 'ECMWF AGERA5 meteo dataset', 'description': 'Daily surface meteorolociga datal ...', ...},\n {'id': 'SENTINEL2_L2A_SENTINELHUB', 'title': 'Sentinel-2 top of canopy', ...},\n {'id': 'SENTINEL1_GRD', ...},\n ...]\n")])])]),e("p",[t._v("This listing includes basic metadata for each collection.\nIf necessary, a more detailed metadata listing for a given collection can be obtained with\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.describe_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("describe_collection")]),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Programmatically listing collections is just a very simple usage example of the Python client.\nIn reality, you probably want to look up or inspect available collections in a web based overview such as the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v('Processes in openEO are operations that can be applied on (EO) data\n(e.g. calculate the mean of an array, or mask out observations outside a given polygon).\nThe output of one process can be used as the input of another process,\nand by doing so, multiple processes can be connected that way in a larger "process graph":\na new (user-defined) processes that implements a certain algorithm.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Check "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[t._v("the openEO glossary")]),t._v("\nfor more details on pre-defined, user-defined processes and process graphs.")],1)]),t._v(" "),e("p",[t._v("Let's list the (pre-defined) processes available on the back-end\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_processes",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_processes")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("which returns a list of dictionaries describing the process (including expected arguments and return type), e.g.:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[{'id': 'absolute', 'summary': 'Absolute value', 'description': 'Computes the absolute value of a real number `x`, which is th...', \n {'id': 'mean', 'summary': 'Arithmetic mean(average)', ...}\n ...]\n")])])]),e("p",[t._v("Like with collections, instead of programmatic exploration you'll probably prefer a web-based overview such as the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" for back-end specific process descriptions\nor browse the "),e("a",{attrs:{href:"https://processes.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("reference specifications of openEO processes"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above we did not need to log in\nsince we just queried publicly available back-end information.\nHowever, to run non-trivial processing queries one has to authenticate\nso that permissions, resource usage, etc. can be managed properly.")]),t._v(" "),e("p",[t._v("Depending on the back-end, there might be two different approaches to authenticate.\nYou need to inform yourself at your back-end provider of choice, which authentication approach you have to carry out.\nYou can also have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" to see the available authentication types of the back-ends.")]),t._v(" "),e("p",[t._v("A detailed description of why and how to use the authentication methods is on the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html#authentication-and-account-management",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Recommendation")]),t._v(" "),e("p",[t._v("The Google Earth Engine implementation for openEO only supports Basic authentication, but generally the preferred authentication method is "),e("a",{attrs:{href:"#openid-connect-authentication"}},[t._v("OpenID Connect")]),t._v(" due to better security mechanisms implemented in the OpenID Connect protocol.")])]),t._v(" "),e("h3",{attrs:{id:"basic-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-authentication"}},[t._v("#")]),t._v(" Basic Authentication")]),t._v(" "),e("p",[t._v("The Basic authentication method is a common way of authenticate HTTP requests given username and password.")]),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via Basic authentication:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Authenticate with Basic authentication"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconnection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_basic"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can get username and password here: "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver#demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/Open-EO/openeo-earthengine-driver#demo"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("After successfully calling the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.authenticate_basic",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("authenticate_basic")]),e("OutboundLink")],1),t._v(" method, you are logged into the back-end with your account.")]),t._v(" "),e("p",[t._v("This means, that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h3",{attrs:{id:"openid-connect-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect-authentication"}},[t._v("#")]),t._v(" OpenID Connect Authentication")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("For Google Earth Engine, only "),e("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")])]),t._v(" "),e("p",[t._v("The OIDC ("),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect"),e("OutboundLink")],1),t._v(") authentication can be used to authenticate via an external service given a client ID.\nThe following code snippet shows how to log in via OIDC authentication:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Authenticate with OIDC authentication"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconnection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method opens your system web browser, with which you can authenticate yourself on the back-end authentication system.\nAfter that the website will give you the instructions to go back to the python client, where your connection has logged your account in.\nThis means that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h2",{attrs:{id:"working-with-datacube"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#working-with-datacube"}},[t._v("#")]),t._v(" Working with Datacube")]),t._v(" "),e("p",[t._v("Now that we know how to discover the capabilities of the back-end and how to authenticate,\nlet's do some real work and process some EO data in a batch job.\nWe'll build the desired algorithm by working on so-called \"Datacubes\",\nwhich is the central concept in openEO to represent EO data,\nas "),e("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html"}},[t._v("discussed in great detail here")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"creating-a-datacube"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-datacube"}},[t._v("#")]),t._v(" Creating a Datacube")]),t._v(" "),e("p",[t._v("The first step is loading the desired slice of a data collection\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.load_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection.load_collection")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Datacube")]),t._v(" object"),e("OutboundLink")],1),t._v('\ncontaining the "SENTINEL1_GRD" data restricted to the given spatial extent,\nthe given temporal extend and the given bands .')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can also filter the datacube step by step or at a later stage by using the following filter methods:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("start_date"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" end_date"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Still, it is recommended to always use the filters directly in "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.load_collection",target:"_blank",rel:"noopener noreferrer"}},[t._v("load_collection"),e("OutboundLink")],1),t._v("\nto avoid loading too much data upfront.")])]),t._v(" "),e("h3",{attrs:{id:"applying-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#applying-processes"}},[t._v("#")]),t._v(" Applying processes")]),t._v(" "),e("p",[t._v("By applying an openEO process on a datacube, we create a new datacube object that represents the manipulated data.\nThe standard way to do this with the Python client is to call the appropriate "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Datacube")]),t._v(" object"),e("OutboundLink")],1),t._v(" method.\nThe most common or popular openEO processes have a dedicated "),e("code",[t._v("Datacube")]),t._v(" method (e.g. "),e("code",[t._v("mask")]),t._v(", "),e("code",[t._v("aggregate_spatial")]),t._v(", "),e("code",[t._v("filter_bbox")]),t._v(", ...).\nOther processes without a dedicated method can still be applied in a generic way.\nAn on top of that, there are also some convenience methods that implement\nopenEO processes is a compact, Pythonic interface.")]),t._v(" "),e("p",[t._v("For example, the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.min_time",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("min_time")]),e("OutboundLink")],1),t._v(" method\nimplements a "),e("code",[t._v("reduce_dimension")]),t._v(" process along the temporal dimension, using the "),e("code",[t._v("min")]),t._v(" process as reducer function:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("min_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This creates a new datacube (we overwrite the existing variable),\nwhere the time dimension is eliminated and for each pixel we just have\nthe minimum value of the corresponding timeseries in the original datacube.")]),t._v(" "),e("p",[t._v("See the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client "),e("code",[t._v("Datacube")]),t._v(" API"),e("OutboundLink")],1),t._v(" for a more complete listing of methods that implement openEO processes.")]),t._v(" "),e("p",[t._v("openEO processes that are not supported by a dedicated "),e("code",[t._v("Datacube")]),t._v(" method\ncan be applied in a generic way with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.process",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("process")]),t._v(" method"),e("OutboundLink")],1),t._v(", e.g.:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n process_id"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ndvi"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n arguments"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This applies the "),e("a",{attrs:{href:"https://docs.openeo.cloud/processes/#ndvi",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("ndvi")]),t._v(" process"),e("OutboundLink")],1),t._v(' to the datacube with the arguments of "data", "nir" and "red" (This example assumes a datacube with bands '),e("code",[t._v("B8")]),t._v(" and "),e("code",[t._v("B4")]),t._v(").")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Still unsure on how to make use of processes with the Python client?\nVisit the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html#working-with-processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation on working with processes"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"defining-output-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#defining-output-format"}},[t._v("#")]),t._v(" Defining output format")]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("result "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#execution"}},[t._v("#")]),t._v(" Execution")]),t._v(" "),e("p",[t._v("It's important to note that all the datacube processes we applied up to this point\nare not actually executed yet, neither locally nor remotely on the back-end.\nWe just built an abstract representation of the algorithm (input data and processing chain),\nencapsulated in a local "),e("code",[t._v("Datacube")]),t._v(" object (e.g. the "),e("code",[t._v("result")]),t._v(" variable above).\nTo trigger an actual execution (on the back-end) we have to explicitly send this representation\nto the back-end.")]),t._v(" "),e("p",[t._v("openEO defines "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[t._v("several processing modes")]),t._v(",\nbut for this introduction we'll focus on batch jobs, which is a good default choice.")],1),t._v(" "),e("h3",{attrs:{id:"batch-job-execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-execution"}},[t._v("#")]),t._v(" Batch job execution")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("result")]),t._v(" datacube object we built above describes the desired input collections, processing steps and output format.\nWe can now just send this description to the back-end to create a batch job with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.create_job",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("create_job")]),t._v(" method"),e("OutboundLink")],1),t._v(" like this:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Creating a new job at the back-end by sending the datacube information.")]),t._v("\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The batch job, which is referenced by the returned "),e("code",[t._v("job")]),t._v(" object, is just created at the back-end,\nit is not started yet.\nTo start the job and let your Python script wait until the job has finished then\ndownload it automatically, you can use the "),e("code",[t._v("start_and_wait")]),t._v(" method.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Starts the job and waits until it finished to download the result.")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v('When everything completes successfully, the processing result will be downloaded as a GeoTIFF file\nin a folder "output".')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The official openEO Python Client documentation has more information\non "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/basics.html#managing-jobs-in-openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("batch job basics"),e("OutboundLink")],1),t._v("\nor "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/batch_jobs.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("more detailed batch job (result) management"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"full-example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-example"}},[t._v("#")]),t._v(" Full Example")]),t._v(" "),e("p",[t._v("In this chapter we will show a full example of an earth observation use case using the Python client and the Google Earth Engine back-end.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Use Case")]),t._v(" "),e("p",[t._v("We want to produce a monthly RGB composite of Sentinel 1 backscatter data over the area of Vienna, Austria for three\nmonths in 2017. This can be used for classification and crop monitoring.")])]),t._v(" "),e("p",[t._v("In the following code example, we use inline code comments to describe what we are doing.")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The username and password in the example above work at the time of writing, but may be invalid at the time you read this. Please "),e("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" for credentials.")],1)]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# First, we connect to the back-end and authenticate ourselves via Basic authentication. ")]),t._v("\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_basic"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group11"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test123"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Now that we are connected, we can initialize our datacube object with the area around Vienna ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# and the time range of interest using Sentinel 1 data.")]),t._v("\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Since we are creating a monthly RGB composite, we need three (R, G and B) separated time ranges.")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Therefore, we split the datacube into three datacubes by filtering temporal for March, April and May. ")]),t._v("\nmarch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\napril "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmay "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Now that we split it into the correct time range, we have to aggregate the timeseries values into a single image.")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Therefore, we make use of the Python Client function `mean_time`, which reduces the time dimension, ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# by taking for every timeseries the mean value.")]),t._v("\n\nmean_march "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmean_april "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmean_may "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Now the three images will be combined into the temporal composite. ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Before merging them into one datacube, we need to rename the bands of the images, because otherwise, ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# they would be overwritten in the merging process. ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Therefore, we rename the bands of the datacubes using the `rename_labels` process to "R", "G" and "B".')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# After that we merge them into the "RGB" datacube, which has now three bands ("R", "G" and "B")')]),t._v("\n\nR_band "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mean_march"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nG_band "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mean_april"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB_band "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mean_may"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nRG "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R_band"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("G_band"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nRGB "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" RG"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B_band"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Last but not least, we add the process to save the result of the processing. There we define that ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# the result should be a GeoTiff file.")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# We also set, which band should be used for "red", "green" and "blue" color in the options.')]),t._v("\n\nRGB "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" RGB"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTIFF-THUMB"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# With the last process we have finished the datacube definition and can create and start the job at the back-end.")]),t._v("\n\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" RGB"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Now the resulting GTiff file of the RGB backscatter composite is in your current directory.")]),t._v(" "),e("p",[e("img",{attrs:{src:a(193),alt:"RGB composite"}})]),t._v(" "),e("p",[t._v("The "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/blob/c21b928ab5f4b4561bb07b7c4a934f0ea9b4f0b8/examples/gee_uc1_temp.py",target:"_blank",rel:"noopener noreferrer"}},[t._v("source code"),e("OutboundLink")],1),t._v(" of this example can be found on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"user-defined-functions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[t._v("#")]),t._v(" User Defined Functions")]),t._v(" "),e("p",[t._v("If your use case can not be accomplished with the "),e("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("default processes")]),t._v(" of openEO, you can define a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#user-defined-function-udf"}},[t._v("user defined function")]),t._v(".\nTherefore, you can create a Python function that will be executed at the back-end and functions as a process in your process graph.")],1),t._v(" "),e("p",[t._v("Detailed information about Python UDFs can be found in the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/udf.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(" as well as examples in the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client repository"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"additional-information"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),e("p",[t._v("Additional information and resources about the openEO Python Client Library:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example scripts"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Jupyter Notebooks"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openEO Python Client Library Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository on GitHub"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{193:function(t,e,a){t.exports=a.p+"assets/img/getting-started-result-example.7820ee84.jpg"},532:function(t,e,a){"use strict";a.r(e);var n=a(4),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"python-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#python-client"}},[t._v("#")]),t._v(" Python Client")]),t._v(" "),e("p",[t._v("This Getting Started guide will give you just a simple overview of the capabilities of the openEO Python client library.\nMore in-depth information can be found in its "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("The openEO Python client library is available on "),e("a",{attrs:{href:"https://pypi.org/project/openeo/",target:"_blank",rel:"noopener noreferrer"}},[t._v("PyPI"),e("OutboundLink")],1),t._v("\nand can easily be installed with a tool like "),e("code",[t._v("pip")]),t._v(", for example:")]),t._v(" "),e("div",{staticClass:"language-shell script extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("pip "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openeo\n")])])]),e("p",[t._v("The client library is also available on "),e("a",{attrs:{href:"https://anaconda.org/conda-forge/openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Conda Forge"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("It's recommended to work in a virtual environment of some kind ("),e("code",[t._v("venv")]),t._v(", "),e("code",[t._v("conda")]),t._v(", ...),\ncontaining Python 3.6 or higher.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("For more details, alternative installation procedures or troubleshooting tips:\nsee the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/installation.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official "),e("code",[t._v("openeo")]),t._v(" package installation documentation"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"exploring-a-back-end"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-back-end"}},[t._v("#")]),t._v(" Exploring a back-end")]),t._v(" "),e("p",[t._v("If you do not know an openEO back-end that you want to connect to yet, you can have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(", to find all known back-ends with information on their capabilities.")]),t._v(" "),e("p",[t._v("For this tutorial we will use the openEO instance of Google Earth Engine, which is available at "),e("code",[t._v("https://earthengine.openeo.org")]),t._v(".\nNote that the code snippets in this guide work the same way for the other back-ends listed in the openEO Hub. Just the collection identifier and band names might differ.")]),t._v(" "),e("p",[t._v("First we need to establish a connection to the back-end.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\nconnection "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#module-openeo.rest.connection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection")]),t._v(" object"),e("OutboundLink")],1),t._v("\nis your central gateway to")]),t._v(" "),e("ul",[e("li",[t._v("list data collections, available processes, file formats and other capabilities of the back-end")]),t._v(" "),e("li",[t._v("start building your openEO algorithm from the desired data on the back-end")]),t._v(" "),e("li",[t._v("execute and monitor (batch) jobs on the back-end")]),t._v(" "),e("li",[t._v("etc.")])]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v('The EO data available at a back-end is organised in so-called collections.\nFor example, a back-end might provide fundamental satellite collections like "Sentinel 1" or "Sentinel 2",\nor preprocessed collections like "NDVI".\nCollections are used as input data for your openEO jobs.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v('More information on how openEO "collections" relate to terminology used in other systems can be found in\n('),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#eo-data-collections"}},[t._v("the openEO glossary")]),t._v(").")],1)]),t._v(" "),e("p",[t._v("Let's list all available collections on the back-end,\nusing "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_collections",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_collections")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("which returns list of collection metadata dictionaries, e.g. something like:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[{'id': 'AGERA5', 'title': 'ECMWF AGERA5 meteo dataset', 'description': 'Daily surface meteorolociga datal ...', ...},\n {'id': 'SENTINEL2_L2A_SENTINELHUB', 'title': 'Sentinel-2 top of canopy', ...},\n {'id': 'SENTINEL1_GRD', ...},\n ...]\n")])])]),e("p",[t._v("This listing includes basic metadata for each collection.\nIf necessary, a more detailed metadata listing for a given collection can be obtained with\n"),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.describe_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("describe_collection")]),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Programmatically listing collections is just a very simple usage example of the Python client.\nIn reality, you probably want to look up or inspect available collections in a web based overview such as the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v('Processes in openEO are operations that can be applied on (EO) data\n(e.g. calculate the mean of an array, or mask out observations outside a given polygon).\nThe output of one process can be used as the input of another process,\nand by doing so, multiple processes can be connected that way in a larger "process graph":\na new (user-defined) processes that implements a certain algorithm.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Check "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[t._v("the openEO glossary")]),t._v("\nfor more details on pre-defined, user-defined processes and process graphs.")],1)]),t._v(" "),e("p",[t._v("Let's list the (pre-defined) processes available on the back-end\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.list_processes",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("list_processes")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("which returns a list of dictionaries describing the process (including expected arguments and return type), e.g.:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[{'id': 'absolute', 'summary': 'Absolute value', 'description': 'Computes the absolute value of a real number `x`, which is th...', \n {'id': 'mean', 'summary': 'Arithmetic mean(average)', ...}\n ...]\n")])])]),e("p",[t._v("Like with collections, instead of programmatic exploration you'll probably prefer a web-based overview such as the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" for back-end specific process descriptions\nor browse the "),e("a",{attrs:{href:"https://processes.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("reference specifications of openEO processes"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above we did not need to log in\nsince we just queried publicly available back-end information.\nHowever, to run non-trivial processing queries one has to authenticate\nso that permissions, resource usage, etc. can be managed properly.")]),t._v(" "),e("p",[t._v("Depending on the back-end, there might be two different approaches to authenticate.\nYou need to inform yourself at your back-end provider of choice, which authentication approach you have to carry out.\nYou can also have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" to see the available authentication types of the back-ends.")]),t._v(" "),e("p",[t._v("A detailed description of why and how to use the authentication methods is on the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html#authentication-and-account-management",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Recommendation")]),t._v(" "),e("p",[t._v("The Google Earth Engine implementation for openEO only supports Basic authentication, but generally the preferred authentication method is "),e("a",{attrs:{href:"#openid-connect-authentication"}},[t._v("OpenID Connect")]),t._v(" due to better security mechanisms implemented in the OpenID Connect protocol.")])]),t._v(" "),e("h3",{attrs:{id:"basic-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-authentication"}},[t._v("#")]),t._v(" Basic Authentication")]),t._v(" "),e("p",[t._v("The Basic authentication method is a common way of authenticate HTTP requests given username and password.")]),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via Basic authentication:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Authenticate with Basic authentication"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconnection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_basic"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can get username and password here: "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver#demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/Open-EO/openeo-earthengine-driver#demo"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("After successfully calling the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.authenticate_basic",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("authenticate_basic")]),e("OutboundLink")],1),t._v(" method, you are logged into the back-end with your account.")]),t._v(" "),e("p",[t._v("This means, that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h3",{attrs:{id:"openid-connect-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect-authentication"}},[t._v("#")]),t._v(" OpenID Connect Authentication")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("For Google Earth Engine, only "),e("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")])]),t._v(" "),e("p",[t._v("The OIDC ("),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect"),e("OutboundLink")],1),t._v(") authentication can be used to authenticate via an external service given a client ID.\nThe following code snippet shows how to log in via OIDC authentication:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Authenticate with OIDC authentication"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconnection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_oidc"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method opens your system web browser, with which you can authenticate yourself on the back-end authentication system.\nAfter that the website will give you the instructions to go back to the python client, where your connection has logged your account in.\nThis means that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h2",{attrs:{id:"working-with-datacube"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#working-with-datacube"}},[t._v("#")]),t._v(" Working with Datacube")]),t._v(" "),e("p",[t._v("Now that we know how to discover the capabilities of the back-end and how to authenticate,\nlet's do some real work and process some EO data in a batch job.\nWe'll build the desired algorithm by working on so-called \"Datacubes\",\nwhich is the central concept in openEO to represent EO data,\nas "),e("RouterLink",{attrs:{to:"/documentation/1.0/datacubes.html"}},[t._v("discussed in great detail here")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"creating-a-datacube"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-datacube"}},[t._v("#")]),t._v(" Creating a Datacube")]),t._v(" "),e("p",[t._v("The first step is loading the desired slice of a data collection\nwith "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.load_collection",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Connection.load_collection")]),e("OutboundLink")],1),t._v(":")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SENTINEL1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Datacube")]),t._v(" object"),e("OutboundLink")],1),t._v('\ncontaining the "SENTINEL1_GRD" data restricted to the given spatial extent,\nthe given temporal extend and the given bands .')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can also filter the datacube step by step or at a later stage by using the following filter methods:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("start_date"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" end_date"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bands"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Still, it is recommended to always use the filters directly in "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.connection.Connection.load_collection",target:"_blank",rel:"noopener noreferrer"}},[t._v("load_collection"),e("OutboundLink")],1),t._v("\nto avoid loading too much data upfront.")])]),t._v(" "),e("h3",{attrs:{id:"applying-processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#applying-processes"}},[t._v("#")]),t._v(" Applying processes")]),t._v(" "),e("p",[t._v("By applying an openEO process on a datacube, we create a new datacube object that represents the manipulated data.\nThe standard way to do this with the Python client is to call the appropriate "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Datacube")]),t._v(" object"),e("OutboundLink")],1),t._v(" method.\nThe most common or popular openEO processes have a dedicated "),e("code",[t._v("Datacube")]),t._v(" method (e.g. "),e("code",[t._v("mask")]),t._v(", "),e("code",[t._v("aggregate_spatial")]),t._v(", "),e("code",[t._v("filter_bbox")]),t._v(", ...).\nOther processes without a dedicated method can still be applied in a generic way.\nAn on top of that, there are also some convenience methods that implement\nopenEO processes is a compact, Pythonic interface.")]),t._v(" "),e("p",[t._v("For example, the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.min_time",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("min_time")]),e("OutboundLink")],1),t._v(" method\nimplements a "),e("code",[t._v("reduce_dimension")]),t._v(" process along the temporal dimension, using the "),e("code",[t._v("min")]),t._v(" process as reducer function:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("min_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This creates a new datacube (we overwrite the existing variable),\nwhere the time dimension is eliminated and for each pixel we just have\nthe minimum value of the corresponding timeseries in the original datacube.")]),t._v(" "),e("p",[t._v("See the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client "),e("code",[t._v("Datacube")]),t._v(" API"),e("OutboundLink")],1),t._v(" for a more complete listing of methods that implement openEO processes.")]),t._v(" "),e("p",[t._v("openEO processes that are not supported by a dedicated "),e("code",[t._v("Datacube")]),t._v(" method\ncan be applied in a generic way with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.process",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("process")]),t._v(" method"),e("OutboundLink")],1),t._v(", e.g.:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("process"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n process_id"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ndvi"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n arguments"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This applies the "),e("a",{attrs:{href:"https://docs.openeo.cloud/processes/#ndvi",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("ndvi")]),t._v(" process"),e("OutboundLink")],1),t._v(' to the datacube with the arguments of "data", "nir" and "red" (This example assumes a datacube with bands '),e("code",[t._v("B8")]),t._v(" and "),e("code",[t._v("B4")]),t._v(").")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Still unsure on how to make use of processes with the Python client?\nVisit the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/processes.html#working-with-processes",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation on working with processes"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"defining-output-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#defining-output-format"}},[t._v("#")]),t._v(" Defining output format")]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("result "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#execution"}},[t._v("#")]),t._v(" Execution")]),t._v(" "),e("p",[t._v("It's important to note that all the datacube processes we applied up to this point\nare not actually executed yet, neither locally nor remotely on the back-end.\nWe just built an abstract representation of the algorithm (input data and processing chain),\nencapsulated in a local "),e("code",[t._v("Datacube")]),t._v(" object (e.g. the "),e("code",[t._v("result")]),t._v(" variable above).\nTo trigger an actual execution (on the back-end) we have to explicitly send this representation\nto the back-end.")]),t._v(" "),e("p",[t._v("openEO defines "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[t._v("several processing modes")]),t._v(",\nbut for this introduction we'll focus on batch jobs, which is a good default choice.")],1),t._v(" "),e("h3",{attrs:{id:"batch-job-execution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-execution"}},[t._v("#")]),t._v(" Batch job execution")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("result")]),t._v(" datacube object we built above describes the desired input collections, processing steps and output format.\nWe can now just send this description to the back-end to create a batch job with the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/api.html#openeo.rest.datacube.DataCube.create_job",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("create_job")]),t._v(" method"),e("OutboundLink")],1),t._v(" like this:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Creating a new job at the back-end by sending the datacube information.")]),t._v("\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The batch job, which is referenced by the returned "),e("code",[t._v("job")]),t._v(" object, is just created at the back-end,\nit is not started yet.\nTo start the job and let your Python script wait until the job has finished then\ndownload it automatically, you can use the "),e("code",[t._v("start_and_wait")]),t._v(" method.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Starts the job and waits until it finished to download the result.")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_files"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v('When everything completes successfully, the processing result will be downloaded as a GeoTIFF file\nin a folder "output".')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The official openEO Python Client documentation has more information\non "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/basics.html#managing-jobs-in-openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("batch job basics"),e("OutboundLink")],1),t._v("\nor "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/batch_jobs.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("more detailed batch job (result) management"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"full-example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-example"}},[t._v("#")]),t._v(" Full Example")]),t._v(" "),e("p",[t._v("In this chapter we will show a full example of an earth observation use case using the Python client and the Google Earth Engine back-end.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Use Case")]),t._v(" "),e("p",[t._v("We want to produce a monthly RGB composite of Sentinel 1 backscatter data over the area of Vienna, Austria for three\nmonths in 2017. This can be used for classification and crop monitoring.")])]),t._v(" "),e("p",[t._v("In the following code example, we use inline code comments to describe what we are doing.")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The username and password in the example above work at the time of writing, but may be invalid at the time you read this. Please "),e("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" for credentials.")],1)]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# First, we connect to the back-end and authenticate ourselves via Basic authentication. ")]),t._v("\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_basic"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group11"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test123"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Now that we are connected, we can initialize our datacube object with the area around Vienna ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# and the time range of interest using Sentinel 1 data.")]),t._v("\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Since we are creating a monthly RGB composite, we need three (R, G and B) separated time ranges.")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Therefore, we split the datacube into three datacubes by filtering temporal for March, April and May. ")]),t._v("\nmarch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\napril "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmay "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Now that we split it into the correct time range, we have to aggregate the timeseries values into a single image.")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Therefore, we make use of the Python Client function `mean_time`, which reduces the time dimension, ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# by taking for every timeseries the mean value.")]),t._v("\n\nmean_march "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmean_april "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmean_may "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mean_time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Now the three images will be combined into the temporal composite. ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Before merging them into one datacube, we need to rename the bands of the images, because otherwise, ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# they would be overwritten in the merging process. ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Therefore, we rename the bands of the datacubes using the `rename_labels` process to "R", "G" and "B".')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# After that we merge them into the "RGB" datacube, which has now three bands ("R", "G" and "B")')]),t._v("\n\nR_band "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mean_march"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nG_band "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mean_april"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nB_band "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mean_may"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nRG "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R_band"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("G_band"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nRGB "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" RG"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("B_band"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Last but not least, we add the process to save the result of the processing. There we define that ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# the result should be a GeoTiff file.")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# We also set, which band should be used for "red", "green" and "blue" color in the options.')]),t._v("\n\nRGB "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" RGB"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("format")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTIFF-THUMB"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# With the last process we have finished the datacube definition and can create and start the job at the back-end.")]),t._v("\n\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" RGB"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_and_wait"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Now the resulting GTiff file of the RGB backscatter composite is in your current directory.")]),t._v(" "),e("p",[e("img",{attrs:{src:a(193),alt:"RGB composite"}})]),t._v(" "),e("p",[t._v("The "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/blob/c21b928ab5f4b4561bb07b7c4a934f0ea9b4f0b8/examples/gee_uc1_temp.py",target:"_blank",rel:"noopener noreferrer"}},[t._v("source code"),e("OutboundLink")],1),t._v(" of this example can be found on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"user-defined-functions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[t._v("#")]),t._v(" User Defined Functions")]),t._v(" "),e("p",[t._v("If your use case can not be accomplished with the "),e("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("default processes")]),t._v(" of openEO, you can define a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#user-defined-function-udf"}},[t._v("user defined function")]),t._v(".\nTherefore, you can create a Python function that will be executed at the back-end and functions as a process in your process graph.")],1),t._v(" "),e("p",[t._v("Detailed information about Python UDFs can be found in the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/udf.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("official documentation"),e("OutboundLink")],1),t._v(" as well as examples in the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python client repository"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"additional-information"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),e("p",[t._v("Additional information and resources about the openEO Python Client Library:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example scripts"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Jupyter Notebooks"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openEO Python Client Library Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository on GitHub"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/48.71fd7836.js b/assets/js/48.44794e44.js similarity index 99% rename from assets/js/48.71fd7836.js rename to assets/js/48.44794e44.js index 7555f2ae7..2d8b6054a 100644 --- a/assets/js/48.71fd7836.js +++ b/assets/js/48.44794e44.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{193:function(t,e,a){t.exports=a.p+"assets/img/getting-started-result-example.7820ee84.jpg"},532:function(t,e,a){"use strict";a.r(e);var s=a(4),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"r-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#r-client"}},[t._v("#")]),t._v(" R Client")]),t._v(" "),e("h2",{attrs:{id:"useful-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#useful-links"}},[t._v("#")]),t._v(" Useful links")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Vignettes"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Code Repository"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("for function documentation, use R's "),e("code",[t._v("?")]),t._v(" function or see the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("online documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("Before you install the R client module into your R environment, please make sure that you have at least R version 3.6. Older versions might also work, but were not tested.")]),t._v(" "),e("p",[t._v("Stable releases can be installed from CRAN:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("install.packages"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Installing the development version")]),t._v(" "),e("p",[t._v("If you want to install the development version, you can install from GitHub. It may contain more features, but may also be unstable.")]),t._v(" "),e("p",[t._v("You need to have the package 'devtools' installed. If it is not installed use "),e("code",[t._v('install.packages("devtools")')]),t._v(".")]),t._v(" "),e("p",[t._v("Now you can use "),e("code",[t._v("install_github")]),t._v(" from the devtools package to install the development version:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("devtools"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("install_github"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Open-EO/openeo-r-client"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dependencies"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ref"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"develop"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("If this gives you an error, something went wrong with the installation so please check the requirements again.")])]),t._v(" "),e("p",[t._v("If you have troubles installing the package, feel free to "),e("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" or leave an issue at the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("p",[t._v("Now that the installation was successfully finished, we can load the package and connect to openEO compliant back-ends.\nIn the following chapters we quickly walk through the main features of the R client.")]),t._v(" "),e("h2",{attrs:{id:"exploring-a-back-end"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-back-end"}},[t._v("#")]),t._v(" Exploring a back-end")]),t._v(" "),e("p",[t._v("If you do not know an openEO back-end that you want to connect to yet, you can have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(", to find all known back-ends with information on their capabilities.")]),t._v(" "),e("p",[t._v("For this tutorial we will use the openEO instance of Google Earth Engine, which is available at "),e("code",[t._v("https://earthengine.openeo.org")]),t._v(".\nNote that the code snippets in this guide work the same way for the other back-ends listed in the openEO Hub. Just the collection identifier and band names might differ.")]),t._v(" "),e("p",[t._v("First we need to establish a connection to the back-end.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ngee "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("host "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The object stored as variable "),e("code",[t._v("gee")]),t._v(" is a connection and resembles the "),e("code",[t._v("OpenEOClient")]),t._v(" - an object, that bundles all information and functions to interact with the openEO back-end. It can be used explicitly in all of the functions to determine which connection has to be used (usually parameter "),e("code",[t._v("con")]),t._v("). If only one connection is active, then you can omit the parameter, because the last active connection is always stored in a package environment and used if no specific connection was present (see "),e("code",[t._v("?active_connection")]),t._v(" in the package documentation).")]),t._v(" "),e("p",[t._v("The capabilities of the back-end and the collections are generally publicly available, unless the data collections are proprietary and licensing issues prevent the back-end provider from publishing the collection. For the publicly available information you do not need to have an account on the back-end for reading them.")]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v("Collections represent the basic data the back-end provides (e.g. Sentinel 1 collection) and are therefore often used as input data for job executions ("),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#eo-data-collections"}},[t._v("more info on collections")]),t._v(").\nWith the following code snippet you can get all available collection names and their description. The collection list and its entries have their own implementations of the "),e("code",[t._v("print")]),t._v(" function. The collection list object is coerced into a "),e("code",[t._v("data.frame")]),t._v(" only for printing purposes and the collection for the collection some key information are printed.")],1),t._v(" "),e("p",[t._v("To get the collection list can be indexed by the collections ID to get the more details about the overview information. With the "),e("code",[t._v("describe_collection")]),t._v(" function you can get an even more detailed information about the collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the collection list")]),t._v("\ncollections "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# print an overview of the available collections (printed as data.frame or tibble)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# to print more of the reduced overview metadata")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("`COPERNICUS"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("S2`"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Dictionary of the full metadata of the "COPERNICUS/S2" collection (dict)')]),t._v("\ns2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" describe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the collection entry from the list, e.g. collections$`COPERNICUS/S2`")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s2"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("In general all metadata objects are based on lists, so you can use "),e("code",[t._v("str()")]),t._v(" to get the structure of the list and address fields by the "),e("code",[t._v("$")]),t._v(" operator.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If the package is used with RStudio the metadata can also be nicely rendered as a web page in the viewer panel by running "),e("code",[t._v('collection_viewer(x="COPERNICUS/S2")')]),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v("Processes in openEO are tasks that can be applied to (EO) data.\nThe input of a process might be the output of another process, so that several connected processes form a new (user-defined) process itself.\nTherefore, a process resembles the smallest unit of task descriptions in openEO ("),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[t._v("more details on processes")]),t._v(").\nThe following code snippet shows how to get the available processes.")],1),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes with full metadata")]),t._v("\nprocesses "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes by identifiers (string)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("names"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# print metadata of the process with ID "load_collection"')]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("list_processes()")]),t._v(" method returns a list of process metadata objects that the back-end provides.\nEach process list entry is a more complex list object (called 'ProcessInfo') and contains the process identifier and additional metadata about the process, such as expected arguments and return types.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("As for the collection, processes can also be rendered as a web page in the viewer panel, if RStudio is used. In order to open the viewer use "),e("code",[t._v("process_viewer()")]),t._v(" with either a particular process ("),e("code",[t._v('process_viewer("load_collection")')]),t._v(") or you can pass on all processes ("),e("code",[t._v("process_viewer(processes)")]),t._v("). When all processes are chosen, there is also a search bar and a category tree.")])]),t._v(" "),e("p",[t._v("For other graphical overviews of the openEO processes, there is an "),e("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("online documentation")]),t._v(" for general process descriptions and the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" for back-end specific process descriptions.")],1),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above, authentication is usually not necessary, since we only fetch general information about the back-end.\nTo run your own jobs at the back-end or to access job results, you need to authenticate at the back-end.")]),t._v(" "),e("p",[t._v("Depending on the back-end, there might be two different approaches to authenticate.\nYou need to inform yourself at your back-end provider of choice, which authentication approach you have to carry out and how to obtain login credentials for yourself and your 'openeo' installation in R.")]),t._v(" "),e("p",[t._v("You can also have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" to see the available authentication types of the back-ends.\nFor Google Earth Engine, only "),e("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Recommendation")]),t._v(" "),e("p",[t._v("The Google Earth Engine implementation for openEO only supports Basic authentication, but generally the preferred authentication method is "),e("a",{attrs:{href:"#openid-connect-authentication"}},[t._v("OpenID Connect")]),t._v(" due to better security mechanisms implemented in the OpenID Connect protocol.")])]),t._v(" "),e("h3",{attrs:{id:"basic-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-authentication"}},[t._v("#")]),t._v(" Basic Authentication")]),t._v(" "),e("p",[t._v("The Basic authentication method is a common way of authenticate HTTP requests given username and password.")]),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via Basic authentication:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("login"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("login_type"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"basic"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n user"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can get username and password here: "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver#demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/Open-EO/openeo-earthengine-driver#demo"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("After successfully calling the "),e("code",[t._v("login")]),t._v(' method with the "basic" login type, you are logged into the back-end with your account.\nThis means, that every call that comes after that via the connection variable is executed by your user account.')]),t._v(" "),e("h3",{attrs:{id:"openid-connect-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect-authentication"}},[t._v("#")]),t._v(" OpenID Connect Authentication")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("For Google Earth Engine, only "),e("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")])]),t._v(" "),e("p",[t._v("The OIDC ("),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect"),e("OutboundLink")],1),t._v(") authentication can be used to authenticate via an external service.")]),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via OIDC authentication if the back-end supports the simplified authentication method:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("login"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The following code snippet shows how to log in via OIDC authentication if the simplified authentication method doesn't work and you need to provide a client ID and secret:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get supported OIDC providers which the back-end supports")]),t._v("\noidc_providers "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_oidc_providers"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nlogin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("provider "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" oidc_providers"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("some_provider"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n config "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n client_id"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"..."')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n secret "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"..."')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method opens your system web browser, with which you can authenticate yourself on the back-end authentication system.\nAfter that the website will give you the instructions to go back to the R client, where your connection has logged your account in.\nThis means, that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h2",{attrs:{id:"creating-a-user-defined-process"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),e("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.")]),t._v(" "),e("p",[t._v("First we need to create a process builder object that carries all the available predefined openEO processes of the connected back-end as attached R functions with the parameters stated in the process metadata.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("p "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The functions of the builder return process nodes, which represent a particular result in the workflow. As one of the first steps we need to select the source data collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a process node that represents a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#spatial-datacubes"}},[e("code",[t._v("datacube")])]),t._v(' and contains the "COPERNICUS/S1_GRD" data restricted to the given spatial extent, the given temporal extent and the given bands .')],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Sample Data Retrieval")]),t._v(" "),e("p",[t._v("In order to get a better understanding about the processing mechanisms and the data structures used in openEO Platform, it helps to check the actual data from time to time.\nThe function "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/get_sample.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("get_sample")]),e("OutboundLink")],1),t._v(" aids the user in downloading data for a very small spatial extent. It is automatically loaded into R so that you can directly inspect it with "),e("code",[t._v("stars")]),t._v('.\nRead the vignette on "'),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/sample_data.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sample Data Retrieval"),e("OutboundLink")],1),t._v('" for more details.')])]),t._v(" "),e("p",[t._v("Having the input data ready, we want to apply a process on the datacube.\nTherefore, we can call the process directly on the datacube object, which then returns a datacube with the process applied.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("min_reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n return"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("min"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nreduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" min_reducer"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The datacube is now reduced by the time dimension named "),e("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values. Now the datacube has no time dimension left. Other so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("formats "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("`GTIFF"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("ZIP`"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The first line retrieves the back-ends offered input and output formats. The second line creates the result node, which stores the data as a zipped GeoTiff.")]),t._v(" "),e("h2",{attrs:{id:"batch-job-management"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),e("p",[t._v("After you have finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process is called a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[t._v("(batch) job")]),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),e("code",[t._v("Example Title")]),t._v(".")],1),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("title "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("create_job")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("start_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("After the job was executed, status updates can be fetched by using the "),e("code",[t._v("list_jobs()")]),t._v(" function. This function returns a list of job descriptions, which can be indexed with the jobs ID to limit the search results. But remember that only "),e("code",[t._v("list_jobs()")]),t._v(" refreshes this list. So, to monitor a job you have to iteratively call the job ("),e("code",[t._v("describe_job()")]),t._v(") or the job list "),e("code",[t._v("list_jobs()")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("jobs "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_jobs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njobs "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# printed as a tibble or data.frame, but the object is a list")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the job id (in this example 'cZ2ND0Z5nhBFNQFq') as index to get a particular job overview")]),t._v("\njobs"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("cZ2ND0Z5nhBFNQFq\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively request detailed information about the job")]),t._v("\ndescribe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("When the job is finished, calling "),e("code",[t._v("download_results()")]),t._v(" will download the results of a job. Using "),e("code",[t._v("list_results()")]),t._v(" will return an overview about the created files and their download link or it states the error message, in case of an error.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# list the processed results")]),t._v("\nlist_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# download all the files into a folder on the file system")]),t._v("\ndownload_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" folder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/some/folder/on/filesystem"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("The printing behavior and the actual data structure might differ!")])]),t._v(" "),e("p",[t._v("Now you know the general workflow of job executions.")]),t._v(" "),e("h2",{attrs:{id:"full-example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-example"}},[t._v("#")]),t._v(" Full Example")]),t._v(" "),e("p",[t._v("In this chapter we will show a full example of an earth observation use case using the R client and the Google Earth Engine back-end.\nInstead of batch job processing, we compute the image synchronously. Synchronous processing means the result is directly returned in the response, which usually works only for smaller amounts of data.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Use Case")]),t._v(" "),e("p",[t._v("We want to produce a monthly RGB composite of Sentinel 1 backscatter data over the area of Vienna, Austria for three\nmonths in 2017. This can be used for classification and crop monitoring.")])]),t._v(" "),e("p",[t._v("In the following code example, we use inline code comments to describe what we are doing.")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The username and password in the example above work at the time of writing, but may be invalid at the time you read this. Please "),e("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" for credentials.")],1)]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlibrary"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tibble"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nuser "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group7"')]),t._v("\npwd "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test123"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# connect to the back-end and login either via explicit call of login, or use your credentials in the connect function")]),t._v("\ngee "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("host "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("user "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" user"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("password "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pwd"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("login_type "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"basic"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the process collection to use the predefined processes of the back-end")]),t._v("\np "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the collection list to get easier access to the collection ids, via auto completion")]),t._v("\ncollections "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the formats")]),t._v("\nformats "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load the initial data collection and limit the amount of data loaded")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# note: for the collection id and later the format you can also use the its character value")]),t._v("\ndata "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("id "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" collections"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("`COPERNICUS"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("S1_GRD`"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n south"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n east"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n north"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create three monthly sub data sets, which will be merged back into a single data cube later")]),t._v("\nmarch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\napril "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmay "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# The aggregation function for the following temporal reducer")]),t._v("\nagg_fun_mean "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nmarch_reduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" agg_fun_mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\napril_reduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" agg_fun_mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmay_reduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" agg_fun_mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Each band is currently called VV. We need to rename at least the label of one dimension, ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# because otherwise identity of the data cubes is assumed. The bands dimension consists ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# only of one label, so we can rename this to be able to merge those data cubes.")]),t._v("\nmarch_renamed "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march_reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n source "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\napril_renamed "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april_reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n source "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmay_renamed "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may_reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n source "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# combine the individual data cubes into one")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# this is done one by one, since the dimensionalities have to match between each of the data cubes")]),t._v("\nmerge_1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march_renamed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cube2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april_renamed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmerge_2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" merge_1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cube2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may_renamed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# rescale the the back scatter measurements into 8Bit integer to view the results as PNG")]),t._v("\nrescaled "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" merge_2"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n process "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("linear_scale_range"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inputMin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("inputMax "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMax "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# export shall be format PNG")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# look at the format description")]),t._v("\nformats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("PNG\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# store the results using the format and set the create options")]),t._v("\nresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" rescaled"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("format "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("PNG"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("red"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("green"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("blue"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create a job")]),t._v("\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"S1 Example R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" description "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Getting Started example on openeo.org for R-client"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# then start the processing of the job and turn on logging (messages that are captured on the back-end during the process execution)")]),t._v("\nstart_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" log "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Now the resulting PNG file of the RGB backscatter composite is stored as a PNG file in the current working directory. It looks like this:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(193),alt:"RGB composite"}})]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/blob/master/examples/S1-example.R",target:"_blank",rel:"noopener noreferrer"}},[t._v("source code"),e("OutboundLink")],1),t._v(" of the example can also be found on the R client repository on Github.")])]),t._v(" "),e("h2",{attrs:{id:"user-defined-functions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[t._v("#")]),t._v(" User Defined Functions")]),t._v(" "),e("p",[t._v("If your use case can not be accomplished with the "),e("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("default processes")]),t._v(" of openEO, you can define a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#user-defined-function-udf"}},[t._v("user defined function")]),t._v(".")],1),t._v(" "),e("p",[t._v("In general the processing workflow works by uploading the Python or R script into the users file directory on the back-end and reference the script via its URL or by its relational name (e.g. "),e("code",[t._v("/scripts/script1.R")]),t._v(") in the function "),e("code",[t._v("run_udf")]),t._v(". The latter function is a predefined openEO process that the back-end might provide, if UDFs are supported.")]),t._v(" "),e("p",[t._v("Find out more about UDFs in the respective "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python UDF"),e("OutboundLink")],1),t._v(" and "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("R UDF"),e("OutboundLink")],1),t._v(" repositories with their documentation and examples.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{193:function(t,e,a){t.exports=a.p+"assets/img/getting-started-result-example.7820ee84.jpg"},534:function(t,e,a){"use strict";a.r(e);var s=a(4),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"r-client"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#r-client"}},[t._v("#")]),t._v(" R Client")]),t._v(" "),e("h2",{attrs:{id:"useful-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#useful-links"}},[t._v("#")]),t._v(" Useful links")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Vignettes"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Code Repository"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("for function documentation, use R's "),e("code",[t._v("?")]),t._v(" function or see the "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("online documentation"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("Before you install the R client module into your R environment, please make sure that you have at least R version 3.6. Older versions might also work, but were not tested.")]),t._v(" "),e("p",[t._v("Stable releases can be installed from CRAN:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("install.packages"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Installing the development version")]),t._v(" "),e("p",[t._v("If you want to install the development version, you can install from GitHub. It may contain more features, but may also be unstable.")]),t._v(" "),e("p",[t._v("You need to have the package 'devtools' installed. If it is not installed use "),e("code",[t._v('install.packages("devtools")')]),t._v(".")]),t._v(" "),e("p",[t._v("Now you can use "),e("code",[t._v("install_github")]),t._v(" from the devtools package to install the development version:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("devtools"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("install_github"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Open-EO/openeo-r-client"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dependencies"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ref"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"develop"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("If this gives you an error, something went wrong with the installation so please check the requirements again.")])]),t._v(" "),e("p",[t._v("If you have troubles installing the package, feel free to "),e("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" or leave an issue at the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub project"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("p",[t._v("Now that the installation was successfully finished, we can load the package and connect to openEO compliant back-ends.\nIn the following chapters we quickly walk through the main features of the R client.")]),t._v(" "),e("h2",{attrs:{id:"exploring-a-back-end"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#exploring-a-back-end"}},[t._v("#")]),t._v(" Exploring a back-end")]),t._v(" "),e("p",[t._v("If you do not know an openEO back-end that you want to connect to yet, you can have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(", to find all known back-ends with information on their capabilities.")]),t._v(" "),e("p",[t._v("For this tutorial we will use the openEO instance of Google Earth Engine, which is available at "),e("code",[t._v("https://earthengine.openeo.org")]),t._v(".\nNote that the code snippets in this guide work the same way for the other back-ends listed in the openEO Hub. Just the collection identifier and band names might differ.")]),t._v(" "),e("p",[t._v("First we need to establish a connection to the back-end.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ngee "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("host "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The object stored as variable "),e("code",[t._v("gee")]),t._v(" is a connection and resembles the "),e("code",[t._v("OpenEOClient")]),t._v(" - an object, that bundles all information and functions to interact with the openEO back-end. It can be used explicitly in all of the functions to determine which connection has to be used (usually parameter "),e("code",[t._v("con")]),t._v("). If only one connection is active, then you can omit the parameter, because the last active connection is always stored in a package environment and used if no specific connection was present (see "),e("code",[t._v("?active_connection")]),t._v(" in the package documentation).")]),t._v(" "),e("p",[t._v("The capabilities of the back-end and the collections are generally publicly available, unless the data collections are proprietary and licensing issues prevent the back-end provider from publishing the collection. For the publicly available information you do not need to have an account on the back-end for reading them.")]),t._v(" "),e("h3",{attrs:{id:"collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collections"}},[t._v("#")]),t._v(" Collections")]),t._v(" "),e("p",[t._v("Collections represent the basic data the back-end provides (e.g. Sentinel 1 collection) and are therefore often used as input data for job executions ("),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#eo-data-collections"}},[t._v("more info on collections")]),t._v(").\nWith the following code snippet you can get all available collection names and their description. The collection list and its entries have their own implementations of the "),e("code",[t._v("print")]),t._v(" function. The collection list object is coerced into a "),e("code",[t._v("data.frame")]),t._v(" only for printing purposes and the collection for the collection some key information are printed.")],1),t._v(" "),e("p",[t._v("To get the collection list can be indexed by the collections ID to get the more details about the overview information. With the "),e("code",[t._v("describe_collection")]),t._v(" function you can get an even more detailed information about the collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the collection list")]),t._v("\ncollections "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# print an overview of the available collections (printed as data.frame or tibble)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# to print more of the reduced overview metadata")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("collections"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("`COPERNICUS"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("S2`"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Dictionary of the full metadata of the "COPERNICUS/S2" collection (dict)')]),t._v("\ns2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" describe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S2"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the collection entry from the list, e.g. collections$`COPERNICUS/S2`")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s2"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("In general all metadata objects are based on lists, so you can use "),e("code",[t._v("str()")]),t._v(" to get the structure of the list and address fields by the "),e("code",[t._v("$")]),t._v(" operator.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If the package is used with RStudio the metadata can also be nicely rendered as a web page in the viewer panel by running "),e("code",[t._v('collection_viewer(x="COPERNICUS/S2")')]),t._v(".")])]),t._v(" "),e("h3",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v("Processes in openEO are tasks that can be applied to (EO) data.\nThe input of a process might be the output of another process, so that several connected processes form a new (user-defined) process itself.\nTherefore, a process resembles the smallest unit of task descriptions in openEO ("),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#processes"}},[t._v("more details on processes")]),t._v(").\nThe following code snippet shows how to get the available processes.")],1),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes with full metadata")]),t._v("\nprocesses "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# List of available openEO processes by identifiers (string)")]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("names"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# print metadata of the process with ID "load_collection"')]),t._v("\nprint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processes"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("list_processes()")]),t._v(" method returns a list of process metadata objects that the back-end provides.\nEach process list entry is a more complex list object (called 'ProcessInfo') and contains the process identifier and additional metadata about the process, such as expected arguments and return types.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("As for the collection, processes can also be rendered as a web page in the viewer panel, if RStudio is used. In order to open the viewer use "),e("code",[t._v("process_viewer()")]),t._v(" with either a particular process ("),e("code",[t._v('process_viewer("load_collection")')]),t._v(") or you can pass on all processes ("),e("code",[t._v("process_viewer(processes)")]),t._v("). When all processes are chosen, there is also a search bar and a category tree.")])]),t._v(" "),e("p",[t._v("For other graphical overviews of the openEO processes, there is an "),e("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("online documentation")]),t._v(" for general process descriptions and the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" for back-end specific process descriptions.")],1),t._v(" "),e("h2",{attrs:{id:"authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[t._v("#")]),t._v(" Authentication")]),t._v(" "),e("p",[t._v("In the code snippets above, authentication is usually not necessary, since we only fetch general information about the back-end.\nTo run your own jobs at the back-end or to access job results, you need to authenticate at the back-end.")]),t._v(" "),e("p",[t._v("Depending on the back-end, there might be two different approaches to authenticate.\nYou need to inform yourself at your back-end provider of choice, which authentication approach you have to carry out and how to obtain login credentials for yourself and your 'openeo' installation in R.")]),t._v(" "),e("p",[t._v("You can also have a look at the "),e("a",{attrs:{href:"https://hub.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO Hub"),e("OutboundLink")],1),t._v(" to see the available authentication types of the back-ends.\nFor Google Earth Engine, only "),e("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Recommendation")]),t._v(" "),e("p",[t._v("The Google Earth Engine implementation for openEO only supports Basic authentication, but generally the preferred authentication method is "),e("a",{attrs:{href:"#openid-connect-authentication"}},[t._v("OpenID Connect")]),t._v(" due to better security mechanisms implemented in the OpenID Connect protocol.")])]),t._v(" "),e("h3",{attrs:{id:"basic-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-authentication"}},[t._v("#")]),t._v(" Basic Authentication")]),t._v(" "),e("p",[t._v("The Basic authentication method is a common way of authenticate HTTP requests given username and password.")]),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via Basic authentication:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("login"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("login_type"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"basic"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n user"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"user"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("You can get username and password here: "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver#demo",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/Open-EO/openeo-earthengine-driver#demo"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("After successfully calling the "),e("code",[t._v("login")]),t._v(' method with the "basic" login type, you are logged into the back-end with your account.\nThis means, that every call that comes after that via the connection variable is executed by your user account.')]),t._v(" "),e("h3",{attrs:{id:"openid-connect-authentication"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect-authentication"}},[t._v("#")]),t._v(" OpenID Connect Authentication")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("For Google Earth Engine, only "),e("a",{attrs:{href:"#basic-authentication"}},[t._v("Basic Authentication")]),t._v(" is supported at the moment.")])]),t._v(" "),e("p",[t._v("The OIDC ("),e("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenID Connect"),e("OutboundLink")],1),t._v(") authentication can be used to authenticate via an external service.")]),t._v(" "),e("p",[t._v("The following code snippet shows how to log in via OIDC authentication if the back-end supports the simplified authentication method:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("login"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The following code snippet shows how to log in via OIDC authentication if the simplified authentication method doesn't work and you need to provide a client ID and secret:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get supported OIDC providers which the back-end supports")]),t._v("\noidc_providers "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_oidc_providers"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nlogin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("provider "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" oidc_providers"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("some_provider"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n config "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n client_id"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"..."')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n secret "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"..."')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Calling this method opens your system web browser, with which you can authenticate yourself on the back-end authentication system.\nAfter that the website will give you the instructions to go back to the R client, where your connection has logged your account in.\nThis means, that every call that comes after that via the connection variable is executed by your user account.")]),t._v(" "),e("h2",{attrs:{id:"creating-a-user-defined-process"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-defined-process"}},[t._v("#")]),t._v(" Creating a (user-defined) process")]),t._v(" "),e("p",[t._v("Now that we know how to discover the back-end and how to authenticate, lets continue by creating a new batch job to process some data.")]),t._v(" "),e("p",[t._v("First we need to create a process builder object that carries all the available predefined openEO processes of the connected back-end as attached R functions with the parameters stated in the process metadata.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("p "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The functions of the builder return process nodes, which represent a particular result in the workflow. As one of the first steps we need to select the source data collection.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("datacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COPERNICUS/S1_GRD"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VH"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("This results in a process node that represents a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#spatial-datacubes"}},[e("code",[t._v("datacube")])]),t._v(' and contains the "COPERNICUS/S1_GRD" data restricted to the given spatial extent, the given temporal extent and the given bands .')],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Sample Data Retrieval")]),t._v(" "),e("p",[t._v("In order to get a better understanding about the processing mechanisms and the data structures used in openEO Platform, it helps to check the actual data from time to time.\nThe function "),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/get_sample.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("get_sample")]),e("OutboundLink")],1),t._v(" aids the user in downloading data for a very small spatial extent. It is automatically loaded into R so that you can directly inspect it with "),e("code",[t._v("stars")]),t._v('.\nRead the vignette on "'),e("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/articles/sample_data.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sample Data Retrieval"),e("OutboundLink")],1),t._v('" for more details.')])]),t._v(" "),e("p",[t._v("Having the input data ready, we want to apply a process on the datacube.\nTherefore, we can call the process directly on the datacube object, which then returns a datacube with the process applied.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("min_reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n return"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("min"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nreduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" min_reducer"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimension"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The datacube is now reduced by the time dimension named "),e("code",[t._v("t")]),t._v(', by taking the minimum value of the timeseries values. Now the datacube has no time dimension left. Other so called "reducer" processes exist, e.g. for computing maximum and mean values.')]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("Everything applied to the datacube at this point is neither executed locally on your machine nor executed on the back-end.\nIt just defines the input data and process chain the back-end needs to apply when it sends the datacube to the back-end and executes it there.\nHow this can be done is the topic of the next chapter.")])]),t._v(" "),e("p",[t._v("After applying all processes you want to execute, we need to tell the back-end to export the datacube, for example as GeoTiff:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("formats "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" format "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("`GTIFF"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("ZIP`"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The first line retrieves the back-ends offered input and output formats. The second line creates the result node, which stores the data as a zipped GeoTiff.")]),t._v(" "),e("h2",{attrs:{id:"batch-job-management"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#batch-job-management"}},[t._v("#")]),t._v(" Batch Job Management")]),t._v(" "),e("p",[t._v("After you have finished working on your (user-defined) process, we can now send it to the back-end and start the execution.\nIn openEO, an execution of a (user-defined) process is called a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#data-processing-modes"}},[t._v("(batch) job")]),t._v(".\nTherefore, we need to create a job at the back-end using our datacube, giving it the title "),e("code",[t._v("Example Title")]),t._v(".")],1),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("title "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Example Title"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("The "),e("code",[t._v("create_job")]),t._v(" method sends all necessary information to the back-end and creates a new job, which gets returned.\nAfter this, the job is just created, but has not started the execution at the back-end yet.\nIt needs to be queued for processing explicitly:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("start_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("After the job was executed, status updates can be fetched by using the "),e("code",[t._v("list_jobs()")]),t._v(" function. This function returns a list of job descriptions, which can be indexed with the jobs ID to limit the search results. But remember that only "),e("code",[t._v("list_jobs()")]),t._v(" refreshes this list. So, to monitor a job you have to iteratively call the job ("),e("code",[t._v("describe_job()")]),t._v(") or the job list "),e("code",[t._v("list_jobs()")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("jobs "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_jobs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njobs "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# printed as a tibble or data.frame, but the object is a list")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or use the job id (in this example 'cZ2ND0Z5nhBFNQFq') as index to get a particular job overview")]),t._v("\njobs"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("cZ2ND0Z5nhBFNQFq\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# alternatively request detailed information about the job")]),t._v("\ndescribe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("When the job is finished, calling "),e("code",[t._v("download_results()")]),t._v(" will download the results of a job. Using "),e("code",[t._v("list_results()")]),t._v(" will return an overview about the created files and their download link or it states the error message, in case of an error.")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# list the processed results")]),t._v("\nlist_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# download all the files into a folder on the file system")]),t._v("\ndownload_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" folder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/some/folder/on/filesystem"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),e("p",[t._v("The printing behavior and the actual data structure might differ!")])]),t._v(" "),e("p",[t._v("Now you know the general workflow of job executions.")]),t._v(" "),e("h2",{attrs:{id:"full-example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-example"}},[t._v("#")]),t._v(" Full Example")]),t._v(" "),e("p",[t._v("In this chapter we will show a full example of an earth observation use case using the R client and the Google Earth Engine back-end.\nInstead of batch job processing, we compute the image synchronously. Synchronous processing means the result is directly returned in the response, which usually works only for smaller amounts of data.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("Use Case")]),t._v(" "),e("p",[t._v("We want to produce a monthly RGB composite of Sentinel 1 backscatter data over the area of Vienna, Austria for three\nmonths in 2017. This can be used for classification and crop monitoring.")])]),t._v(" "),e("p",[t._v("In the following code example, we use inline code comments to describe what we are doing.")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The username and password in the example above work at the time of writing, but may be invalid at the time you read this. Please "),e("RouterLink",{attrs:{to:"/contact.html"}},[t._v("contact us")]),t._v(" for credentials.")],1)]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlibrary"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tibble"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nuser "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group7"')]),t._v("\npwd "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test123"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# connect to the back-end and login either via explicit call of login, or use your credentials in the connect function")]),t._v("\ngee "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("host "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earthengine.openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("user "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" user"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("password "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pwd"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("login_type "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"basic"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the process collection to use the predefined processes of the back-end")]),t._v("\np "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the collection list to get easier access to the collection ids, via auto completion")]),t._v("\ncollections "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_collections"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get the formats")]),t._v("\nformats "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list_file_formats"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# load the initial data collection and limit the amount of data loaded")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# note: for the collection id and later the format you can also use the its character value")]),t._v("\ndata "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("id "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" collections"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("`COPERNICUS"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("S1_GRD`"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("west"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n south"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.06")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n east"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.65")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n north"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.35")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create three monthly sub data sets, which will be merged back into a single data cube later")]),t._v("\nmarch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-03-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\napril "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-04-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmay "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("filter_temporal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n extent "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-05-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-06-01"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# The aggregation function for the following temporal reducer")]),t._v("\nagg_fun_mean "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nmarch_reduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" agg_fun_mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\napril_reduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" agg_fun_mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmay_reduced "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("reduce_dimension"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n reducer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" agg_fun_mean"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Each band is currently called VV. We need to rename at least the label of one dimension, ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# because otherwise identity of the data cubes is assumed. The bands dimension consists ")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# only of one label, so we can rename this to be able to merge those data cubes.")]),t._v("\nmarch_renamed "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march_reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n source "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\napril_renamed "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april_reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n source "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmay_renamed "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("rename_labels"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may_reduced"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n dimension "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bands"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n target "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n source "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VV"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# combine the individual data cubes into one")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# this is done one by one, since the dimensionalities have to match between each of the data cubes")]),t._v("\nmerge_1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" march_renamed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("cube2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" april_renamed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmerge_2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("merge_cubes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cube1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" merge_1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cube2 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" may_renamed"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# rescale the the back scatter measurements into 8Bit integer to view the results as PNG")]),t._v("\nrescaled "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("apply"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" merge_2"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n process "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("linear_scale_range"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" inputMin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("inputMax "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" outputMax "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# export shall be format PNG")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# look at the format description")]),t._v("\nformats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("PNG\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# store the results using the format and set the create options")]),t._v("\nresult "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("save_result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" rescaled"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("format "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" formats"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("output"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("PNG"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" options "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("red"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("green"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"G"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("blue"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create a job")]),t._v("\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("graph "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" result"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" title "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"S1 Example R"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" description "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Getting Started example on openeo.org for R-client"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# then start the processing of the job and turn on logging (messages that are captured on the back-end during the process execution)")]),t._v("\nstart_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" log "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Now the resulting PNG file of the RGB backscatter composite is stored as a PNG file in the current working directory. It looks like this:")]),t._v(" "),e("p",[e("img",{attrs:{src:a(193),alt:"RGB composite"}})]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("The "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/blob/master/examples/S1-example.R",target:"_blank",rel:"noopener noreferrer"}},[t._v("source code"),e("OutboundLink")],1),t._v(" of the example can also be found on the R client repository on Github.")])]),t._v(" "),e("h2",{attrs:{id:"user-defined-functions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[t._v("#")]),t._v(" User Defined Functions")]),t._v(" "),e("p",[t._v("If your use case can not be accomplished with the "),e("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[t._v("default processes")]),t._v(" of openEO, you can define a "),e("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html#user-defined-function-udf"}},[t._v("user defined function")]),t._v(".")],1),t._v(" "),e("p",[t._v("In general the processing workflow works by uploading the Python or R script into the users file directory on the back-end and reference the script via its URL or by its relational name (e.g. "),e("code",[t._v("/scripts/script1.R")]),t._v(") in the function "),e("code",[t._v("run_udf")]),t._v(". The latter function is a predefined openEO process that the back-end might provide, if UDFs are supported.")]),t._v(" "),e("p",[t._v("Find out more about UDFs in the respective "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python UDF"),e("OutboundLink")],1),t._v(" and "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("R UDF"),e("OutboundLink")],1),t._v(" repositories with their documentation and examples.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/49.f4a4aeba.js b/assets/js/49.a7759528.js similarity index 95% rename from assets/js/49.f4a4aeba.js rename to assets/js/49.a7759528.js index d9440f62b..06dfb3065 100644 --- a/assets/js/49.f4a4aeba.js +++ b/assets/js/49.a7759528.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{335:function(e,t,n){e.exports=n.p+"assets/img/20180123_134945.13ed5839.jpg"},540:function(e,t,n){"use strict";n.r(t);var r=n(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("On Jan 22-24, the "),t("a",{attrs:{href:"https://www.uni-muenster.de/Geoinformatics/en/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Institute for Geoinformatics"),t("OutboundLink")],1),e._v(" at the University of Muenster hosted\nthe "),t("em",[e._v("second week of intense collaboration")]),e._v(". 16 developers from 8 partners worked on implementing the proof of concept use cases for different clients and backends, improving the core API, and connecting the clients to different backends.")]),e._v(" "),t("p",[e._v("We continued implementing the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GeoTrellis"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-wcps-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("WCPS"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-grassgis-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GRASS GIS"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub"),t("OutboundLink")],1),e._v(" backend drivers and a "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python client"),t("OutboundLink")],1),e._v(" for OpenEO, which we started during our "),t("a",{attrs:{href:"http://openeo.org/openeo/news/2017/12/18/VITO_meeting.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("meeting in December at VITO"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Besides many improvements in the proof of concept implementations, this week resulted in two more prototypical OpenEO clients:")]),e._v(" "),t("ul",[t("li",[e._v("A simple browser-based "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JS client"),t("OutboundLink")],1),e._v(" was tested with the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub driver"),t("OutboundLink")],1),e._v(" and its implementation of the first proof of concept use case (computing minimum NDVI values over time series of Sentinel 2 data).")]),e._v(" "),t("li",[e._v("The "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo R package"),t("OutboundLink")],1),e._v(" also implements the first use case and demonstrates how R users will communicate with OpenEO backends.")])]),e._v(" "),t("p",[t("img",{attrs:{src:n(335),alt:""}})]),e._v(" "),t("p",[e._v("During the three days, we also discussed important ideas of the core API specification and how it can be improved by supporting synchronous processing and representing descriptions of process chains as resources. "),t("a",{attrs:{href:"https://www.eodc.eu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EODC"),t("OutboundLink")],1),e._v(" presented its new "),t("a",{attrs:{href:"https://www.openshift.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenShift"),t("OutboundLink")],1),e._v("-based architecture to run OpenEO queries in containers. Further important discussions made clear how our proof of concept in month 6 will look like.")]),e._v(" "),t("p",[e._v("More details of the week's results can be found in our "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1),e._v(" repositories.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{336:function(e,t,n){e.exports=n.p+"assets/img/20180123_134945.13ed5839.jpg"},541:function(e,t,n){"use strict";n.r(t);var r=n(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("On Jan 22-24, the "),t("a",{attrs:{href:"https://www.uni-muenster.de/Geoinformatics/en/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Institute for Geoinformatics"),t("OutboundLink")],1),e._v(" at the University of Muenster hosted\nthe "),t("em",[e._v("second week of intense collaboration")]),e._v(". 16 developers from 8 partners worked on implementing the proof of concept use cases for different clients and backends, improving the core API, and connecting the clients to different backends.")]),e._v(" "),t("p",[e._v("We continued implementing the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GeoTrellis"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-wcps-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("WCPS"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-grassgis-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GRASS GIS"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub"),t("OutboundLink")],1),e._v(" backend drivers and a "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python client"),t("OutboundLink")],1),e._v(" for OpenEO, which we started during our "),t("a",{attrs:{href:"http://openeo.org/openeo/news/2017/12/18/VITO_meeting.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("meeting in December at VITO"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Besides many improvements in the proof of concept implementations, this week resulted in two more prototypical OpenEO clients:")]),e._v(" "),t("ul",[t("li",[e._v("A simple browser-based "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JS client"),t("OutboundLink")],1),e._v(" was tested with the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub driver"),t("OutboundLink")],1),e._v(" and its implementation of the first proof of concept use case (computing minimum NDVI values over time series of Sentinel 2 data).")]),e._v(" "),t("li",[e._v("The "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo R package"),t("OutboundLink")],1),e._v(" also implements the first use case and demonstrates how R users will communicate with OpenEO backends.")])]),e._v(" "),t("p",[t("img",{attrs:{src:n(336),alt:""}})]),e._v(" "),t("p",[e._v("During the three days, we also discussed important ideas of the core API specification and how it can be improved by supporting synchronous processing and representing descriptions of process chains as resources. "),t("a",{attrs:{href:"https://www.eodc.eu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("EODC"),t("OutboundLink")],1),e._v(" presented its new "),t("a",{attrs:{href:"https://www.openshift.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenShift"),t("OutboundLink")],1),e._v("-based architecture to run OpenEO queries in containers. Further important discussions made clear how our proof of concept in month 6 will look like.")]),e._v(" "),t("p",[e._v("More details of the week's results can be found in our "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1),e._v(" repositories.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/5.65c67710.js b/assets/js/5.b939a249.js similarity index 74% rename from assets/js/5.65c67710.js rename to assets/js/5.b939a249.js index 10c57a6d6..f128ebbf7 100644 --- a/assets/js/5.65c67710.js +++ b/assets/js/5.b939a249.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{268:function(t,e,n){},404:function(t,e,n){"use strict";n(268)},484:function(t,e,n){"use strict";n.r(e);var s=n(157),i={name:"DeprecationNotice",props:{entity:String},beforeCreate(){s.a.enableHtmlProps(this)}},o=(n(404),n(4)),a=Object(o.a)(i,(function(){var t=this._self._c;return t("div",{staticClass:"vue-component message-block deprecation-notice"},[t("strong",[this._v("Deprecated")]),this._v(" "),t("p",[this._v("Please note that this "+this._s(this.entity)+" is now deprecated with the potential to be removed in any of the next versions. It should be transitioned out of usage as soon as possible. Refrain from using it in new implementations.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{269:function(t,e,n){},406:function(t,e,n){"use strict";n(269)},486:function(t,e,n){"use strict";n.r(e);var s=n(157),i={name:"DeprecationNotice",props:{entity:String},beforeCreate(){s.a.enableHtmlProps(this)}},o=(n(406),n(4)),a=Object(o.a)(i,(function(){var t=this._self._c;return t("div",{staticClass:"vue-component message-block deprecation-notice"},[t("strong",[this._v("Deprecated")]),this._v(" "),t("p",[this._v("Please note that this "+this._s(this.entity)+" is now deprecated with the potential to be removed in any of the next versions. It should be transitioned out of usage as soon as possible. Refrain from using it in new implementations.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/50.f8390caa.js b/assets/js/50.d1e2d680.js similarity index 99% rename from assets/js/50.f8390caa.js rename to assets/js/50.d1e2d680.js index 4532ea957..6b6a0af22 100644 --- a/assets/js/50.f8390caa.js +++ b/assets/js/50.d1e2d680.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{336:function(t,s,a){t.exports=a.p+"assets/img/040-pg-example.8a5fae89.png"},543:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("Today, the openEO Consortium "),s("strong",[t._v("released the new version 0.4.0 of the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-api/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO API"),s("OutboundLink")],1)]),t._v(". The following blog post will give a short overview over the most notable changes and additions to the API specification.")]),t._v(" "),s("h2",{attrs:{id:"new-process-catalogue-and-process-graph-changes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#new-process-catalogue-and-process-graph-changes"}},[t._v("#")]),t._v(" New process catalogue and process graph changes")]),t._v(" "),s("p",[t._v("The focus of this release was the definition of a "),s("a",{attrs:{href:"http://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("full process catalogue"),s("OutboundLink")],1),t._v(", which is now in implementation by the back-ends. We defined a set of over 100 processes, which can soon be used for remote sensing and related tasks. For this, we had to introduce a new encoding for the process graphs, which now allows parallelism, callbacks and more.")]),t._v(" "),s("p",[t._v("The following image shows visually how a user could derive minimum EVI measurements over pixel time series of Sentinel 2 imagery:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(336),alt:"Algorithm to process an EVI"}})]),t._v(" "),s("p",[t._v("Once implemented, we plan that the following Python client code could be used to generate the process graph to send it to a back-end:")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\nsession "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ns2_radio "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" session"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imagecollection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-02-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nblue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_radio"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B02'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nred "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_radio"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B04'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nnir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_radio"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B08'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nevi_cube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" blue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" evi_cube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"min"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In JavaScript it is planned to work as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("eviReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" blue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("divide")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("subtract")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("nir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" connection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcessGraph")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-02-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filterBands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"spectral"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" eviReducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("saveResult")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Similarly, it would work in the R client. You can also check the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-api/processgraphs/#example",target:"_blank",rel:"noopener noreferrer"}},[t._v("process graph documentation"),s("OutboundLink")],1),t._v(" if you'd like to know how this algorithm looks as a process graph.")]),t._v(" "),s("h2",{attrs:{id:"other-improvements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-improvements"}},[t._v("#")]),t._v(" Other improvements")]),t._v(" "),s("p",[t._v("We also updated our Data Discovery to be compatible with "),s("a",{attrs:{href:"https://medium.com/radiant-earth-insights/stac-extensions-and-0-6-2-release-b0cf34272ed7",target:"_blank",rel:"noopener noreferrer"}},[t._v("the most recent version of STAC, v0.6.2"),s("OutboundLink")],1),t._v(". In the last months, openEO contributed several extensions to the STAC specification such as "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/blob/master/extensions/sar/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("an extension to describe Synthetic-Aperture Radar (SAR) data"),s("OutboundLink")],1),t._v(" or "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/blob/master/extensions/datacube/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("an extension to describe Data Cubes"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Despite the process and data discovery, we generally improved the discovery of openEO back-ends. For example, the API now also allows clients to automatically detect supported API versions at the back-end, so that users don't need to keep track of that and can always connect to the same URL without worrying about compatibility between clients and back-ends. Our approach to "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("user-defined functions (UDFs)"),s("OutboundLink")],1),t._v(" was also better integrated withing the API. UDF runtimes can be discovered now and well-defined processes allow executing UDFs. Many more improvements were incorporated into the API specification based on feedback from the review meeting, discussions with users and implementations (see the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-api/changelog/",target:"_blank",rel:"noopener noreferrer"}},[t._v("full changelog"),s("OutboundLink")],1),t._v(").")]),t._v(" "),s("h2",{attrs:{id:"next-steps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[t._v("#")]),t._v(" Next steps")]),t._v(" "),s("p",[t._v("This is the API version, which is targeted towards getting the first more universally usable version of the openEO clients and back-ends released. We will work hard now to implement the back-ends and clients to comply with the new API version and will follow up with a new blog post once this is achieved. Afterwards, all interested parties can use clients and back-ends to get a first solid impression of the project. In the meantime, it is already possible to make experiments with the back-ends and clients working on the API version 0.3.1. Please "),s("a",{attrs:{href:"http://openeo.org/contact/",target:"_blank",rel:"noopener noreferrer"}},[t._v("contact us"),s("OutboundLink")],1),t._v(" to get more information about it. Having said that, the new version is not the last one and we will continue to improve the API, client and back-ends. So any feedback is highly appreciated and can be sent our way via GitHub issues in the corresponding "),s("a",{attrs:{href:"https://github.com/open-eo",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub repositories"),s("OutboundLink")],1),t._v(" or via any of the other "),s("a",{attrs:{href:"http://openeo.org/contact/",target:"_blank",rel:"noopener noreferrer"}},[t._v("contact options"),s("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{337:function(t,s,a){t.exports=a.p+"assets/img/040-pg-example.8a5fae89.png"},546:function(t,s,a){"use strict";a.r(s);var n=a(4),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("Today, the openEO Consortium "),s("strong",[t._v("released the new version 0.4.0 of the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-api/",target:"_blank",rel:"noopener noreferrer"}},[t._v("openEO API"),s("OutboundLink")],1)]),t._v(". The following blog post will give a short overview over the most notable changes and additions to the API specification.")]),t._v(" "),s("h2",{attrs:{id:"new-process-catalogue-and-process-graph-changes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#new-process-catalogue-and-process-graph-changes"}},[t._v("#")]),t._v(" New process catalogue and process graph changes")]),t._v(" "),s("p",[t._v("The focus of this release was the definition of a "),s("a",{attrs:{href:"http://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("full process catalogue"),s("OutboundLink")],1),t._v(", which is now in implementation by the back-ends. We defined a set of over 100 processes, which can soon be used for remote sensing and related tasks. For this, we had to introduce a new encoding for the process graphs, which now allows parallelism, callbacks and more.")]),t._v(" "),s("p",[t._v("The following image shows visually how a user could derive minimum EVI measurements over pixel time series of Sentinel 2 imagery:")]),t._v(" "),s("p",[s("img",{attrs:{src:a(337),alt:"Algorithm to process an EVI"}})]),t._v(" "),s("p",[t._v("Once implemented, we plan that the following Python client code could be used to generate the process graph to send it to a back-end:")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\nsession "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ns2_radio "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" session"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imagecollection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" spatial_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temporal_extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-02-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nblue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_radio"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B02'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nred "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_radio"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B04'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nnir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_radio"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'B08'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nevi_cube "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" blue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" evi_cube"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"min"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save_result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("In JavaScript it is planned to work as follows:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("eviReducer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" blue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("at")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("divide")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("subtract")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("nir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" connection "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" OpenEO"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcessGraph")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("loadCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("west")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("east")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("north")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("48.6")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("south")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("47.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-01-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018-02-01"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("filterBands")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B02"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"spectral"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" eviReducer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("reduce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("min")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("saveResult")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GTiff"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Similarly, it would work in the R client. You can also check the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-api/processgraphs/#example",target:"_blank",rel:"noopener noreferrer"}},[t._v("process graph documentation"),s("OutboundLink")],1),t._v(" if you'd like to know how this algorithm looks as a process graph.")]),t._v(" "),s("h2",{attrs:{id:"other-improvements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-improvements"}},[t._v("#")]),t._v(" Other improvements")]),t._v(" "),s("p",[t._v("We also updated our Data Discovery to be compatible with "),s("a",{attrs:{href:"https://medium.com/radiant-earth-insights/stac-extensions-and-0-6-2-release-b0cf34272ed7",target:"_blank",rel:"noopener noreferrer"}},[t._v("the most recent version of STAC, v0.6.2"),s("OutboundLink")],1),t._v(". In the last months, openEO contributed several extensions to the STAC specification such as "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/blob/master/extensions/sar/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("an extension to describe Synthetic-Aperture Radar (SAR) data"),s("OutboundLink")],1),t._v(" or "),s("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/blob/master/extensions/datacube/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("an extension to describe Data Cubes"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Despite the process and data discovery, we generally improved the discovery of openEO back-ends. For example, the API now also allows clients to automatically detect supported API versions at the back-end, so that users don't need to keep track of that and can always connect to the same URL without worrying about compatibility between clients and back-ends. Our approach to "),s("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[t._v("user-defined functions (UDFs)"),s("OutboundLink")],1),t._v(" was also better integrated withing the API. UDF runtimes can be discovered now and well-defined processes allow executing UDFs. Many more improvements were incorporated into the API specification based on feedback from the review meeting, discussions with users and implementations (see the "),s("a",{attrs:{href:"https://open-eo.github.io/openeo-api/changelog/",target:"_blank",rel:"noopener noreferrer"}},[t._v("full changelog"),s("OutboundLink")],1),t._v(").")]),t._v(" "),s("h2",{attrs:{id:"next-steps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[t._v("#")]),t._v(" Next steps")]),t._v(" "),s("p",[t._v("This is the API version, which is targeted towards getting the first more universally usable version of the openEO clients and back-ends released. We will work hard now to implement the back-ends and clients to comply with the new API version and will follow up with a new blog post once this is achieved. Afterwards, all interested parties can use clients and back-ends to get a first solid impression of the project. In the meantime, it is already possible to make experiments with the back-ends and clients working on the API version 0.3.1. Please "),s("a",{attrs:{href:"http://openeo.org/contact/",target:"_blank",rel:"noopener noreferrer"}},[t._v("contact us"),s("OutboundLink")],1),t._v(" to get more information about it. Having said that, the new version is not the last one and we will continue to improve the API, client and back-ends. So any feedback is highly appreciated and can be sent our way via GitHub issues in the corresponding "),s("a",{attrs:{href:"https://github.com/open-eo",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub repositories"),s("OutboundLink")],1),t._v(" or via any of the other "),s("a",{attrs:{href:"http://openeo.org/contact/",target:"_blank",rel:"noopener noreferrer"}},[t._v("contact options"),s("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/51.4fbe2e9d.js b/assets/js/51.ed7fc11b.js similarity index 97% rename from assets/js/51.4fbe2e9d.js rename to assets/js/51.ed7fc11b.js index 7cd13b002..7b74be21e 100644 --- a/assets/js/51.4fbe2e9d.js +++ b/assets/js/51.ed7fc11b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{337:function(t,e,s){t.exports=s.p+"assets/img/r-client-vis.7bf4d9c7.png"},552:function(t,e,s){"use strict";s.r(e);var a=s(4),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("Today, we released a new version 1.2.0 of the openEO R Client, which features a couple of "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/releases/tag/v1.2.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("improvements and bug fixes"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("You can get it through CRAN: "),e("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("openeo"),e("OutboundLink")],1),t._v("\nThis means you can install or update the R client with the following command:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("install.packages"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("If you have trouble installing or working with the package, feel free to leave an issue in the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub issue tracker"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("We would like to highlight some of the changes:")]),t._v(" "),e("ul",[e("li",[e("p",[e("code",[t._v("get_sample")]),t._v(": We've introduced a method to retrieve sample data that can be used to experiment with a small subset of the data locally. A vignette shows how to use it: "),e("a",{attrs:{href:"https://cran.r-project.org/web/packages/openeo/vignettes/sample_data.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sample Data Retrieval"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("Many functions such as "),e("code",[t._v("list_collections")]),t._v(" , "),e("code",[t._v("describe_collection")]),t._v(", "),e("code",[t._v("list_processes")]),t._v(" now return visual components in environments that support it (Jupyter, RMarkdown, knitr). Here's an example of the collection list, which includes searching capabilities:\n"),e("img",{attrs:{src:s(337),alt:""}})])]),t._v(" "),e("li",[e("p",[t._v("The metadata filter in "),e("code",[t._v("load_collection")]),t._v(" was made much easier to use. "),e("strong",[t._v("You may need to adapt your code!")]),t._v("\nThe new method to filter by cloud cover looks very clean and is less cumbersome to write. It is as simple as this: "),e("code",[t._v('properties = list("eo:cloud_cover" = function(x) x <= 50)')]),t._v("\nBeforehand, the same filter had to be specified as such:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("properties "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eo:cloud_cover"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"process_graph"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cc"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"process_id"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"lte"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"arguments"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"from_parameter"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"y"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),e("li",[e("p",[t._v("The login procedure was greatly simplified for back-ends that support this new behavior. For example, on openEO Platform you can now login simply by calling the login method as such "),e("code",[t._v("login()")]),t._v(" instead of passing a client ID and secret tom "),e("code",[t._v("connect()")]),t._v(" or "),e("code",[t._v("login()")]),t._v(". It is still possible, but not required any more. It will then interactively guide you through the login procedure. It is now also supported to login in environments that are remotely hosted (e.g. RStudio Cloud, Jupyter).")])]),t._v(" "),e("li",[e("p",[t._v("Getting the JSON representation of a process is now simplified. The new recommended way is "),e("code",[t._v('toJSON(as(result, "Process"))')]),t._v(" where "),e("code",[t._v("result")]),t._v(" is the last node of your process, which usually is "),e("code",[t._v("save_result")]),t._v(".")])]),t._v(" "),e("li",[e("p",[t._v("Directly load data into "),e("a",{attrs:{href:"https://r-spatial.github.io/stars/",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("stars")]),e("OutboundLink")],1),t._v(" if you set "),e("code",[t._v("as_stars=TRUE")]),t._v(" in "),e("code",[t._v("compute_result")])])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{338:function(t,e,s){t.exports=s.p+"assets/img/r-client-vis.7bf4d9c7.png"},554:function(t,e,s){"use strict";s.r(e);var a=s(4),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("Today, we released a new version 1.2.0 of the openEO R Client, which features a couple of "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/releases/tag/v1.2.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("improvements and bug fixes"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("You can get it through CRAN: "),e("a",{attrs:{href:"https://cran.r-project.org/package=openeo",target:"_blank",rel:"noopener noreferrer"}},[t._v("openeo"),e("OutboundLink")],1),t._v("\nThis means you can install or update the R client with the following command:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("install.packages"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"openeo"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("If you have trouble installing or working with the package, feel free to leave an issue in the "),e("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub issue tracker"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("We would like to highlight some of the changes:")]),t._v(" "),e("ul",[e("li",[e("p",[e("code",[t._v("get_sample")]),t._v(": We've introduced a method to retrieve sample data that can be used to experiment with a small subset of the data locally. A vignette shows how to use it: "),e("a",{attrs:{href:"https://cran.r-project.org/web/packages/openeo/vignettes/sample_data.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sample Data Retrieval"),e("OutboundLink")],1)])]),t._v(" "),e("li",[e("p",[t._v("Many functions such as "),e("code",[t._v("list_collections")]),t._v(" , "),e("code",[t._v("describe_collection")]),t._v(", "),e("code",[t._v("list_processes")]),t._v(" now return visual components in environments that support it (Jupyter, RMarkdown, knitr). Here's an example of the collection list, which includes searching capabilities:\n"),e("img",{attrs:{src:s(338),alt:""}})])]),t._v(" "),e("li",[e("p",[t._v("The metadata filter in "),e("code",[t._v("load_collection")]),t._v(" was made much easier to use. "),e("strong",[t._v("You may need to adapt your code!")]),t._v("\nThe new method to filter by cloud cover looks very clean and is less cumbersome to write. It is as simple as this: "),e("code",[t._v('properties = list("eo:cloud_cover" = function(x) x <= 50)')]),t._v("\nBeforehand, the same filter had to be specified as such:")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("properties "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eo:cloud_cover"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"process_graph"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cc"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"process_id"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"lte"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"arguments"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" list"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"from_parameter"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"value"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"y"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" p\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),e("li",[e("p",[t._v("The login procedure was greatly simplified for back-ends that support this new behavior. For example, on openEO Platform you can now login simply by calling the login method as such "),e("code",[t._v("login()")]),t._v(" instead of passing a client ID and secret tom "),e("code",[t._v("connect()")]),t._v(" or "),e("code",[t._v("login()")]),t._v(". It is still possible, but not required any more. It will then interactively guide you through the login procedure. It is now also supported to login in environments that are remotely hosted (e.g. RStudio Cloud, Jupyter).")])]),t._v(" "),e("li",[e("p",[t._v("Getting the JSON representation of a process is now simplified. The new recommended way is "),e("code",[t._v('toJSON(as(result, "Process"))')]),t._v(" where "),e("code",[t._v("result")]),t._v(" is the last node of your process, which usually is "),e("code",[t._v("save_result")]),t._v(".")])]),t._v(" "),e("li",[e("p",[t._v("Directly load data into "),e("a",{attrs:{href:"https://r-spatial.github.io/stars/",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("stars")]),e("OutboundLink")],1),t._v(" if you set "),e("code",[t._v("as_stars=TRUE")]),t._v(" in "),e("code",[t._v("compute_result")])])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/53.a5075cbe.js b/assets/js/53.e3e05ceb.js similarity index 96% rename from assets/js/53.a5075cbe.js rename to assets/js/53.e3e05ceb.js index 21b45ea76..039f2c83e 100644 --- a/assets/js/53.a5075cbe.js +++ b/assets/js/53.e3e05ceb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{483:function(e,t,a){"use strict";a.r(t);var s={props:{name:{type:String,default:"default"},isolated:{type:Boolean,default:!1},languages:{type:Object,required:!1}},data(){return{selectedLanguage:this.languages?Object.keys(this.languages)[0]:null,actualLanguages:this.languages}},computed:{root(){let e,t=this;for(;e=t.$parent;)t=e;return t},localStorageKey(){return"vuepress-plugin-code-switcher@"+this.name}},methods:{switchLanguage(e){if(this.isolated)return this.selectedLanguage=e;"undefined"!=typeof localStorage&&localStorage.setItem(this.localStorageKey,e),this.root.$emit("change",{name:this.name,value:e})},setConfiguredDefaultLanguages(){if(this.languages)return;const e=this.$page.codeSwitcherOptions;e&&e.groups&&e.groups[this.name]&&(this.actualLanguages=e.groups[this.name],this.selectedLanguage=Object.keys(this.actualLanguages)[0])}},created(){if(!this.isolated){if(this.setConfiguredDefaultLanguages(),!this.actualLanguages)throw new Error('You must specify either the "languages" prop or use the "groups" option when configuring the plugin.');if("undefined"!=typeof localStorage){let e=localStorage.getItem(this.localStorageKey);e&&-1!==Object.keys(this.actualLanguages).indexOf(e)&&(this.selectedLanguage=e)}this.root.$on("change",({name:e,value:t})=>{e===this.name&&(this.selectedLanguage=t)})}}},n=a(4),u=Object(n.a)(s,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-switcher"},[t("div",{staticClass:"tab-header"},[t("ul",e._l(e.actualLanguages,(function(a,s){return t("li",{key:s,class:{active:e.selectedLanguage===s},on:{click:function(t){return e.switchLanguage(s)}}},[e._v(" "+e._s(a)+"\n ")])})),0)]),e._v(" "),e._l(e.actualLanguages,(function(a,s){return t("div",{directives:[{name:"show",rawName:"v-show",value:s===e.selectedLanguage,expression:"shorthand === selectedLanguage"}],key:s,staticClass:"tab-content"},[e._t(s)],2)}))],2)}),[],!1,null,null,null);t.default=u.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{485:function(e,t,a){"use strict";a.r(t);var s={props:{name:{type:String,default:"default"},isolated:{type:Boolean,default:!1},languages:{type:Object,required:!1}},data(){return{selectedLanguage:this.languages?Object.keys(this.languages)[0]:null,actualLanguages:this.languages}},computed:{root(){let e,t=this;for(;e=t.$parent;)t=e;return t},localStorageKey(){return"vuepress-plugin-code-switcher@"+this.name}},methods:{switchLanguage(e){if(this.isolated)return this.selectedLanguage=e;"undefined"!=typeof localStorage&&localStorage.setItem(this.localStorageKey,e),this.root.$emit("change",{name:this.name,value:e})},setConfiguredDefaultLanguages(){if(this.languages)return;const e=this.$page.codeSwitcherOptions;e&&e.groups&&e.groups[this.name]&&(this.actualLanguages=e.groups[this.name],this.selectedLanguage=Object.keys(this.actualLanguages)[0])}},created(){if(!this.isolated){if(this.setConfiguredDefaultLanguages(),!this.actualLanguages)throw new Error('You must specify either the "languages" prop or use the "groups" option when configuring the plugin.');if("undefined"!=typeof localStorage){let e=localStorage.getItem(this.localStorageKey);e&&-1!==Object.keys(this.actualLanguages).indexOf(e)&&(this.selectedLanguage=e)}this.root.$on("change",({name:e,value:t})=>{e===this.name&&(this.selectedLanguage=t)})}}},n=a(4),u=Object(n.a)(s,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-switcher"},[t("div",{staticClass:"tab-header"},[t("ul",e._l(e.actualLanguages,(function(a,s){return t("li",{key:s,class:{active:e.selectedLanguage===s},on:{click:function(t){return e.switchLanguage(s)}}},[e._v(" "+e._s(a)+"\n ")])})),0)]),e._v(" "),e._l(e.actualLanguages,(function(a,s){return t("div",{directives:[{name:"show",rawName:"v-show",value:s===e.selectedLanguage,expression:"shorthand === selectedLanguage"}],key:s,staticClass:"tab-content"},[e._t(s)],2)}))],2)}),[],!1,null,null,null);t.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/54.18bbc049.js b/assets/js/54.c4efa066.js similarity index 77% rename from assets/js/54.18bbc049.js rename to assets/js/54.c4efa066.js index 197861bad..f9f6c073f 100644 --- a/assets/js/54.18bbc049.js +++ b/assets/js/54.c4efa066.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{489:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{491:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/56.30a9586c.js b/assets/js/56.d02232ba.js similarity index 97% rename from assets/js/56.30a9586c.js rename to assets/js/56.d02232ba.js index 5c6a29452..1820960d6 100644 --- a/assets/js/56.30a9586c.js +++ b/assets/js/56.d02232ba.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{490:function(e,t,n){"use strict";n.r(t);var r=n(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contact"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contact"}},[e._v("#")]),e._v(" Contact")]),e._v(" "),t("p",[e._v("University of Münster"),t("br"),e._v("\nInstitute for Geoinformatics"),t("br"),e._v("\nc/o Edzer Pebesma"),t("br"),e._v("\nHeisenbergstraße 2"),t("br"),e._v("\n48149 Münster"),t("br"),e._v("\nGermany"),t("br")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("The email address below is meant for general topics around the openEO project, openEO PSC, openEO API specification, or openEO process specification.\nThe email address below is "),t("strong",[e._v("NOT")]),e._v(" meant for technical support regarding specific service providers or client implementations.")]),e._v(" "),t("ul",[t("li",[e._v("If you need help with specific service providers (e.g. openEO Platform or CDSE), please use their support channels.\n"),t("ul",[t("li",[t("a",{attrs:{href:"https://forums.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Platform Support Forum"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://helpcenter.dataspace.copernicus.eu/hc/en-gb/community/topics",target:"_blank",rel:"noopener noreferrer"}},[e._v("Copernicus Dataspace Ecosystem Support"),t("OutboundLink")],1)])])]),e._v(" "),t("li",[e._v("If you need help with specific clients, please use the corresponding GitHub issue trackers:\n"),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("R Client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Javascript Client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Web Editor"),t("OutboundLink")],1)])])]),e._v(" "),t("li",[e._v("If you have general questions or want to get in touch with the community, we recommend to join the chat (see below) and/or "),t("RouterLink",{attrs:{to:"/news/2022-07-07-monthly-dev-calls.html"}},[e._v("join the monthly community calls")]),e._v(".")],1)])]),e._v(" "),t("Channels",{attrs:{youtube:!1,code:!1}})],1)}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{495:function(e,t,n){"use strict";n.r(t);var r=n(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contact"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contact"}},[e._v("#")]),e._v(" Contact")]),e._v(" "),t("p",[e._v("University of Münster"),t("br"),e._v("\nInstitute for Geoinformatics"),t("br"),e._v("\nc/o Edzer Pebesma"),t("br"),e._v("\nHeisenbergstraße 2"),t("br"),e._v("\n48149 Münster"),t("br"),e._v("\nGermany"),t("br")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("The email address below is meant for general topics around the openEO project, openEO PSC, openEO API specification, or openEO process specification.\nThe email address below is "),t("strong",[e._v("NOT")]),e._v(" meant for technical support regarding specific service providers or client implementations.")]),e._v(" "),t("ul",[t("li",[e._v("If you need help with specific service providers (e.g. openEO Platform or CDSE), please use their support channels.\n"),t("ul",[t("li",[t("a",{attrs:{href:"https://forums.openeo.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Platform Support Forum"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://helpcenter.dataspace.copernicus.eu/hc/en-gb/community/topics",target:"_blank",rel:"noopener noreferrer"}},[e._v("Copernicus Dataspace Ecosystem Support"),t("OutboundLink")],1)])])]),e._v(" "),t("li",[e._v("If you need help with specific clients, please use the corresponding GitHub issue trackers:\n"),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("R Client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Javascript Client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Web Editor"),t("OutboundLink")],1)])])]),e._v(" "),t("li",[e._v("If you have general questions or want to get in touch with the community, we recommend to join the chat (see below) and/or "),t("RouterLink",{attrs:{to:"/news/2022-07-07-monthly-dev-calls.html"}},[e._v("join the monthly community calls")]),e._v(".")],1)])]),e._v(" "),t("Channels",{attrs:{youtube:!1,code:!1}})],1)}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/57.0ad03a99.js b/assets/js/57.be023c0a.js similarity index 96% rename from assets/js/57.0ad03a99.js rename to assets/js/57.be023c0a.js index 1927977d4..5ca5b832f 100644 --- a/assets/js/57.0ad03a99.js +++ b/assets/js/57.be023c0a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{491:function(t,e,o){"use strict";o.r(e);var n=o(4),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"openeo-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#openeo-documentation"}},[t._v("#")]),t._v(" openEO Documentation")]),t._v(" "),e("p",[t._v("This is the openEO Documentation for "),e("strong",[t._v("API versions 0.4")]),t._v(". This version is "),e("strong",[t._v("outdated")]),t._v(" and got replaced by "),e("strong",[e("RouterLink",{attrs:{to:"/documentation/1.0/"}},[t._v("API version 1.0")])],1),t._v(".")]),t._v(" "),e("p",[t._v("Some useful links to get started:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/getting-started.html"}},[t._v("Getting started for users")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/developers/clients/getting-started.html"}},[t._v("Getting started for client developers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/developers/backends/getting-started.html"}},[t._v("Getting started for service providers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/glossary.html"}},[t._v("openEO Glossary")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/processes.html"}},[t._v("openEO Processes")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/udfs.html"}},[t._v("openEO UDFs for users")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[t._v("openEO API")])],1)]),t._v(" "),e("p",[t._v('Feel encouraged to use the "User Documentation" and "Developers" menu items for further navigation through the documentation.')])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{493:function(t,e,o){"use strict";o.r(e);var n=o(4),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"openeo-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#openeo-documentation"}},[t._v("#")]),t._v(" openEO Documentation")]),t._v(" "),e("p",[t._v("This is the openEO Documentation for "),e("strong",[t._v("API versions 0.4")]),t._v(". This version is "),e("strong",[t._v("outdated")]),t._v(" and got replaced by "),e("strong",[e("RouterLink",{attrs:{to:"/documentation/1.0/"}},[t._v("API version 1.0")])],1),t._v(".")]),t._v(" "),e("p",[t._v("Some useful links to get started:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/getting-started.html"}},[t._v("Getting started for users")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/developers/clients/getting-started.html"}},[t._v("Getting started for client developers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/developers/backends/getting-started.html"}},[t._v("Getting started for service providers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/glossary.html"}},[t._v("openEO Glossary")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/processes.html"}},[t._v("openEO Processes")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/udfs.html"}},[t._v("openEO UDFs for users")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[t._v("openEO API")])],1)]),t._v(" "),e("p",[t._v('Feel encouraged to use the "User Documentation" and "Developers" menu items for further navigation through the documentation.')])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/59.a5c10865.js b/assets/js/59.98d52ecf.js similarity index 77% rename from assets/js/59.a5c10865.js rename to assets/js/59.98d52ecf.js index 0a501fafc..5215f7702 100644 --- a/assets/js/59.a5c10865.js +++ b/assets/js/59.98d52ecf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{493:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{496:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/6.c400917d.js b/assets/js/6.944b6217.js similarity index 73% rename from assets/js/6.c400917d.js rename to assets/js/6.944b6217.js index 4a8160bd6..ed9daea6d 100644 --- a/assets/js/6.c400917d.js +++ b/assets/js/6.944b6217.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{269:function(t,e,n){},405:function(t,e,n){"use strict";n(269)},485:function(t,e,n){"use strict";n.r(e);var i=n(157),s={name:"ExperimentalNotice",props:{entity:String},beforeCreate(){i.a.enableHtmlProps(this)}},o=(n(405),n(4)),a=Object(o.a)(s,(function(){var t=this._self._c;return t("div",{staticClass:"vue-component message-block experimental-notice"},[t("strong",[this._v("Experimental")]),this._v(" "),t("p",[this._v("Please note that this "+this._s(this.entity)+" is experimental with the potential for major things to change. Feel encouraged to try it out and give feedback, but refrain from using it in production.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{270:function(t,e,n){},407:function(t,e,n){"use strict";n(270)},487:function(t,e,n){"use strict";n.r(e);var i=n(157),s={name:"ExperimentalNotice",props:{entity:String},beforeCreate(){i.a.enableHtmlProps(this)}},o=(n(407),n(4)),a=Object(o.a)(s,(function(){var t=this._self._c;return t("div",{staticClass:"vue-component message-block experimental-notice"},[t("strong",[this._v("Experimental")]),this._v(" "),t("p",[this._v("Please note that this "+this._s(this.entity)+" is experimental with the potential for major things to change. Feel encouraged to try it out and give feedback, but refrain from using it in production.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/77.593bb969.js b/assets/js/61.63a82844.js similarity index 78% rename from assets/js/77.593bb969.js rename to assets/js/61.63a82844.js index 1a3e770ba..1db146a69 100644 --- a/assets/js/77.593bb969.js +++ b/assets/js/61.63a82844.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{515:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ApiSpec")],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{498:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ApiSpec")],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/62.e3cfb588.js b/assets/js/62.3bc649ef.js similarity index 98% rename from assets/js/62.e3cfb588.js rename to assets/js/62.3bc649ef.js index f21d3affe..6ab5afffd 100644 --- a/assets/js/62.e3cfb588.js +++ b/assets/js/62.3bc649ef.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{498:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-back-end-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-back-end-providers"}},[e._v("#")]),e._v(" Getting started for back-end providers")]),e._v(" "),t("p",[e._v("As a back-end provider who wants to provide its datasets, processes and infrastructure to a broader audience through a standardized interface you may want to implement a driver for openEO.")]),e._v(" "),t("p",[e._v("First of all, you should go through the list of "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO repositories"),t("OutboundLink")],1),e._v(' and check whether there is already a back-end driver that suits your needs. In this case you don\'t need to develop your own driver, but "only" need to ingest your data, adopt your required processes and set up the infrastructure. Please follow the documentation for the individual driver you want to use.')]),e._v(" "),t("p",[e._v("If your preferred technology has no back-end driver yet, you may consider writing your own driver. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("p",[e._v("You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/glossary.html"}},[e._v("glossary")]),e._v(", the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/arch.html"}},[e._v("architecture")]),e._v(" of openEO and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("process graphs")]),e._v(". This helps you read and understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(". Technical API related documents like "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("CORS")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/errors.html"}},[e._v("error handing")]),e._v(" should be read, too.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a server stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(".\nIf you are using Python to implement your driver you may reuse some common modules of the existing driver implementations:")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Driver Commons"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("You can implement a back-end in iterations. It is recommended to start by implementing the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/Capabilities"}},[e._v("Capabilities")]),e._v(" microservice. "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/EO-Data-Discovery"}},[e._v("EO Data Discovery")]),e._v(", "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/Process-Discovery"}},[e._v("Process Discovery")]),e._v(" are important for the client libraries to be available, too. Afterwards you should implement "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/Batch-Job-Management"}},[e._v("Batch Job Management")]),e._v(" or "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#/paths/~1result/post"}},[e._v("synchronous data processing")]),e._v(". All other microservices can be added later and are not strictly required to run openEO services. Keep in mind that you don't need to implement all endpoints in the first iteration and that you can specify in the Capabilities, which endpoints you are supporting.")],1),e._v(" "),t("p",[e._v("For example, you could start by implementing the following endpoints in the first iteration:")]),e._v(" "),t("ul",[t("li",[e._v("Well-Known Document: "),t("code",[e._v("GET /.well-known/openeo")])]),e._v(" "),t("li",[e._v("Capabilities: "),t("code",[e._v("GET /")]),e._v(" and "),t("code",[e._v("GET /output_formats")])]),e._v(" "),t("li",[e._v("Data discovery: "),t("code",[e._v("GET /collections")]),e._v(" and "),t("code",[e._v("GET /collections/{collection_id}")])]),e._v(" "),t("li",[e._v("Process discovery: "),t("code",[e._v("GET /processes")])]),e._v(" "),t("li",[e._v("Data processing: "),t("code",[e._v("POST /result")])]),e._v(" "),t("li",[e._v("Authentication (if required): "),t("code",[e._v("GET /credentials/basic")])])]),e._v(" "),t("p",[e._v("Afterwards you can already start experimenting with your first process graphs and process EO data with our client libraries on your back-end.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{500:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-back-end-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-back-end-providers"}},[e._v("#")]),e._v(" Getting started for back-end providers")]),e._v(" "),t("p",[e._v("As a back-end provider who wants to provide its datasets, processes and infrastructure to a broader audience through a standardized interface you may want to implement a driver for openEO.")]),e._v(" "),t("p",[e._v("First of all, you should go through the list of "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO repositories"),t("OutboundLink")],1),e._v(' and check whether there is already a back-end driver that suits your needs. In this case you don\'t need to develop your own driver, but "only" need to ingest your data, adopt your required processes and set up the infrastructure. Please follow the documentation for the individual driver you want to use.')]),e._v(" "),t("p",[e._v("If your preferred technology has no back-end driver yet, you may consider writing your own driver. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("p",[e._v("You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/glossary.html"}},[e._v("glossary")]),e._v(", the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/arch.html"}},[e._v("architecture")]),e._v(" of openEO and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("process graphs")]),e._v(". This helps you read and understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(". Technical API related documents like "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("CORS")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/errors.html"}},[e._v("error handing")]),e._v(" should be read, too.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a server stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(".\nIf you are using Python to implement your driver you may reuse some common modules of the existing driver implementations:")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Driver Commons"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("You can implement a back-end in iterations. It is recommended to start by implementing the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/Capabilities"}},[e._v("Capabilities")]),e._v(" microservice. "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/EO-Data-Discovery"}},[e._v("EO Data Discovery")]),e._v(", "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/Process-Discovery"}},[e._v("Process Discovery")]),e._v(" are important for the client libraries to be available, too. Afterwards you should implement "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#tag/Batch-Job-Management"}},[e._v("Batch Job Management")]),e._v(" or "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html#/paths/~1result/post"}},[e._v("synchronous data processing")]),e._v(". All other microservices can be added later and are not strictly required to run openEO services. Keep in mind that you don't need to implement all endpoints in the first iteration and that you can specify in the Capabilities, which endpoints you are supporting.")],1),e._v(" "),t("p",[e._v("For example, you could start by implementing the following endpoints in the first iteration:")]),e._v(" "),t("ul",[t("li",[e._v("Well-Known Document: "),t("code",[e._v("GET /.well-known/openeo")])]),e._v(" "),t("li",[e._v("Capabilities: "),t("code",[e._v("GET /")]),e._v(" and "),t("code",[e._v("GET /output_formats")])]),e._v(" "),t("li",[e._v("Data discovery: "),t("code",[e._v("GET /collections")]),e._v(" and "),t("code",[e._v("GET /collections/{collection_id}")])]),e._v(" "),t("li",[e._v("Process discovery: "),t("code",[e._v("GET /processes")])]),e._v(" "),t("li",[e._v("Data processing: "),t("code",[e._v("POST /result")])]),e._v(" "),t("li",[e._v("Authentication (if required): "),t("code",[e._v("GET /credentials/basic")])])]),e._v(" "),t("p",[e._v("Afterwards you can already start experimenting with your first process graphs and process EO data with our client libraries on your back-end.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/70.cf1d0c0b.js b/assets/js/63.c2f90289.js similarity index 95% rename from assets/js/70.cf1d0c0b.js rename to assets/js/63.c2f90289.js index 9b0d2717f..0ecce7c8d 100644 --- a/assets/js/70.cf1d0c0b.js +++ b/assets/js/63.c2f90289.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{507:function(e,t,r){"use strict";r.r(t);var n=r(4),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"user-defined-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[e._v("#")]),e._v(" User-defined functions")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, allowing custom calculations on server-side data.")]),e._v(" "),t("p",[e._v("UDFs are currently developed and evaluated outside of the core API. More information regarding the current "),t("strong",[e._v("draft")]),e._v(" for UDFs can be found in a "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("separate repository"),t("OutboundLink")],1),e._v(". There is additional documentation available for the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF Framework"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/api_docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF API"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{502:function(e,t,r){"use strict";r.r(t);var n=r(4),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"user-defined-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[e._v("#")]),e._v(" User-defined functions")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, allowing custom calculations on server-side data.")]),e._v(" "),t("p",[e._v("UDFs are currently developed and evaluated outside of the core API. More information regarding the current "),t("strong",[e._v("draft")]),e._v(" for UDFs can be found in a "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("separate repository"),t("OutboundLink")],1),e._v(". There is additional documentation available for the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF Framework"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/api_docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF API"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/64.9287f5a3.js b/assets/js/64.e0fc30e5.js similarity index 98% rename from assets/js/64.9287f5a3.js rename to assets/js/64.e0fc30e5.js index 585727bfd..83cf0ac1a 100644 --- a/assets/js/64.9287f5a3.js +++ b/assets/js/64.e0fc30e5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{500:function(e,t,r){"use strict";r.r(t);var a=r(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-client-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-client-developers"}},[e._v("#")]),e._v(" Getting started for client developers")]),e._v(" "),t("p",[e._v("For easy access to openEO back-ends it is essential to provide client libraries for users in their well-known programming languages or working environments. This can be either a "),t("em",[e._v("client library")]),e._v(" for a specific programming language that hides the technical details of the openEO API or an application with a user interface, e.g. a GIS software plugin or a web-based tool. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"client-library-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-library-developers"}},[e._v("#")]),e._v(" Client library developers")]),e._v(" "),t("p",[e._v("If your preferred programming language is not part of the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("available client libraries")]),e._v(" you may consider writing your own client library. Our client libraries are basically translating the openEO API into native concepts of the programming languages. Working with openEO should feel like being a "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/First-class_citizen",target:"_blank",rel:"noopener noreferrer"}},[e._v("first-class citizen"),t("OutboundLink")],1),e._v(" of the programming language.")],1),e._v(" "),t("p",[e._v("Get started by reading the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/clients/library-guidelines.html"}},[e._v("guidelines to develop client libraries")]),e._v(", which have been written to ensure the client libraries provide a consistent feel and behavior across programming languages. You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/glossary.html"}},[e._v("glossary")]),e._v(" and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("process graphs")]),e._v(". This helps you understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(" and related documents.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a client library stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(". Make sure the generated code complies to the client library guidelines mentioned above.")],1),e._v(" "),t("h2",{attrs:{id:"applications-and-software-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applications-and-software-plugins"}},[e._v("#")]),e._v(" Applications and Software plugins")]),e._v(" "),t("p",[e._v("Standalone applications and software plugins written in a certain programming language could use the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("existing client libraries")]),e._v(" to facilitate access to openEO back-ends. Web applications potentially could use the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript client"),t("OutboundLink")],1),e._v(" to access openEO back-ends. Back-Ends may also provide standardized web interfaces such as OGC WMS or OGC WCS to access processed EO data.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{501:function(e,t,r){"use strict";r.r(t);var a=r(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-client-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-client-developers"}},[e._v("#")]),e._v(" Getting started for client developers")]),e._v(" "),t("p",[e._v("For easy access to openEO back-ends it is essential to provide client libraries for users in their well-known programming languages or working environments. This can be either a "),t("em",[e._v("client library")]),e._v(" for a specific programming language that hides the technical details of the openEO API or an application with a user interface, e.g. a GIS software plugin or a web-based tool. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"client-library-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-library-developers"}},[e._v("#")]),e._v(" Client library developers")]),e._v(" "),t("p",[e._v("If your preferred programming language is not part of the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("available client libraries")]),e._v(" you may consider writing your own client library. Our client libraries are basically translating the openEO API into native concepts of the programming languages. Working with openEO should feel like being a "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/First-class_citizen",target:"_blank",rel:"noopener noreferrer"}},[e._v("first-class citizen"),t("OutboundLink")],1),e._v(" of the programming language.")],1),e._v(" "),t("p",[e._v("Get started by reading the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/clients/library-guidelines.html"}},[e._v("guidelines to develop client libraries")]),e._v(", which have been written to ensure the client libraries provide a consistent feel and behavior across programming languages. You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/glossary.html"}},[e._v("glossary")]),e._v(" and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("process graphs")]),e._v(". This helps you understand the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(" and related documents.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a client library stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(". Make sure the generated code complies to the client library guidelines mentioned above.")],1),e._v(" "),t("h2",{attrs:{id:"applications-and-software-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applications-and-software-plugins"}},[e._v("#")]),e._v(" Applications and Software plugins")]),e._v(" "),t("p",[e._v("Standalone applications and software plugins written in a certain programming language could use the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("existing client libraries")]),e._v(" to facilitate access to openEO back-ends. Web applications potentially could use the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript client"),t("OutboundLink")],1),e._v(" to access openEO back-ends. Back-Ends may also provide standardized web interfaces such as OGC WMS or OGC WCS to access processed EO data.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/65.d0cbf1c7.js b/assets/js/65.9bc8a7eb.js similarity index 99% rename from assets/js/65.d0cbf1c7.js rename to assets/js/65.9bc8a7eb.js index b9a162e59..0a009dc24 100644 --- a/assets/js/65.d0cbf1c7.js +++ b/assets/js/65.9bc8a7eb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{501:function(t,s,e){"use strict";e.r(s);var a=e(4),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"client-library-development-guidelines"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#client-library-development-guidelines"}},[t._v("#")]),t._v(" Client library development guidelines")]),t._v(" "),s("p",[t._v("This is a proposal for workflows that client libraries should support to make the experience with each library similar and users can easily adopt examples and workflows.")]),t._v(" "),s("p",[t._v("For best experience libraries should still embrace best practices common in their environments. This means clients can...")]),t._v(" "),s("ul",[s("li",[t._v("choose which kind of casing they use (see below).")]),t._v(" "),s("li",[t._v("feel free to implement aliases for methods.")])]),t._v(" "),s("h2",{attrs:{id:"conventions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#conventions"}},[t._v("#")]),t._v(" Conventions")]),t._v(" "),s("h3",{attrs:{id:"casing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#casing"}},[t._v("#")]),t._v(" Casing")]),t._v(" "),s("p",[t._v("Clients can use "),s("code",[t._v("snake_case")]),t._v(", "),s("code",[t._v("camelCase")]),t._v(" or any method used commonly in their environment. For example, the API request to get a list of collections can either be names "),s("code",[t._v("get_collections")]),t._v(" or "),s("code",[t._v("getCollections")]),t._v(". This applies for all names, including scopes, method names and parameters.")]),t._v(" "),s("h3",{attrs:{id:"scopes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scopes"}},[t._v("#")]),t._v(" Scopes")]),t._v(" "),s("p",[t._v('Each method belongs to a scope. To achieve this in object-oriented (OO) programming languages, methods would be part of a class. If programming languages don\'t support scopes, you may need to simulate it somehow to prevent name collisions, e.g. by adding a prefix to the method names (like in the "procedural style" example below). Best practices for this will likely evolve over time.')]),t._v(" "),s("p",[t._v("Example for the "),s("code",[t._v("clientVersion")]),t._v(" method in "),s("code",[t._v("openEO")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("Procedural style: "),s("code",[t._v("openeo_client_version()")])]),t._v(" "),s("li",[t._v("Object-oriented style:"),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nobj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clientVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("p",[t._v("If you can't store scope data in an object, you may need to pass these information as argument(s) to the method.")]),t._v(" "),s("p",[t._v("Example:")]),t._v(" "),s("ul",[s("li",[t._v("Procedural style:"),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[t._v("Object-oriented style:"),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncon"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"scope-categories"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-categories"}},[t._v("#")]),t._v(" Scope categories")]),t._v(" "),s("p",[t._v("Each scope is assigned to a scope category, of which there are three:")]),t._v(" "),s("ul",[s("li",[s("em",[t._v("Root")]),t._v(" category: Contains only the scope "),s("code",[t._v("openEO")]),t._v(".")]),t._v(" "),s("li",[s("em",[t._v("API")]),t._v(" category: Mostly methods hiding API calls to the back-ends. Methods may be implemented asynchronously. Contains the scopes "),s("code",[t._v("Connection")]),t._v(", "),s("code",[t._v("File")]),t._v(", "),s("code",[t._v("Job")]),t._v(", "),s("code",[t._v("ProcessGraph")]),t._v(", "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("li",[s("em",[t._v("Content")]),t._v(": Mostly methods hiding the complexity of response content. Methods are usually implemented synchronously. Currently contains only the scope "),s("code",[t._v("Capabilities")]),t._v(". Method names should be prefixed if name collisions are likely.")])]),t._v(" "),s("p",[t._v("Method names across ALL the scopes that belong to the "),s("em",[t._v("root")]),t._v(" or "),s("em",[t._v("API")]),t._v(" categories MUST be unique. This is the case because the parameter in "),s("code",[t._v("hasFeature(method_name)")]),t._v(" must be unambiguous.")]),t._v(" "),s("p",[t._v("Method names of scopes in the "),s("em",[t._v("Content")]),t._v(" category may collide with method names of scopes in the "),s("em",[t._v("root")]),t._v("/"),s("em",[t._v("API")]),t._v(" categories and names should be prefixed if collisions of names between different scope categories are to be expected.")]),t._v(" "),s("h3",{attrs:{id:"parameters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("p",[t._v("The parameters usually follow the request schemes in the openAPI specification. The parameters should follow their characteristics, for example regarding the default values.")]),t._v(" "),s("p",[t._v("Some methods have a long list of (optional) parameters. This is easy to implement in languages that support named parameters such as R. For example, creating a job in R with a budget would lead to this method call:")]),t._v(" "),s("div",{staticClass:"language-R extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("createJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process_graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token ellipsis"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" budget "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("Other languages that only support non-named parameters (i.e. the order of parameters is fixed) need to fill many parameters with default values, which is not convenient for a user. The example above in PHP would be:")]),t._v(" "),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To avoid such method calls client developers should consider to pass either")]),t._v(" "),s("ul",[s("li",[t._v("an instance of a class, which contains all parameters as member variables or")]),t._v(" "),s("li",[t._v("the required parameters directly and the optional parameters as a dictionary (see example below).")])]),t._v(" "),s("p",[t._v("This basically emulates named parameters. The member variables / dictionary keys should use the same names as the parameters. The exemplary method call in PHP could be improved as follows:")]),t._v(" "),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("budget "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"method-mappings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#method-mappings"}},[t._v("#")]),t._v(" Method mappings")]),t._v(" "),s("p",[s("strong",[t._v("Note:")]),t._v(" Subscriptions and some scopes for response JSON objects are still missing. We are open for proposals.")]),t._v(" "),s("p",[t._v("Parameters with a leading "),s("code",[t._v("?")]),t._v(" are optional.")]),t._v(" "),s("h3",{attrs:{id:"scope-openeo-root-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-openeo-root-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("openEO")]),t._v(" (root category)")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Connect to a back-end, includes version discovery ("),s("code",[t._v("GET /well-known/openeo")]),t._v("), requesting capabilities and authentication where required. Returns "),s("code",[t._v("Connection")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("connect(url, ?authType, ?authOptions)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get client library version.")]),t._v(" "),s("td",[s("code",[t._v("clientVersion()")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-2"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("authType")]),t._v(" in "),s("code",[t._v("connect")]),t._v(": "),s("code",[t._v("null")]),t._v(", "),s("code",[t._v("basic")]),t._v(" or "),s("code",[t._v("oidc")]),t._v(" (non-exclusive). Defaults to "),s("code",[t._v("null")]),t._v(" (no authentication).")]),t._v(" "),s("li",[s("strong",[t._v("authOptions")]),t._v(" in "),s("code",[t._v("connect")]),t._v(": May hold additional data for authentication, for example a username and password for "),s("code",[t._v("basic")]),t._v(" authentication.")])]),t._v(" "),s("h3",{attrs:{id:"scope-connection-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-connection-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("Connection")]),t._v(" (API category)")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get the capabilities of the back-end. Returns "),s("code",[t._v("Capabilities")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /")])]),t._v(" "),s("td",[s("code",[t._v("capabilities()")])])]),t._v(" "),s("tr",[s("td",[t._v("List the supported output file formats.")]),t._v(" "),s("td",[s("code",[t._v("GET /output_formats")])]),t._v(" "),s("td",[s("code",[t._v("listFileTypes()")])])]),t._v(" "),s("tr",[s("td",[t._v("List the supported secondary service types.")]),t._v(" "),s("td",[s("code",[t._v("GET /service_types")])]),t._v(" "),s("td",[s("code",[t._v("listServiceTypes()")])])]),t._v(" "),s("tr",[s("td",[t._v("List the supported UDF runtimes.")]),t._v(" "),s("td",[s("code",[t._v("GET /udf_runtimes")])]),t._v(" "),s("td",[s("code",[t._v("listUdfRuntimes()")])])]),t._v(" "),s("tr",[s("td",[t._v("List all collections available on the back-end.")]),t._v(" "),s("td",[s("code",[t._v("GET /collections")])]),t._v(" "),s("td",[s("code",[t._v("listCollections()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get information about a single collection.")]),t._v(" "),s("td",[s("code",[t._v("GET /collections/{collection_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeCollection(collection_id)")])])]),t._v(" "),s("tr",[s("td",[t._v("List all processes available on the back-end.")]),t._v(" "),s("td",[s("code",[t._v("GET /processes")])]),t._v(" "),s("td",[s("code",[t._v("listProcesses()")])])]),t._v(" "),s("tr",[s("td",[t._v("Authenticate with OpenID Connect (if not specified in "),s("code",[t._v("connect")]),t._v(").")]),t._v(" "),s("td",[s("code",[t._v("GET /credentials/oidc")])]),t._v(" "),s("td",[s("code",[t._v("authenticateOIDC(?options)")])])]),t._v(" "),s("tr",[s("td",[t._v("Authenticate with HTTP Basic (if not specified in "),s("code",[t._v("connect")]),t._v(").")]),t._v(" "),s("td",[s("code",[t._v("GET /credentials/basic")])]),t._v(" "),s("td",[s("code",[t._v("authenticateBasic(username, password)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get information about the authenticated user.")]),t._v(" "),s("td",[s("code",[t._v("GET /me")])]),t._v(" "),s("td",[s("code",[t._v("describeAccount()")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all files from a user. Returns a list of "),s("code",[t._v("File")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /files/{user_id}")])]),t._v(" "),s("td",[s("code",[t._v("listFiles(?userId)")])])]),t._v(" "),s("tr",[s("td",[t._v("Opens a (existing or non-existing) file without reading any information. Returns a "),s("code",[t._v("File")]),t._v(".")]),t._v(" "),s("td",[s("em",[t._v("None")])]),t._v(" "),s("td",[s("code",[t._v("openFile(path, ?userId)")])])]),t._v(" "),s("tr",[s("td",[t._v("Validates a process graph.")]),t._v(" "),s("td",[s("code",[t._v("POST /validation")])]),t._v(" "),s("td",[s("code",[t._v("validateProcessGraph(processGraph)")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all process graphs of the authenticated user. Returns a list of "),s("code",[t._v("ProcessGraph")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /process_graphs")])]),t._v(" "),s("td",[s("code",[t._v("listProcessGraphs()")])])]),t._v(" "),s("tr",[s("td",[t._v("Creates a new stored process graph. Returns a "),s("code",[t._v("ProcessGraph")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("POST /process_graphs")])]),t._v(" "),s("td",[s("code",[t._v("createProcessGraph(processGraph, ?title, ?description)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get all information about a stored process graph. Returns a "),s("code",[t._v("ProcessGraph")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("getProcessGraphById(id)")])])]),t._v(" "),s("tr",[s("td",[t._v("Executes a process graph synchronously.")]),t._v(" "),s("td",[s("code",[t._v("POST /result")])]),t._v(" "),s("td",[s("code",[t._v("computeResult(processGraph, ?plan, ?budget)")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all jobs of the authenticated user. Returns a list of "),s("code",[t._v("Job")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs")])]),t._v(" "),s("td",[s("code",[t._v("listJobs()")])])]),t._v(" "),s("tr",[s("td",[t._v("Creates a new job. Returns a "),s("code",[t._v("Job")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("POST /jobs")])]),t._v(" "),s("td",[s("code",[t._v("createJob(processGraph, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get all information about a job. Returns a "),s("code",[t._v("Job")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("getJobById(id)")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all secondary services of the authenticated user. Returns a list of "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /services")])]),t._v(" "),s("td",[s("code",[t._v("listServices()")])])]),t._v(" "),s("tr",[s("td",[t._v("Creates a new secondary service. Returns a "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("POST /services")])]),t._v(" "),s("td",[s("code",[t._v("createService(processGraph, type, ?title, ?description, ?enabled, ?parameters, ?plan, ?budget)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get all information about a service. Returns a "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("getServiceById(id)")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-3"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("userId")]),t._v(" in "),s("code",[t._v("listFiles")]),t._v(" and "),s("code",[t._v("createFile")]),t._v(": Defaults to the user id of the authenticated user.")]),t._v(" "),s("li",[s("strong",[t._v("options")]),t._v(" in "),s("code",[t._v("authenticateOIDC")]),t._v(": May hold additional data required for OpenID connect authentication.")])]),t._v(" "),s("h3",{attrs:{id:"scope-capabilities-content-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-capabilities-content-category"}},[t._v("#")]),t._v(" Scope "),s("code",[t._v("Capabilities")]),t._v(" (Content category)")]),t._v(" "),s("p",[t._v("Should be prefixed with "),s("code",[t._v("Capabilities")]),t._v(" if collisions of names between different scope categories are to be expected.")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("Field")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get the implemented openEO version.")]),t._v(" "),s("td",[s("code",[t._v("api_version")])]),t._v(" "),s("td",[s("code",[t._v("apiVersion()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the back-end version.")]),t._v(" "),s("td",[s("code",[t._v("backend_version")])]),t._v(" "),s("td",[s("code",[t._v("backendVersion()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the name of the back-end.")]),t._v(" "),s("td",[s("code",[t._v("title")])]),t._v(" "),s("td",[s("code",[t._v("title()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the description of the back-end.")]),t._v(" "),s("td",[s("code",[t._v("description")])]),t._v(" "),s("td",[s("code",[t._v("description()")])])]),t._v(" "),s("tr",[s("td",[t._v("List all supported features / endpoints.")]),t._v(" "),s("td",[s("code",[t._v("endpoints")])]),t._v(" "),s("td",[s("code",[t._v("listFeatures()")])])]),t._v(" "),s("tr",[s("td",[t._v("Check whether a feature / endpoint is supported.")]),t._v(" "),s("td",[s("code",[t._v("endpoints")]),t._v(" > ...")]),t._v(" "),s("td",[s("code",[t._v("hasFeature(methodName)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the default billing currency.")]),t._v(" "),s("td",[s("code",[t._v("billing")]),t._v(" > "),s("code",[t._v("currency")])]),t._v(" "),s("td",[s("code",[t._v("currency()")])])]),t._v(" "),s("tr",[s("td",[t._v("List all billing plans.")]),t._v(" "),s("td",[s("code",[t._v("billing")]),t._v(" > "),s("code",[t._v("plans")])]),t._v(" "),s("td",[s("code",[t._v("listPlans()")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-4"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("methodName")]),t._v(" in "),s("code",[t._v("hasFeature")]),t._v(": The name of a client method in any of the scopes that are part of the "),s("em",[t._v("API")]),t._v(" category. E.g. "),s("code",[t._v('hasFeature("describeAccount")')]),t._v(" checks whether the "),s("code",[t._v("GET /me")]),t._v(" endpoint is contained in the capabilities response's "),s("code",[t._v("endpoints")]),t._v(" object.")])]),t._v(" "),s("h3",{attrs:{id:"scope-file-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-file-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("File")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("File")]),t._v(" scope internally knows the "),s("code",[t._v("user_id")]),t._v(" and the "),s("code",[t._v("path")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Download a user file.")]),t._v(" "),s("td",[s("code",[t._v("GET /files/{user_id}/{path}")])]),t._v(" "),s("td",[s("code",[t._v("downloadFile(target)")])])]),t._v(" "),s("tr",[s("td",[t._v("Upload a user file.")]),t._v(" "),s("td",[s("code",[t._v("PUT /files/{user_id}/{path}")])]),t._v(" "),s("td",[s("code",[t._v("uploadFile(source)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a user file.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /files/{user_id}/{path}")])]),t._v(" "),s("td",[s("code",[t._v("deleteFile()")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-5"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("target")]),t._v(" in "),s("code",[t._v("downloadFile")]),t._v(": Path to a local file or folder.")])]),t._v(" "),s("h3",{attrs:{id:"scope-job-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-job-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("Job")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("Job")]),t._v(" scope internally knows the "),s("code",[t._v("job_id")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get (and update on client-side) all job information.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Modify a job at the back-end.")]),t._v(" "),s("td",[s("code",[t._v("PATCH /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("updateJob(?processGraph, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a job")]),t._v(" "),s("td",[s("code",[t._v("DELETE /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("deleteJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Calculate an time/cost estimate for a job.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/estimate")])]),t._v(" "),s("td",[s("code",[t._v("estimateJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get log file for job.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/logs")])]),t._v(" "),s("td",[s("code",[t._v("debugJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Start / queue a job for processing.")]),t._v(" "),s("td",[s("code",[t._v("POST /jobs/{job_id}/results")])]),t._v(" "),s("td",[s("code",[t._v("startJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Stop / cancel job processing.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /jobs/{job_id}/results")])]),t._v(" "),s("td",[s("code",[t._v("stopJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get document with download links.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/results")])]),t._v(" "),s("td",[s("code",[t._v("listResults()")])])]),t._v(" "),s("tr",[s("td",[t._v("Download job results.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/results")]),t._v(" > ...")]),t._v(" "),s("td",[s("code",[t._v("downloadResults(target)")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-6"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("target")]),t._v(" in "),s("code",[t._v("downloadResults")]),t._v(": Path to a local folder.")])]),t._v(" "),s("h3",{attrs:{id:"scope-processgraph-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-processgraph-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("ProcessGraph")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("ProcessGraph")]),t._v(" scope internally knows the "),s("code",[t._v("process_graph_id")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get (and update on client-side) all information about a stored process graph.")]),t._v(" "),s("td",[s("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeProcessGraph()")])])]),t._v(" "),s("tr",[s("td",[t._v("Modify a stored process graph at the back-end.")]),t._v(" "),s("td",[s("code",[t._v("PATCH /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("updateProcessGraph(?processGraph, ?title, ?description)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a stored process graph.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("deleteProcessGraph()")])])])])]),t._v(" "),s("h3",{attrs:{id:"scope-service-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-service-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("Service")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("Service")]),t._v(" scope internally knows the "),s("code",[t._v("service_id")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get (and update on client-side) all information about a secondary web service.")]),t._v(" "),s("td",[s("code",[t._v("GET /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeService()")])])]),t._v(" "),s("tr",[s("td",[t._v("Modify a secondary web service at the back-end.")]),t._v(" "),s("td",[s("code",[t._v("PATCH /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("updateService(?processGraph, ?title, ?description, ?enabled, ?parameters, ?plan, ?budget)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a secondary web service.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("deleteService()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get log file for web service.")]),t._v(" "),s("td",[s("code",[t._v("GET /services/{service_id}/logs")])]),t._v(" "),s("td",[s("code",[t._v("debugService()")])])])])]),t._v(" "),s("h2",{attrs:{id:"processes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),s("p",[t._v("The processes a back-end supports may be offered by the clients as methods in its own scope. The method names should follow the process names, but the conventions listed above can be applied here as well, e.g. converting "),s("code",[t._v("filter_bands")]),t._v(" to "),s("code",[t._v("filterBands")]),t._v(". As parameters have no natural or technical ordering in the JSON objects, clients must come up with a reasonable ordering of parameters if required. This could be inspired by existing clients. The way of building a process graph from processes heavily depends on the technical capabilities of the programming language. Therefore it may differ between the client libraries. Follow the best practices of the programming language, e.g. support method chaining if possible.")]),t._v(" "),s("h2",{attrs:{id:"workflow-example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#workflow-example"}},[t._v("#")]),t._v(" Workflow example")]),t._v(" "),s("p",[t._v("Some simplified example workflows using different programming styles are listed below. The following steps are executed:")]),t._v(" "),s("ol",[s("li",[t._v("Loading the client library.")]),t._v(" "),s("li",[t._v("Connecting to a back-end and authenticating with username and password via OpenID Connect.")]),t._v(" "),s("li",[t._v("Requesting the capabilities and showing the implemented openEO version of the back-end.")]),t._v(" "),s("li",[t._v('Showing information about the "Sentinel-2A" collection.')]),t._v(" "),s("li",[t._v("Showing information about all processes supported by the back-end.")]),t._v(" "),s("li",[t._v("Building a simple process graph.")]),t._v(" "),s("li",[t._v("Creating a job.")]),t._v(" "),s("li",[t._v("Pushing the job to the processing queue.")]),t._v(" "),s("li",[t._v("After a while, showing the job details, e.g. checking the job status.")]),t._v(" "),s("li",[t._v("Once processing is finished, downloading the job results to the local directory "),s("code",[t._v("/tmp/job_results/")]),t._v(".")])]),t._v(" "),s("p",[t._v("Please note that the examples below do not comply to the latest process specification. They are meant to show the differences in client development, but are no working examples!")]),t._v(" "),s("h3",{attrs:{id:"r-functional-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#r-functional-style"}},[t._v("#")]),t._v(" R (functional style)")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("library"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncon "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" capabilities"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" apiVersion"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" describeCollection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" listProcesses"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nprocessgraph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"load_collection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" \n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"filter_bbox"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" west "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("672000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5181000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("652000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5161000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" crs "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"EPSG:32632"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v("\n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"filter_temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-01T00:00:00Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-31T23:59:59Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v("\n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ndvi"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v("\n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"min_time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" createJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processgraph"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" startJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" describeJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" downloadResults"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"python-mixed-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#python-mixed-style"}},[t._v("#")]),t._v(" Python (mixed style)")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\ncon "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("capabilities"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api_version"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nprocesses "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" west"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("672000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5181000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("652000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5161000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" crs"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"EPSG:32632"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-01T00:00:00Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-31T23:59:59Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("min_time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("graph"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"java-object-oriented-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#java-object-oriented-style"}},[t._v("#")]),t._v(" Java (object oriented style)")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Capabilities")]),t._v(" cap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ProcessGraphBuilder")]),t._v(" pgb "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProcessGraphBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Chain processes...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ProcessGraph")]),t._v(" processGraph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pgb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcessGraph")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Job")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processGraph"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("downloadResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"php-procedural-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#php-procedural-style"}},[t._v("#")]),t._v(" PHP (procedural style)")]),t._v(" "),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("require_once")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/path/to/openeo.php"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"http://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilities")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_api_version")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilites")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_list_processes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"load_collection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"id"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"filter_bbox"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"west"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("672000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"south"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5181000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"east"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("652000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"north"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5161000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"crs"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"EPSG:32632"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"filter_temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"extent"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"2017-01-01T00:00:00Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"2017-01-31T23:59:59Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"ndvi"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"red"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"nir"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"min_time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_create_job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_start_job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_download_results")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{504:function(t,s,e){"use strict";e.r(s);var a=e(4),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"client-library-development-guidelines"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#client-library-development-guidelines"}},[t._v("#")]),t._v(" Client library development guidelines")]),t._v(" "),s("p",[t._v("This is a proposal for workflows that client libraries should support to make the experience with each library similar and users can easily adopt examples and workflows.")]),t._v(" "),s("p",[t._v("For best experience libraries should still embrace best practices common in their environments. This means clients can...")]),t._v(" "),s("ul",[s("li",[t._v("choose which kind of casing they use (see below).")]),t._v(" "),s("li",[t._v("feel free to implement aliases for methods.")])]),t._v(" "),s("h2",{attrs:{id:"conventions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#conventions"}},[t._v("#")]),t._v(" Conventions")]),t._v(" "),s("h3",{attrs:{id:"casing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#casing"}},[t._v("#")]),t._v(" Casing")]),t._v(" "),s("p",[t._v("Clients can use "),s("code",[t._v("snake_case")]),t._v(", "),s("code",[t._v("camelCase")]),t._v(" or any method used commonly in their environment. For example, the API request to get a list of collections can either be names "),s("code",[t._v("get_collections")]),t._v(" or "),s("code",[t._v("getCollections")]),t._v(". This applies for all names, including scopes, method names and parameters.")]),t._v(" "),s("h3",{attrs:{id:"scopes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scopes"}},[t._v("#")]),t._v(" Scopes")]),t._v(" "),s("p",[t._v('Each method belongs to a scope. To achieve this in object-oriented (OO) programming languages, methods would be part of a class. If programming languages don\'t support scopes, you may need to simulate it somehow to prevent name collisions, e.g. by adding a prefix to the method names (like in the "procedural style" example below). Best practices for this will likely evolve over time.')]),t._v(" "),s("p",[t._v("Example for the "),s("code",[t._v("clientVersion")]),t._v(" method in "),s("code",[t._v("openEO")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("Procedural style: "),s("code",[t._v("openeo_client_version()")])]),t._v(" "),s("li",[t._v("Object-oriented style:"),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nobj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clientVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("p",[t._v("If you can't store scope data in an object, you may need to pass these information as argument(s) to the method.")]),t._v(" "),s("p",[t._v("Example:")]),t._v(" "),s("ul",[s("li",[t._v("Procedural style:"),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),s("li",[t._v("Object-oriented style:"),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncon"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),s("h3",{attrs:{id:"scope-categories"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-categories"}},[t._v("#")]),t._v(" Scope categories")]),t._v(" "),s("p",[t._v("Each scope is assigned to a scope category, of which there are three:")]),t._v(" "),s("ul",[s("li",[s("em",[t._v("Root")]),t._v(" category: Contains only the scope "),s("code",[t._v("openEO")]),t._v(".")]),t._v(" "),s("li",[s("em",[t._v("API")]),t._v(" category: Mostly methods hiding API calls to the back-ends. Methods may be implemented asynchronously. Contains the scopes "),s("code",[t._v("Connection")]),t._v(", "),s("code",[t._v("File")]),t._v(", "),s("code",[t._v("Job")]),t._v(", "),s("code",[t._v("ProcessGraph")]),t._v(", "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("li",[s("em",[t._v("Content")]),t._v(": Mostly methods hiding the complexity of response content. Methods are usually implemented synchronously. Currently contains only the scope "),s("code",[t._v("Capabilities")]),t._v(". Method names should be prefixed if name collisions are likely.")])]),t._v(" "),s("p",[t._v("Method names across ALL the scopes that belong to the "),s("em",[t._v("root")]),t._v(" or "),s("em",[t._v("API")]),t._v(" categories MUST be unique. This is the case because the parameter in "),s("code",[t._v("hasFeature(method_name)")]),t._v(" must be unambiguous.")]),t._v(" "),s("p",[t._v("Method names of scopes in the "),s("em",[t._v("Content")]),t._v(" category may collide with method names of scopes in the "),s("em",[t._v("root")]),t._v("/"),s("em",[t._v("API")]),t._v(" categories and names should be prefixed if collisions of names between different scope categories are to be expected.")]),t._v(" "),s("h3",{attrs:{id:"parameters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("p",[t._v("The parameters usually follow the request schemes in the openAPI specification. The parameters should follow their characteristics, for example regarding the default values.")]),t._v(" "),s("p",[t._v("Some methods have a long list of (optional) parameters. This is easy to implement in languages that support named parameters such as R. For example, creating a job in R with a budget would lead to this method call:")]),t._v(" "),s("div",{staticClass:"language-R extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("createJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process_graph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token ellipsis"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" budget "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("Other languages that only support non-named parameters (i.e. the order of parameters is fixed) need to fill many parameters with default values, which is not convenient for a user. The example above in PHP would be:")]),t._v(" "),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("To avoid such method calls client developers should consider to pass either")]),t._v(" "),s("ul",[s("li",[t._v("an instance of a class, which contains all parameters as member variables or")]),t._v(" "),s("li",[t._v("the required parameters directly and the optional parameters as a dictionary (see example below).")])]),t._v(" "),s("p",[t._v("This basically emulates named parameters. The member variables / dictionary keys should use the same names as the parameters. The exemplary method call in PHP could be improved as follows:")]),t._v(" "),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("budget "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"method-mappings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#method-mappings"}},[t._v("#")]),t._v(" Method mappings")]),t._v(" "),s("p",[s("strong",[t._v("Note:")]),t._v(" Subscriptions and some scopes for response JSON objects are still missing. We are open for proposals.")]),t._v(" "),s("p",[t._v("Parameters with a leading "),s("code",[t._v("?")]),t._v(" are optional.")]),t._v(" "),s("h3",{attrs:{id:"scope-openeo-root-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-openeo-root-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("openEO")]),t._v(" (root category)")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Connect to a back-end, includes version discovery ("),s("code",[t._v("GET /well-known/openeo")]),t._v("), requesting capabilities and authentication where required. Returns "),s("code",[t._v("Connection")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("connect(url, ?authType, ?authOptions)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get client library version.")]),t._v(" "),s("td",[s("code",[t._v("clientVersion()")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-2"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("authType")]),t._v(" in "),s("code",[t._v("connect")]),t._v(": "),s("code",[t._v("null")]),t._v(", "),s("code",[t._v("basic")]),t._v(" or "),s("code",[t._v("oidc")]),t._v(" (non-exclusive). Defaults to "),s("code",[t._v("null")]),t._v(" (no authentication).")]),t._v(" "),s("li",[s("strong",[t._v("authOptions")]),t._v(" in "),s("code",[t._v("connect")]),t._v(": May hold additional data for authentication, for example a username and password for "),s("code",[t._v("basic")]),t._v(" authentication.")])]),t._v(" "),s("h3",{attrs:{id:"scope-connection-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-connection-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("Connection")]),t._v(" (API category)")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get the capabilities of the back-end. Returns "),s("code",[t._v("Capabilities")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /")])]),t._v(" "),s("td",[s("code",[t._v("capabilities()")])])]),t._v(" "),s("tr",[s("td",[t._v("List the supported output file formats.")]),t._v(" "),s("td",[s("code",[t._v("GET /output_formats")])]),t._v(" "),s("td",[s("code",[t._v("listFileTypes()")])])]),t._v(" "),s("tr",[s("td",[t._v("List the supported secondary service types.")]),t._v(" "),s("td",[s("code",[t._v("GET /service_types")])]),t._v(" "),s("td",[s("code",[t._v("listServiceTypes()")])])]),t._v(" "),s("tr",[s("td",[t._v("List the supported UDF runtimes.")]),t._v(" "),s("td",[s("code",[t._v("GET /udf_runtimes")])]),t._v(" "),s("td",[s("code",[t._v("listUdfRuntimes()")])])]),t._v(" "),s("tr",[s("td",[t._v("List all collections available on the back-end.")]),t._v(" "),s("td",[s("code",[t._v("GET /collections")])]),t._v(" "),s("td",[s("code",[t._v("listCollections()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get information about a single collection.")]),t._v(" "),s("td",[s("code",[t._v("GET /collections/{collection_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeCollection(collection_id)")])])]),t._v(" "),s("tr",[s("td",[t._v("List all processes available on the back-end.")]),t._v(" "),s("td",[s("code",[t._v("GET /processes")])]),t._v(" "),s("td",[s("code",[t._v("listProcesses()")])])]),t._v(" "),s("tr",[s("td",[t._v("Authenticate with OpenID Connect (if not specified in "),s("code",[t._v("connect")]),t._v(").")]),t._v(" "),s("td",[s("code",[t._v("GET /credentials/oidc")])]),t._v(" "),s("td",[s("code",[t._v("authenticateOIDC(?options)")])])]),t._v(" "),s("tr",[s("td",[t._v("Authenticate with HTTP Basic (if not specified in "),s("code",[t._v("connect")]),t._v(").")]),t._v(" "),s("td",[s("code",[t._v("GET /credentials/basic")])]),t._v(" "),s("td",[s("code",[t._v("authenticateBasic(username, password)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get information about the authenticated user.")]),t._v(" "),s("td",[s("code",[t._v("GET /me")])]),t._v(" "),s("td",[s("code",[t._v("describeAccount()")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all files from a user. Returns a list of "),s("code",[t._v("File")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /files/{user_id}")])]),t._v(" "),s("td",[s("code",[t._v("listFiles(?userId)")])])]),t._v(" "),s("tr",[s("td",[t._v("Opens a (existing or non-existing) file without reading any information. Returns a "),s("code",[t._v("File")]),t._v(".")]),t._v(" "),s("td",[s("em",[t._v("None")])]),t._v(" "),s("td",[s("code",[t._v("openFile(path, ?userId)")])])]),t._v(" "),s("tr",[s("td",[t._v("Validates a process graph.")]),t._v(" "),s("td",[s("code",[t._v("POST /validation")])]),t._v(" "),s("td",[s("code",[t._v("validateProcessGraph(processGraph)")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all process graphs of the authenticated user. Returns a list of "),s("code",[t._v("ProcessGraph")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /process_graphs")])]),t._v(" "),s("td",[s("code",[t._v("listProcessGraphs()")])])]),t._v(" "),s("tr",[s("td",[t._v("Creates a new stored process graph. Returns a "),s("code",[t._v("ProcessGraph")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("POST /process_graphs")])]),t._v(" "),s("td",[s("code",[t._v("createProcessGraph(processGraph, ?title, ?description)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get all information about a stored process graph. Returns a "),s("code",[t._v("ProcessGraph")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("getProcessGraphById(id)")])])]),t._v(" "),s("tr",[s("td",[t._v("Executes a process graph synchronously.")]),t._v(" "),s("td",[s("code",[t._v("POST /result")])]),t._v(" "),s("td",[s("code",[t._v("computeResult(processGraph, ?plan, ?budget)")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all jobs of the authenticated user. Returns a list of "),s("code",[t._v("Job")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs")])]),t._v(" "),s("td",[s("code",[t._v("listJobs()")])])]),t._v(" "),s("tr",[s("td",[t._v("Creates a new job. Returns a "),s("code",[t._v("Job")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("POST /jobs")])]),t._v(" "),s("td",[s("code",[t._v("createJob(processGraph, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get all information about a job. Returns a "),s("code",[t._v("Job")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("getJobById(id)")])])]),t._v(" "),s("tr",[s("td",[t._v("Lists all secondary services of the authenticated user. Returns a list of "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /services")])]),t._v(" "),s("td",[s("code",[t._v("listServices()")])])]),t._v(" "),s("tr",[s("td",[t._v("Creates a new secondary service. Returns a "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("POST /services")])]),t._v(" "),s("td",[s("code",[t._v("createService(processGraph, type, ?title, ?description, ?enabled, ?parameters, ?plan, ?budget)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get all information about a service. Returns a "),s("code",[t._v("Service")]),t._v(".")]),t._v(" "),s("td",[s("code",[t._v("GET /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("getServiceById(id)")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-3"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("userId")]),t._v(" in "),s("code",[t._v("listFiles")]),t._v(" and "),s("code",[t._v("createFile")]),t._v(": Defaults to the user id of the authenticated user.")]),t._v(" "),s("li",[s("strong",[t._v("options")]),t._v(" in "),s("code",[t._v("authenticateOIDC")]),t._v(": May hold additional data required for OpenID connect authentication.")])]),t._v(" "),s("h3",{attrs:{id:"scope-capabilities-content-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-capabilities-content-category"}},[t._v("#")]),t._v(" Scope "),s("code",[t._v("Capabilities")]),t._v(" (Content category)")]),t._v(" "),s("p",[t._v("Should be prefixed with "),s("code",[t._v("Capabilities")]),t._v(" if collisions of names between different scope categories are to be expected.")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("Field")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get the implemented openEO version.")]),t._v(" "),s("td",[s("code",[t._v("api_version")])]),t._v(" "),s("td",[s("code",[t._v("apiVersion()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the back-end version.")]),t._v(" "),s("td",[s("code",[t._v("backend_version")])]),t._v(" "),s("td",[s("code",[t._v("backendVersion()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the name of the back-end.")]),t._v(" "),s("td",[s("code",[t._v("title")])]),t._v(" "),s("td",[s("code",[t._v("title()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the description of the back-end.")]),t._v(" "),s("td",[s("code",[t._v("description")])]),t._v(" "),s("td",[s("code",[t._v("description()")])])]),t._v(" "),s("tr",[s("td",[t._v("List all supported features / endpoints.")]),t._v(" "),s("td",[s("code",[t._v("endpoints")])]),t._v(" "),s("td",[s("code",[t._v("listFeatures()")])])]),t._v(" "),s("tr",[s("td",[t._v("Check whether a feature / endpoint is supported.")]),t._v(" "),s("td",[s("code",[t._v("endpoints")]),t._v(" > ...")]),t._v(" "),s("td",[s("code",[t._v("hasFeature(methodName)")])])]),t._v(" "),s("tr",[s("td",[t._v("Get the default billing currency.")]),t._v(" "),s("td",[s("code",[t._v("billing")]),t._v(" > "),s("code",[t._v("currency")])]),t._v(" "),s("td",[s("code",[t._v("currency()")])])]),t._v(" "),s("tr",[s("td",[t._v("List all billing plans.")]),t._v(" "),s("td",[s("code",[t._v("billing")]),t._v(" > "),s("code",[t._v("plans")])]),t._v(" "),s("td",[s("code",[t._v("listPlans()")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-4"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("methodName")]),t._v(" in "),s("code",[t._v("hasFeature")]),t._v(": The name of a client method in any of the scopes that are part of the "),s("em",[t._v("API")]),t._v(" category. E.g. "),s("code",[t._v('hasFeature("describeAccount")')]),t._v(" checks whether the "),s("code",[t._v("GET /me")]),t._v(" endpoint is contained in the capabilities response's "),s("code",[t._v("endpoints")]),t._v(" object.")])]),t._v(" "),s("h3",{attrs:{id:"scope-file-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-file-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("File")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("File")]),t._v(" scope internally knows the "),s("code",[t._v("user_id")]),t._v(" and the "),s("code",[t._v("path")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Download a user file.")]),t._v(" "),s("td",[s("code",[t._v("GET /files/{user_id}/{path}")])]),t._v(" "),s("td",[s("code",[t._v("downloadFile(target)")])])]),t._v(" "),s("tr",[s("td",[t._v("Upload a user file.")]),t._v(" "),s("td",[s("code",[t._v("PUT /files/{user_id}/{path}")])]),t._v(" "),s("td",[s("code",[t._v("uploadFile(source)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a user file.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /files/{user_id}/{path}")])]),t._v(" "),s("td",[s("code",[t._v("deleteFile()")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-5"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("target")]),t._v(" in "),s("code",[t._v("downloadFile")]),t._v(": Path to a local file or folder.")])]),t._v(" "),s("h3",{attrs:{id:"scope-job-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-job-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("Job")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("Job")]),t._v(" scope internally knows the "),s("code",[t._v("job_id")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get (and update on client-side) all job information.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Modify a job at the back-end.")]),t._v(" "),s("td",[s("code",[t._v("PATCH /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("updateJob(?processGraph, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a job")]),t._v(" "),s("td",[s("code",[t._v("DELETE /jobs/{job_id}")])]),t._v(" "),s("td",[s("code",[t._v("deleteJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Calculate an time/cost estimate for a job.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/estimate")])]),t._v(" "),s("td",[s("code",[t._v("estimateJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get log file for job.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/logs")])]),t._v(" "),s("td",[s("code",[t._v("debugJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Start / queue a job for processing.")]),t._v(" "),s("td",[s("code",[t._v("POST /jobs/{job_id}/results")])]),t._v(" "),s("td",[s("code",[t._v("startJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Stop / cancel job processing.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /jobs/{job_id}/results")])]),t._v(" "),s("td",[s("code",[t._v("stopJob()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get document with download links.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/results")])]),t._v(" "),s("td",[s("code",[t._v("listResults()")])])]),t._v(" "),s("tr",[s("td",[t._v("Download job results.")]),t._v(" "),s("td",[s("code",[t._v("GET /jobs/{job_id}/results")]),t._v(" > ...")]),t._v(" "),s("td",[s("code",[t._v("downloadResults(target)")])])])])]),t._v(" "),s("h4",{attrs:{id:"parameters-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parameters-6"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("target")]),t._v(" in "),s("code",[t._v("downloadResults")]),t._v(": Path to a local folder.")])]),t._v(" "),s("h3",{attrs:{id:"scope-processgraph-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-processgraph-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("ProcessGraph")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("ProcessGraph")]),t._v(" scope internally knows the "),s("code",[t._v("process_graph_id")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get (and update on client-side) all information about a stored process graph.")]),t._v(" "),s("td",[s("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeProcessGraph()")])])]),t._v(" "),s("tr",[s("td",[t._v("Modify a stored process graph at the back-end.")]),t._v(" "),s("td",[s("code",[t._v("PATCH /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("updateProcessGraph(?processGraph, ?title, ?description)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a stored process graph.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /process_graphs/{process_graph_id}")])]),t._v(" "),s("td",[s("code",[t._v("deleteProcessGraph()")])])])])]),t._v(" "),s("h3",{attrs:{id:"scope-service-api-category"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#scope-service-api-category"}},[t._v("#")]),t._v(" Scope: "),s("code",[t._v("Service")]),t._v(" (API category)")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("Service")]),t._v(" scope internally knows the "),s("code",[t._v("service_id")]),t._v(".")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Description")]),t._v(" "),s("th",[t._v("API Request")]),t._v(" "),s("th",[t._v("Client method")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Get (and update on client-side) all information about a secondary web service.")]),t._v(" "),s("td",[s("code",[t._v("GET /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("describeService()")])])]),t._v(" "),s("tr",[s("td",[t._v("Modify a secondary web service at the back-end.")]),t._v(" "),s("td",[s("code",[t._v("PATCH /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("updateService(?processGraph, ?title, ?description, ?enabled, ?parameters, ?plan, ?budget)")])])]),t._v(" "),s("tr",[s("td",[t._v("Delete a secondary web service.")]),t._v(" "),s("td",[s("code",[t._v("DELETE /services/{service_id}")])]),t._v(" "),s("td",[s("code",[t._v("deleteService()")])])]),t._v(" "),s("tr",[s("td",[t._v("Get log file for web service.")]),t._v(" "),s("td",[s("code",[t._v("GET /services/{service_id}/logs")])]),t._v(" "),s("td",[s("code",[t._v("debugService()")])])])])]),t._v(" "),s("h2",{attrs:{id:"processes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),s("p",[t._v("The processes a back-end supports may be offered by the clients as methods in its own scope. The method names should follow the process names, but the conventions listed above can be applied here as well, e.g. converting "),s("code",[t._v("filter_bands")]),t._v(" to "),s("code",[t._v("filterBands")]),t._v(". As parameters have no natural or technical ordering in the JSON objects, clients must come up with a reasonable ordering of parameters if required. This could be inspired by existing clients. The way of building a process graph from processes heavily depends on the technical capabilities of the programming language. Therefore it may differ between the client libraries. Follow the best practices of the programming language, e.g. support method chaining if possible.")]),t._v(" "),s("h2",{attrs:{id:"workflow-example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#workflow-example"}},[t._v("#")]),t._v(" Workflow example")]),t._v(" "),s("p",[t._v("Some simplified example workflows using different programming styles are listed below. The following steps are executed:")]),t._v(" "),s("ol",[s("li",[t._v("Loading the client library.")]),t._v(" "),s("li",[t._v("Connecting to a back-end and authenticating with username and password via OpenID Connect.")]),t._v(" "),s("li",[t._v("Requesting the capabilities and showing the implemented openEO version of the back-end.")]),t._v(" "),s("li",[t._v('Showing information about the "Sentinel-2A" collection.')]),t._v(" "),s("li",[t._v("Showing information about all processes supported by the back-end.")]),t._v(" "),s("li",[t._v("Building a simple process graph.")]),t._v(" "),s("li",[t._v("Creating a job.")]),t._v(" "),s("li",[t._v("Pushing the job to the processing queue.")]),t._v(" "),s("li",[t._v("After a while, showing the job details, e.g. checking the job status.")]),t._v(" "),s("li",[t._v("Once processing is finished, downloading the job results to the local directory "),s("code",[t._v("/tmp/job_results/")]),t._v(".")])]),t._v(" "),s("p",[t._v("Please note that the examples below do not comply to the latest process specification. They are meant to show the differences in client development, but are no working examples!")]),t._v(" "),s("h3",{attrs:{id:"r-functional-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#r-functional-style"}},[t._v("#")]),t._v(" R (functional style)")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("library"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncon "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" capabilities"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" apiVersion"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" describeCollection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncon "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" listProcesses"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nprocessgraph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"load_collection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" id "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" \n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"filter_bbox"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" west "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("672000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5181000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("652000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5161000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" crs "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"EPSG:32632"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v("\n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"filter_temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-01T00:00:00Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-31T23:59:59Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v("\n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ndvi"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v("\n process"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"min_time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" createJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processgraph"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" startJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" describeJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%>%")]),t._v(" downloadResults"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"python-mixed-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#python-mixed-style"}},[t._v("#")]),t._v(" Python (mixed style)")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\ncon "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("capabilities"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api_version"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nprocesses "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("get_processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_bbox"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" west"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("672000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" south"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5181000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" east"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("652000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" north"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5161000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" crs"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"EPSG:32632"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("filter_temporal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" extent"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-01T00:00:00Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2017-01-31T23:59:59Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ndvi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" red"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\npg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" processes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("min_time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\njob "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("graph"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),t._v(" job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_results"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"java-object-oriented-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#java-object-oriented-style"}},[t._v("#")]),t._v(" Java (object oriented style)")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token import"}},[s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("openeo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Capabilities")]),t._v(" cap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ProcessGraphBuilder")]),t._v(" pgb "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getProcessGraphBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Chain processes...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ProcessGraph")]),t._v(" processGraph "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" pgb"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildProcessGraph")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Job")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("processGraph"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("downloadResults")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"php-procedural-style"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#php-procedural-style"}},[t._v("#")]),t._v(" PHP (procedural style)")]),t._v(" "),s("div",{staticClass:"language-php extra-class"},[s("pre",{pre:!0,attrs:{class:"language-php"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("require_once")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/path/to/openeo.php"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"http://openeo.org"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"username"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilities")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_api_version")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilites")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_collection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_list_processes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"load_collection"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"id"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"Sentinel-2A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"filter_bbox"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"west"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("672000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"south"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5181000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"east"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("652000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"north"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5161000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"crs"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"EPSG:32632"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"filter_temporal"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"extent"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"2017-01-01T00:00:00Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"2017-01-31T23:59:59Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"ndvi"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"red"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"B4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"nir"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"B8A"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_process")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"min_time"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_create_job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$pg")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_start_job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_download_results")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/tmp/job_results/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/66.bd458c47.js b/assets/js/66.77ddbb1e.js similarity index 95% rename from assets/js/66.bd458c47.js rename to assets/js/66.77ddbb1e.js index 5826cad65..a1cd47b11 100644 --- a/assets/js/66.bd458c47.js +++ b/assets/js/66.77ddbb1e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{504:function(e,t,s){"use strict";s.r(t);var r=s(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[e._v("#")]),e._v(" Examples")]),e._v(" "),t("p",[e._v("This section contains process graphs that show how the openEO processes work in practice.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/0.4/developers/examples/poc.html"}},[e._v("POC: Proof-of-concept use-cases, including API requests")])],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/ndvi-uc1",target:"_blank",rel:"noopener noreferrer"}},[e._v("NDVI-UC1: Deriving maximum NDVI measurements over pixel time series"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/zonal-uc3",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZONAL-UC3: Compute time series of zonal (regional) statistics over user-specified polygons"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/evi",target:"_blank",rel:"noopener noreferrer"}},[e._v("EVI: Deriving minimum EVI measurements over pixel time series"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Please feel encouraged to add your examples via Pull Requests!")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{503:function(e,t,s){"use strict";s.r(t);var r=s(4),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[e._v("#")]),e._v(" Examples")]),e._v(" "),t("p",[e._v("This section contains process graphs that show how the openEO processes work in practice.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/0.4/developers/examples/poc.html"}},[e._v("POC: Proof-of-concept use-cases, including API requests")])],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/ndvi-uc1",target:"_blank",rel:"noopener noreferrer"}},[e._v("NDVI-UC1: Deriving maximum NDVI measurements over pixel time series"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/zonal-uc3",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZONAL-UC3: Compute time series of zonal (regional) statistics over user-specified polygons"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/evi",target:"_blank",rel:"noopener noreferrer"}},[e._v("EVI: Deriving minimum EVI measurements over pixel time series"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Please feel encouraged to add your examples via Pull Requests!")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/67.160277e5.js b/assets/js/67.be1c4cca.js similarity index 99% rename from assets/js/67.160277e5.js rename to assets/js/67.be1c4cca.js index 081acb901..f59b0ec6e 100644 --- a/assets/js/67.160277e5.js +++ b/assets/js/67.be1c4cca.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{502:function(e,t,s){"use strict";s.r(t);var a=s(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"examples-proof-of-concept"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#examples-proof-of-concept"}},[e._v("#")]),e._v(" Examples (proof of concept)")]),e._v(" "),t("p",[e._v("This page gives a detailed description of the openEO proof of concept use cases. After the proof of concept, this stays in the API to have some basic examples. The proof of concept covered three clearly defined example use cases and how they are translated to sequences of API calls:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"#use-case-1"}},[e._v("Deriving minimum NDVI measurements over pixel time series of Sentinel 2 imagery")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#use-case-2"}},[e._v("Create a monthly aggregated Sentinel 1 product from a custom Python script")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#use-case-3"}},[e._v("Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons")])])]),e._v(" "),t("p",[t("strong",[e._v("Note")]),e._v(": "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("CORS")]),e._v(" and authentication is not included in these examples for simplicity.\nRepeating calls are also not included as it would not make much sense to list the same discovery requests (see Use Case 1, requests 1 to 6) for each use case individually.")],1),e._v(" "),t("h2",{attrs:{id:"use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-case-1"}},[e._v("#")]),e._v(" Use Case 1")]),e._v(" "),t("p",[e._v("Deriving minimum NDVI measurements over pixel time series of Sentinel 2 imagery.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/evi",target:"_blank",rel:"noopener noreferrer"}},[e._v("A similar example (computing an EVI) is also available."),t("OutboundLink")],1)]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Requesting the API versions available at the back-end")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[e._v("GET /.well-known/openeo\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Requesting the capabilities of the back-end")])]),e._v(" "),t("p",[t("em",[e._v("Note:")]),e._v(" The actual request path depends on the response of the previous request.")]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[e._v("GET /\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Check which collections are available at the back-end")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/collections")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Request details about a specific collection")]),e._v(" (e.g. Sentinel 2)")]),e._v(" "),t("p",[t("em",[e._v("Note:")]),e._v(" The actual collection ID in the path depends on the response of the previous request.")]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/collections/Sentinel-2")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Check that needed processes are available")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/processes")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Request the supported secondary web service types")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/service_types")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Create a WMS service")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/services")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Min. NDVI for Sentinel 2",\n "description": "Deriving minimum NDVI measurements over pixel time series of Sentinel 2 imagery.",\n "process_graph": {\n "loadco1": {\n "process_id": "load_collection",\n "arguments": {\n "id": "Sentinel-2",\n "spatial_extent": {\n "west": {"variable_id": "spatial_extent_west"},\n "east": {"variable_id": "spatial_extent_east"},\n "north": {"variable_id": "spatial_extent_north"},\n "south": {"variable_id": "spatial_extent_south"}\n },\n "temporal_extent": ["2017-01-01", "2017-02-01"]\n }\n },\n "ndvi1": {\n "process_id": "ndvi",\n "arguments": {\n "data": {"from_node": "loadco1"}\n }\n },\n "reduce1": {\n "process_id": "reduce",\n "arguments": {\n "data": {"from_node": "ndvi1"},\n "dimension": "temporal",\n "reducer": {\n "callback": {\n "min1": {\n "process_id": "min",\n "arguments": {\n "data": {"from_argument": "data"}\n },\n "result": true\n }\n }\n }\n },\n "result": true\n }\n },\n "type": "WMS",\n "parameters": {\n "version": "1.1.1"\n }\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("/services/wms-a3cca9")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("wms-a3cca9")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Requesting the service information")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/services/wms-a3cca9")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Download the data on demand from the WMS")])]),e._v(" "),t("p",[e._v("Omitted, not part of the openEO API.")])])]),e._v(" "),t("h2",{attrs:{id:"use-case-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-case-2"}},[e._v("#")]),e._v(" Use Case 2")]),e._v(" "),t("p",[e._v("Create a monthly aggregated Sentinel 1 product from a custom Python script.")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Upload python script")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("PUT")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/files/john_doe/s1_aggregate.py")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/octet-stream")])]),e._v("\n\n\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Create a batch job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Monthly aggregation on Sentinel 1",\n "description": "Create a monthly aggregated Sentinel 1 product from a custom Python script.",\n "process_graph": {\n "loadco1": {\n "process_id": "load_collection",\n "arguments": {\n "id": "Sentinel-1",\n "spatial_extent": {\n "west": 16.1,\n "east": 16.6,\n "north": 48.6,\n "south": 47.2\n },\n "temporal_extent": ["2017-01-01", "2017-02-01"]\n }\n },\n "reduce1": {\n "process_id": "reduce",\n "arguments": {\n "data": {"from_node": "loadco1"},\n "dimension": "temporal",\n "reducer": {\n "callback": {\n "runudf1": {\n "process_id": "run_udf",\n "arguments": {\n "data": [\n {"from_argument": "x"},\n {"from_argument": "y"}\n ],\n "udf": "s1_aggregate.py",\n "runtime": "Python"\n },\n "result": true\n }\n }\n },\n "binary": true\n },\n "result": true\n }\n }\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("https://openeo.org/api/v0.4/jobs/132")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("132")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Start batch processing the job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs/132/results")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Create a TMS service")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/services")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Monthly aggregation on Sentinel 1",\n "description": "Create a monthly aggregated Sentinel 1 product from a custom Python script.",\n "process_graph": {\n "1": {\n "process_id": "load_result",\n "arguments": {\n "id": "132"\n },\n "result": true\n }\n },\n "type": "TMS"\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("https://openeo.org/api/v0.4/services/tms-75ff8c")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("tms-75ff8c")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Requesting the service information")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("https://openeo.org/api/v0.4/services/tms-75ff8c")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Download the data on demand from the WMS")])]),e._v(" "),t("p",[e._v("Omitted, not part of the openEO API.")])])]),e._v(" "),t("h2",{attrs:{id:"use-case-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-case-3"}},[e._v("#")]),e._v(" Use Case 3")]),e._v(" "),t("p",[e._v("Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons.")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Create a batch job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Zonal Statistics / Sentinel 2",\n "description": "Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons.",\n "process_graph": {\n "loadco1": {\n "process_id": "load_collection",\n "arguments": {\n "id": "Sentinel-2",\n "spatial_extent": {\n "west": 16.1,\n "east": 16.6,\n "north": 48.6,\n "south": 47.2\n },\n "temporal_extent": ["2017-01-01", "2017-02-01"],\n "bands": ["B8"]\n }\n },\n "reduce1": {\n "process_id": "reduce",\n "arguments": {\n "data": {"from_node": "loadco1"},\n "dimension": "spectral"\n }\n },\n "aggreg1": {\n "process_id": "aggregate_polygon",\n "arguments": {\n "data": {"from_node": "reduce1"},\n "polygons": {\n "type": "Polygon",\n "coordinates": [\n [\n [16.138916,48.320647],\n [16.524124,48.320647],\n [16.524124,48.1386],\n [16.138916,48.1386],\n [16.138916,48.320647]\n ]\n ]\n },\n "reducer": {\n "callback": {\n "mean1": {\n "process_id": "mean",\n "arguments": {\n "data": {"from_argument": "data"}\n },\n "result": true\n }\n }\n }\n }\n },\n "savere1": {\n "process_id": "save_result",\n "arguments": {\n "data": {"from_node": "aggreg1"},\n "format": "JSON"\n },\n "result": true\n }\n }\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("https://openeo.org/jobs/133")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("133")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Start batch processing the job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs/133/results")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Retrieve download links")]),e._v(" (after the job has finished)")]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs/133/results")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("200")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("OK")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Expires")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("Wed, 01 May 2019 00:00:00 GMT")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Costs")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("0")])]),e._v('\n\n{\n "id":"133",\n "title":"Zonal Statistics / Sentinel 2",\n "description":"Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons.",\n "updated": "2019-02-01T09:36:18Z",\n "links": [\n {\n "href": "https://cdn.openeo.org/4854b51643548ab8a858e2b8282711d8/result.json",\n "type": "application/json"\n }\n ]\n}\n')])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Download file(s)")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("https://cdn.openeo.org/4854b51643548ab8a858e2b8282711d8/result.json")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("p",[e._v("A JSON file containing the results, content omitted.")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{505:function(e,t,s){"use strict";s.r(t);var a=s(4),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"examples-proof-of-concept"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#examples-proof-of-concept"}},[e._v("#")]),e._v(" Examples (proof of concept)")]),e._v(" "),t("p",[e._v("This page gives a detailed description of the openEO proof of concept use cases. After the proof of concept, this stays in the API to have some basic examples. The proof of concept covered three clearly defined example use cases and how they are translated to sequences of API calls:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"#use-case-1"}},[e._v("Deriving minimum NDVI measurements over pixel time series of Sentinel 2 imagery")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#use-case-2"}},[e._v("Create a monthly aggregated Sentinel 1 product from a custom Python script")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#use-case-3"}},[e._v("Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons")])])]),e._v(" "),t("p",[t("strong",[e._v("Note")]),e._v(": "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/"}},[e._v("CORS")]),e._v(" and authentication is not included in these examples for simplicity.\nRepeating calls are also not included as it would not make much sense to list the same discovery requests (see Use Case 1, requests 1 to 6) for each use case individually.")],1),e._v(" "),t("h2",{attrs:{id:"use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-case-1"}},[e._v("#")]),e._v(" Use Case 1")]),e._v(" "),t("p",[e._v("Deriving minimum NDVI measurements over pixel time series of Sentinel 2 imagery.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/tree/0.4.2/examples/evi",target:"_blank",rel:"noopener noreferrer"}},[e._v("A similar example (computing an EVI) is also available."),t("OutboundLink")],1)]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Requesting the API versions available at the back-end")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[e._v("GET /.well-known/openeo\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Requesting the capabilities of the back-end")])]),e._v(" "),t("p",[t("em",[e._v("Note:")]),e._v(" The actual request path depends on the response of the previous request.")]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[e._v("GET /\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Check which collections are available at the back-end")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/collections")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Request details about a specific collection")]),e._v(" (e.g. Sentinel 2)")]),e._v(" "),t("p",[t("em",[e._v("Note:")]),e._v(" The actual collection ID in the path depends on the response of the previous request.")]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/collections/Sentinel-2")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Check that needed processes are available")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/processes")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Request the supported secondary web service types")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/service_types")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Create a WMS service")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/services")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Min. NDVI for Sentinel 2",\n "description": "Deriving minimum NDVI measurements over pixel time series of Sentinel 2 imagery.",\n "process_graph": {\n "loadco1": {\n "process_id": "load_collection",\n "arguments": {\n "id": "Sentinel-2",\n "spatial_extent": {\n "west": {"variable_id": "spatial_extent_west"},\n "east": {"variable_id": "spatial_extent_east"},\n "north": {"variable_id": "spatial_extent_north"},\n "south": {"variable_id": "spatial_extent_south"}\n },\n "temporal_extent": ["2017-01-01", "2017-02-01"]\n }\n },\n "ndvi1": {\n "process_id": "ndvi",\n "arguments": {\n "data": {"from_node": "loadco1"}\n }\n },\n "reduce1": {\n "process_id": "reduce",\n "arguments": {\n "data": {"from_node": "ndvi1"},\n "dimension": "temporal",\n "reducer": {\n "callback": {\n "min1": {\n "process_id": "min",\n "arguments": {\n "data": {"from_argument": "data"}\n },\n "result": true\n }\n }\n }\n },\n "result": true\n }\n },\n "type": "WMS",\n "parameters": {\n "version": "1.1.1"\n }\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("/services/wms-a3cca9")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("wms-a3cca9")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Requesting the service information")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/services/wms-a3cca9")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Download the data on demand from the WMS")])]),e._v(" "),t("p",[e._v("Omitted, not part of the openEO API.")])])]),e._v(" "),t("h2",{attrs:{id:"use-case-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-case-2"}},[e._v("#")]),e._v(" Use Case 2")]),e._v(" "),t("p",[e._v("Create a monthly aggregated Sentinel 1 product from a custom Python script.")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Upload python script")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("PUT")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/files/john_doe/s1_aggregate.py")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/octet-stream")])]),e._v("\n\n\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Create a batch job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Monthly aggregation on Sentinel 1",\n "description": "Create a monthly aggregated Sentinel 1 product from a custom Python script.",\n "process_graph": {\n "loadco1": {\n "process_id": "load_collection",\n "arguments": {\n "id": "Sentinel-1",\n "spatial_extent": {\n "west": 16.1,\n "east": 16.6,\n "north": 48.6,\n "south": 47.2\n },\n "temporal_extent": ["2017-01-01", "2017-02-01"]\n }\n },\n "reduce1": {\n "process_id": "reduce",\n "arguments": {\n "data": {"from_node": "loadco1"},\n "dimension": "temporal",\n "reducer": {\n "callback": {\n "runudf1": {\n "process_id": "run_udf",\n "arguments": {\n "data": [\n {"from_argument": "x"},\n {"from_argument": "y"}\n ],\n "udf": "s1_aggregate.py",\n "runtime": "Python"\n },\n "result": true\n }\n }\n },\n "binary": true\n },\n "result": true\n }\n }\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("https://openeo.org/api/v0.4/jobs/132")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("132")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Start batch processing the job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs/132/results")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Create a TMS service")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/services")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Monthly aggregation on Sentinel 1",\n "description": "Create a monthly aggregated Sentinel 1 product from a custom Python script.",\n "process_graph": {\n "1": {\n "process_id": "load_result",\n "arguments": {\n "id": "132"\n },\n "result": true\n }\n },\n "type": "TMS"\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("https://openeo.org/api/v0.4/services/tms-75ff8c")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("tms-75ff8c")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Requesting the service information")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("https://openeo.org/api/v0.4/services/tms-75ff8c")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Download the data on demand from the WMS")])]),e._v(" "),t("p",[e._v("Omitted, not part of the openEO API.")])])]),e._v(" "),t("h2",{attrs:{id:"use-case-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-case-3"}},[e._v("#")]),e._v(" Use Case 3")]),e._v(" "),t("p",[e._v("Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons.")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Create a batch job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v('\n\n{\n "title": "Zonal Statistics / Sentinel 2",\n "description": "Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons.",\n "process_graph": {\n "loadco1": {\n "process_id": "load_collection",\n "arguments": {\n "id": "Sentinel-2",\n "spatial_extent": {\n "west": 16.1,\n "east": 16.6,\n "north": 48.6,\n "south": 47.2\n },\n "temporal_extent": ["2017-01-01", "2017-02-01"],\n "bands": ["B8"]\n }\n },\n "reduce1": {\n "process_id": "reduce",\n "arguments": {\n "data": {"from_node": "loadco1"},\n "dimension": "spectral"\n }\n },\n "aggreg1": {\n "process_id": "aggregate_polygon",\n "arguments": {\n "data": {"from_node": "reduce1"},\n "polygons": {\n "type": "Polygon",\n "coordinates": [\n [\n [16.138916,48.320647],\n [16.524124,48.320647],\n [16.524124,48.1386],\n [16.138916,48.1386],\n [16.138916,48.320647]\n ]\n ]\n },\n "reducer": {\n "callback": {\n "mean1": {\n "process_id": "mean",\n "arguments": {\n "data": {"from_argument": "data"}\n },\n "result": true\n }\n }\n }\n }\n },\n "savere1": {\n "process_id": "save_result",\n "arguments": {\n "data": {"from_node": "aggreg1"},\n "format": "JSON"\n },\n "result": true\n }\n }\n}\n')])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("201")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("Created")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Location")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("https://openeo.org/jobs/133")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Identifier")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("133")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Start batch processing the job")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("POST")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs/133/results")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Retrieve download links")]),e._v(" (after the job has finished)")]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("/jobs/133/results")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token response-status"}},[t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token status-code number"}},[e._v("200")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token reason-phrase string"}},[e._v("OK")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Content-Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("application/json; charset=utf-8")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("Expires")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("Wed, 01 May 2019 00:00:00 GMT")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token header"}},[t("span",{pre:!0,attrs:{class:"token header-name keyword"}},[e._v("OpenEO-Costs")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token header-value"}},[e._v("0")])]),e._v('\n\n{\n "id":"133",\n "title":"Zonal Statistics / Sentinel 2",\n "description":"Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-specified polygons.",\n "updated": "2019-02-01T09:36:18Z",\n "links": [\n {\n "href": "https://cdn.openeo.org/4854b51643548ab8a858e2b8282711d8/result.json",\n "type": "application/json"\n }\n ]\n}\n')])])])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Download file(s)")])]),e._v(" "),t("p",[t("em",[e._v("Request")])]),e._v(" "),t("div",{staticClass:"language-http extra-class"},[t("pre",{pre:!0,attrs:{class:"language-http"}},[t("code",[t("span",{pre:!0,attrs:{class:"token request-line"}},[t("span",{pre:!0,attrs:{class:"token method property"}},[e._v("GET")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token request-target url"}},[e._v("https://cdn.openeo.org/4854b51643548ab8a858e2b8282711d8/result.json")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token http-version property"}},[e._v("HTTP/1.1")])]),e._v("\n")])])]),t("p",[t("em",[e._v("Response")])]),e._v(" "),t("p",[e._v("A JSON file containing the results, content omitted.")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/68.c73d267d.js b/assets/js/68.422382f4.js similarity index 97% rename from assets/js/68.c73d267d.js rename to assets/js/68.422382f4.js index 6165d2018..511002075 100644 --- a/assets/js/68.c73d267d.js +++ b/assets/js/68.422382f4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{503:function(e,t,r){"use strict";r.r(t);var n=r(4),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-users"}},[e._v("#")]),e._v(" Getting started for users")]),e._v(" "),t("p",[e._v("Currently, there are three official client libraries, a web-based interface for openEO and a QGIS plugin.")]),e._v(" "),t("p",[e._v("If you are "),t("strong",[e._v("unfamiliar")]),e._v(" with programming, you could start using the "),t("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("web-based editor for openEO"),t("OutboundLink")],1),e._v(". It supports visual modelling of your algorithms and a simplified JavaScript based access to the openEO workflows and providers. openEO can also be used in QGIS through a "),t("a",{attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank",rel:"noopener noreferrer"}},[e._v("QGIS plugin"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If you are "),t("strong",[e._v("familiar")]),e._v(" with programming, you could choose a client library for three programming languages:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.npmjs.com/package/@openeo/js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript"),t("OutboundLink")],1),e._v(" (client-side and server-side)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://pypi.org/project/openeo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("R"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Follow the links above to find usage instructions for each of the client libraries.")]),e._v(" "),t("h2",{attrs:{id:"contribute"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contribute"}},[e._v("#")]),e._v(" Contribute")]),e._v(" "),t("p",[e._v("Didn't find your programming language? You can also access the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("openEO API")]),e._v(" implementations directly or start "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/clients/getting-started.html"}},[e._v("implementing your own client library")]),e._v(".")],1),e._v(" "),t("p",[e._v("If you are missing any functionality in the API feel free to "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue"),t("OutboundLink")],1),e._v(" or actively start proposing API changes as Pull Requests.")]),e._v(" "),t("p",[e._v("Feel free to contact us for further assistance.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{506:function(e,t,r){"use strict";r.r(t);var n=r(4),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-users"}},[e._v("#")]),e._v(" Getting started for users")]),e._v(" "),t("p",[e._v("Currently, there are three official client libraries, a web-based interface for openEO and a QGIS plugin.")]),e._v(" "),t("p",[e._v("If you are "),t("strong",[e._v("unfamiliar")]),e._v(" with programming, you could start using the "),t("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("web-based editor for openEO"),t("OutboundLink")],1),e._v(". It supports visual modelling of your algorithms and a simplified JavaScript based access to the openEO workflows and providers. openEO can also be used in QGIS through a "),t("a",{attrs:{href:"https://plugins.qgis.org/plugins/openeo-qgis-plugin-master/",target:"_blank",rel:"noopener noreferrer"}},[e._v("QGIS plugin"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If you are "),t("strong",[e._v("familiar")]),e._v(" with programming, you could choose a client library for three programming languages:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.npmjs.com/package/@openeo/js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript"),t("OutboundLink")],1),e._v(" (client-side and server-side)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://pypi.org/project/openeo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("R"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Follow the links above to find usage instructions for each of the client libraries.")]),e._v(" "),t("h2",{attrs:{id:"contribute"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contribute"}},[e._v("#")]),e._v(" Contribute")]),e._v(" "),t("p",[e._v("Didn't find your programming language? You can also access the "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/api/reference.html"}},[e._v("openEO API")]),e._v(" implementations directly or start "),t("RouterLink",{attrs:{to:"/documentation/0.4/developers/clients/getting-started.html"}},[e._v("implementing your own client library")]),e._v(".")],1),e._v(" "),t("p",[e._v("If you are missing any functionality in the API feel free to "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue"),t("OutboundLink")],1),e._v(" or actively start proposing API changes as Pull Requests.")]),e._v(" "),t("p",[e._v("Feel free to contact us for further assistance.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/69.cfa60bb9.js b/assets/js/69.16440ebe.js similarity index 79% rename from assets/js/69.cfa60bb9.js rename to assets/js/69.16440ebe.js index 72ffff3b4..22dca0513 100644 --- a/assets/js/69.cfa60bb9.js +++ b/assets/js/69.16440ebe.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{506:function(t,s,e){"use strict";e.r(s);var n=e(4),o=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ProcessesSpec")],1)}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{510:function(t,s,e){"use strict";e.r(s);var n=e(4),o=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ProcessesSpec")],1)}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/7.bc212d28.js b/assets/js/7.17f7886f.js similarity index 90% rename from assets/js/7.bc212d28.js rename to assets/js/7.17f7886f.js index 002e1f697..866bdeed5 100644 --- a/assets/js/7.bc212d28.js +++ b/assets/js/7.17f7886f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{475:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(4),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{477:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(4),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/63.dcbf1df5.js b/assets/js/70.9e4eb65b.js similarity index 95% rename from assets/js/63.dcbf1df5.js rename to assets/js/70.9e4eb65b.js index 37f94c7dc..497855f4a 100644 --- a/assets/js/63.dcbf1df5.js +++ b/assets/js/70.9e4eb65b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{499:function(e,t,r){"use strict";r.r(t);var n=r(4),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"user-defined-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[e._v("#")]),e._v(" User-defined functions")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, allowing custom calculations on server-side data.")]),e._v(" "),t("p",[e._v("UDFs are currently developed and evaluated outside of the core API. More information regarding the current "),t("strong",[e._v("draft")]),e._v(" for UDFs can be found in a "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("separate repository"),t("OutboundLink")],1),e._v(". There is additional documentation available for the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF Framework"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/api_docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF API"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{509:function(e,t,r){"use strict";r.r(t);var n=r(4),o=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"user-defined-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[e._v("#")]),e._v(" User-defined functions")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, allowing custom calculations on server-side data.")]),e._v(" "),t("p",[e._v("UDFs are currently developed and evaluated outside of the core API. More information regarding the current "),t("strong",[e._v("draft")]),e._v(" for UDFs can be found in a "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("separate repository"),t("OutboundLink")],1),e._v(". There is additional documentation available for the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF Framework"),t("OutboundLink")],1),e._v(" and the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/api_docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF API"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/72.93e32a20.js b/assets/js/72.03809523.js similarity index 99% rename from assets/js/72.93e32a20.js rename to assets/js/72.03809523.js index 8607bab19..1d6ebea80 100644 --- a/assets/js/72.93e32a20.js +++ b/assets/js/72.03809523.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{509:function(e,t,o){"use strict";o.r(t);var n=o(4),i=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("While a couple of openEO operations can be done anonymously, most of the interesting parts of the API require you to identify as a registered user. openEO specifies two ways to authenticate as a user:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://en.wikipedia.org/wiki/OpenID_Connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" (recommended, but not always straightforward to use)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Basic_access_authentication",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP Basic"),t("OutboundLink")],1),e._v(" (not recommended, but practically easier in some situations)")])]),e._v(" "),t("h2",{attrs:{id:"http-basic"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#http-basic"}},[e._v("#")]),e._v(" HTTP Basic")]),e._v(" "),t("p",[e._v("Let's start with the easiest authentication method, based on the HTTP Basic authentication scheme. It is however "),t("em",[e._v("not recommended")]),e._v(" for various reasons, such as its limited "),t("em",[e._v("security")]),e._v(" measures. For example, if you are connecting to a back-end with a "),t("code",[e._v("http://")]),e._v(" URL (unencrypted; discouraged in openEO) instead of a "),t("code",[e._v("https://")]),e._v(" one (encrypted), you should certainly not use HTTP Basic authentication.")]),e._v(" "),t("p",[e._v("With these security related caveats out of the way, you authenticate using your username and password. The clients usually have a "),t("code",[e._v("authenticate_basic")]),e._v(" method for this or graphical clients (e.g. QGIS and the Web Editor) will ask for your username and password directly.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Further Information")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/BasicProvider.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JS Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html#basic-http-auth",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/BasicAuth.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("R Client Documentation"),t("OutboundLink")],1)])])]),e._v(" "),t("h2",{attrs:{id:"openid-connect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect"}},[e._v("#")]),e._v(" OpenID Connect")]),e._v(" "),t("p",[e._v("OpenID Connect (OIDC) is an identity layer on top of the OAuth 2.0 protocol. It is a quite an extensive stack of interacting actors and protocols, and an in-depth discussion of its architecture would lead us too far here. However, in the context of working with openEO, these OpenID Connect concepts are useful to understand:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("There is "),t("strong",[e._v("decoupling")]),e._v(" between:")]),e._v(" "),t("ul",[t("li",[e._v("the "),t("em",[e._v("OpenID Connect identity provider")]),e._v(" (the platform that handles the authentication of the user)")]),e._v(" "),t("li",[e._v("the "),t("em",[e._v("openEO back-end")]),e._v(", which manages earth observation collections and executes your algorithms")])]),e._v(" "),t("p",[e._v("openEO back-ends can decide to host their own OpenID Connect infrastructure, but they may also allow to authenticate with an external OpenID Connect provider, which could be an organization like Google or Microsoft. This means that the back-end does not have to take care of all the security and privacy challenges of properly handling user registration, authentication, etc. Also, it allows the user to securely reuse an existing account registered with an established organization, instead of having to register yet another account with some web service.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("An openEO back-end might support "),t("strong",[e._v("multiple OpenID Connect providers")]),e._v(". If there is only one, the openEO client libraries will usually pick it automatically, but otherwise you may need to decide explicitly which provider to authenticate against.")])])]),e._v(" "),t("li",[t("p",[e._v("Your openEO script or application acts as a so called "),t("strong",[e._v("OpenID Connect client")]),e._v(", with an associated "),t("strong",[e._v("client ID")]),e._v(". This practically means that, apart from a user account, you need a client ID as well (and often a client secret too) when authenticating.")]),e._v(" "),t("p",[e._v("The details of how to obtain the client ID and secret largely depend on the back-end and OpenID Connect provider: you might have to register a client yourself, or you might have to use an existing client ID. Consult the openEO back-end (documentation) about how to obtain client ID (and secret).")])]),e._v(" "),t("li",[t("p",[e._v('There are several possible "'),t("strong",[e._v("flows")]),e._v('" (also called "grants") to complete the whole OpenID Connect authentication dance:')]),e._v(" "),t("ul",[t("li",[e._v("Authorization Code Flow")]),e._v(" "),t("li",[e._v("Device Flow")]),e._v(" "),t("li",[e._v("Client Credentials Flow")]),e._v(" "),t("li",[e._v("Resource Owner Password flow")]),e._v(" "),t("li",[e._v("Refresh Token Flow")])]),e._v(" "),t("p",[e._v("Picking the right flow highly depends on your use case and context: are you working interactively, are you working in a browser based environment, should your application be able to work without user interaction in the background, what does the OpenID Connect provider support, ...?")])])]),e._v(" "),t("p",[e._v("OpenID Connect is clearly more complex than HTTP Basic Authentication. In the sections below we will discuss the practical details of each flow.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Further Information")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/OidcProvider.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JS Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html#openid-connect-based-authentication",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/OIDCAuth.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("R Client Documentation"),t("OutboundLink")],1)])])]),e._v(" "),t("h3",{attrs:{id:"authorization-code-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authorization-code-flow"}},[e._v("#")]),e._v(" Authorization Code Flow")]),e._v(" "),t("p",[e._v("This is the most popular and widely supported OpenID Connect flow in the general web development world. However, it requires an environment that can be hard to get right when using in other environments like a mobile app or a CLI (command line interface). Some prerequisites must be met:")]),e._v(" "),t("ul",[t("li",[e._v("You are working interactively (e.g. in a Jupyter notebook, in a Python or R shell or running a script manually)")]),e._v(" "),t("li",[e._v("You have access to a web browser (preferably on the same machine as your application), to authenticate with the OpenID Connect provider")]),e._v(" "),t("li",[e._v("The web browser has (network) access")]),e._v(" "),t("li",[e._v("A URL must be whitelisted in the OpenID client's \"redirect URL\" configuration at the OpenID Connect provider's side.")])]),e._v(" "),t("p",[e._v("For authentication, the client forwards a user to the log-in page of the OpenID Connect provider. There the user can log in with an existing account (or create a new one) and then generally has to explicitly grant access to basic profile information (e.g. email address) that the back-end will use to identify the user.")]),e._v(" "),t("h3",{attrs:{id:"device-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#device-flow"}},[e._v("#")]),e._v(" Device Flow")]),e._v(" "),t("p",[e._v("The device flow (also called device authorization grant) is a relatively new OpenID Connect flow and it is not as widely supported across different OpenID Connect Providers as the other flows. It provides a nice alternative that is roughly comparable to the authorization code flow but without the previously mentioned issues related to short-living webservers, network access and browser redirects.")]),e._v(" "),t("p",[e._v("The device flow is only suited for interactive use cases and requires a web browser for the authentication with the OpenID Connect provider. However, it can be any web browser, even one on your mobile phone. There is no networking magic required to be able to access any short-living background webserver like with the authorization code flow.")]),e._v(" "),t("p",[e._v('The "magic" is that the client will show a message like this:')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("To authenticate: visit https://provider.example.com/device\nand enter the user code 'DTNY-KLNX'.\n")])])]),t("p",[e._v("You should now visit this URL. Usually it is intentionally a short URL to make it feasible to type it instead of copy-pasting it (e.g. on another device). Authenticate with the OpenID Connect provider and enter the user code shown in the message. Meanwhile, the client library is usually actively polling the OpenID Connect provider and when you successfully complete the authentication and entering of the user code, it will receive the necessary tokens for authenticated communication with the back-end.")]),e._v(" "),t("h3",{attrs:{id:"client-credentials-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-credentials-flow"}},[e._v("#")]),e._v(" Client Credentials Flow")]),e._v(" "),t("p",[e._v("The Client Credentials flow directly uses the client ID and secret to authenticate. It does not involve interactive authentication through a web browser, which makes it useful for "),t("strong",[e._v("non-interactive use cases")]),e._v(".")]),e._v(" "),t("p",[e._v("The downside is of the Client Credentials flow is that it can be challenging or even impossible with a given OpenID Connect provider, to set up a client that supports this. Also, your openEO back-end might not allow it, because technically you are authenticating a "),t("em",[e._v("client")]),e._v(", and not a "),t("em",[e._v("user")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"resource-owner-password-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#resource-owner-password-flow"}},[e._v("#")]),e._v(" Resource Owner Password flow")]),e._v(" "),t("p",[e._v("With the Resource Owner Password flow you directly pass the user (and client) credentials. Like the Client Credentials flow, it is useful for "),t("strong",[e._v("non-interactive uses cases")]),e._v(".")]),e._v(" "),t("p",[e._v("However, usage of the Resource Owner Password flow is "),t("strong",[e._v("generally discouraged")]),e._v(" because of its poor security features (e.g. OAuth/OIDC was designed to avoid passing and storing user passwords unnecessarily). It is also not widely supported across OpenID Connect providers, probably due to its weak security measures.")]),e._v(" "),t("h3",{attrs:{id:"refresh-token-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#refresh-token-flow"}},[e._v("#")]),e._v(" Refresh Token Flow")]),e._v(" "),t("p",[e._v("When OpenID Connect authentication completes successfully, the client receives an access token to be used when doing authenticated calls to the back-end. The access token usually has a short lifetime to reduce the security risk when it would be stolen or intercepted. The client also receives a "),t("em",[e._v("refresh token")]),e._v(" that can be used, through the Refresh Token flow, to easily request a new access token, without having to re-authenticate, which makes it useful for "),t("strong",[e._v("non-interactive uses cases")]),e._v(".")]),e._v(" "),t("p",[e._v("However, as it needs an existing refresh token, the Refresh Token Flow requires "),t("strong",[e._v("first to authenticate with one of the other flows")]),e._v(" (but in practice it might not be required very often because refresh tokens usually have a relatively long lifetime).")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{511:function(e,t,o){"use strict";o.r(t);var n=o(4),i=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("While a couple of openEO operations can be done anonymously, most of the interesting parts of the API require you to identify as a registered user. openEO specifies two ways to authenticate as a user:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://en.wikipedia.org/wiki/OpenID_Connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" (recommended, but not always straightforward to use)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Basic_access_authentication",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP Basic"),t("OutboundLink")],1),e._v(" (not recommended, but practically easier in some situations)")])]),e._v(" "),t("h2",{attrs:{id:"http-basic"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#http-basic"}},[e._v("#")]),e._v(" HTTP Basic")]),e._v(" "),t("p",[e._v("Let's start with the easiest authentication method, based on the HTTP Basic authentication scheme. It is however "),t("em",[e._v("not recommended")]),e._v(" for various reasons, such as its limited "),t("em",[e._v("security")]),e._v(" measures. For example, if you are connecting to a back-end with a "),t("code",[e._v("http://")]),e._v(" URL (unencrypted; discouraged in openEO) instead of a "),t("code",[e._v("https://")]),e._v(" one (encrypted), you should certainly not use HTTP Basic authentication.")]),e._v(" "),t("p",[e._v("With these security related caveats out of the way, you authenticate using your username and password. The clients usually have a "),t("code",[e._v("authenticate_basic")]),e._v(" method for this or graphical clients (e.g. QGIS and the Web Editor) will ask for your username and password directly.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Further Information")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/BasicProvider.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JS Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html#basic-http-auth",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/BasicAuth.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("R Client Documentation"),t("OutboundLink")],1)])])]),e._v(" "),t("h2",{attrs:{id:"openid-connect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openid-connect"}},[e._v("#")]),e._v(" OpenID Connect")]),e._v(" "),t("p",[e._v("OpenID Connect (OIDC) is an identity layer on top of the OAuth 2.0 protocol. It is a quite an extensive stack of interacting actors and protocols, and an in-depth discussion of its architecture would lead us too far here. However, in the context of working with openEO, these OpenID Connect concepts are useful to understand:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("There is "),t("strong",[e._v("decoupling")]),e._v(" between:")]),e._v(" "),t("ul",[t("li",[e._v("the "),t("em",[e._v("OpenID Connect identity provider")]),e._v(" (the platform that handles the authentication of the user)")]),e._v(" "),t("li",[e._v("the "),t("em",[e._v("openEO back-end")]),e._v(", which manages earth observation collections and executes your algorithms")])]),e._v(" "),t("p",[e._v("openEO back-ends can decide to host their own OpenID Connect infrastructure, but they may also allow to authenticate with an external OpenID Connect provider, which could be an organization like Google or Microsoft. This means that the back-end does not have to take care of all the security and privacy challenges of properly handling user registration, authentication, etc. Also, it allows the user to securely reuse an existing account registered with an established organization, instead of having to register yet another account with some web service.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("An openEO back-end might support "),t("strong",[e._v("multiple OpenID Connect providers")]),e._v(". If there is only one, the openEO client libraries will usually pick it automatically, but otherwise you may need to decide explicitly which provider to authenticate against.")])])]),e._v(" "),t("li",[t("p",[e._v("Your openEO script or application acts as a so called "),t("strong",[e._v("OpenID Connect client")]),e._v(", with an associated "),t("strong",[e._v("client ID")]),e._v(". This practically means that, apart from a user account, you need a client ID as well (and often a client secret too) when authenticating.")]),e._v(" "),t("p",[e._v("The details of how to obtain the client ID and secret largely depend on the back-end and OpenID Connect provider: you might have to register a client yourself, or you might have to use an existing client ID. Consult the openEO back-end (documentation) about how to obtain client ID (and secret).")])]),e._v(" "),t("li",[t("p",[e._v('There are several possible "'),t("strong",[e._v("flows")]),e._v('" (also called "grants") to complete the whole OpenID Connect authentication dance:')]),e._v(" "),t("ul",[t("li",[e._v("Authorization Code Flow")]),e._v(" "),t("li",[e._v("Device Flow")]),e._v(" "),t("li",[e._v("Client Credentials Flow")]),e._v(" "),t("li",[e._v("Resource Owner Password flow")]),e._v(" "),t("li",[e._v("Refresh Token Flow")])]),e._v(" "),t("p",[e._v("Picking the right flow highly depends on your use case and context: are you working interactively, are you working in a browser based environment, should your application be able to work without user interaction in the background, what does the OpenID Connect provider support, ...?")])])]),e._v(" "),t("p",[e._v("OpenID Connect is clearly more complex than HTTP Basic Authentication. In the sections below we will discuss the practical details of each flow.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Further Information")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/OidcProvider.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JS Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/auth.html#openid-connect-based-authentication",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Client Documentation"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-r-client/reference/OIDCAuth.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("R Client Documentation"),t("OutboundLink")],1)])])]),e._v(" "),t("h3",{attrs:{id:"authorization-code-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authorization-code-flow"}},[e._v("#")]),e._v(" Authorization Code Flow")]),e._v(" "),t("p",[e._v("This is the most popular and widely supported OpenID Connect flow in the general web development world. However, it requires an environment that can be hard to get right when using in other environments like a mobile app or a CLI (command line interface). Some prerequisites must be met:")]),e._v(" "),t("ul",[t("li",[e._v("You are working interactively (e.g. in a Jupyter notebook, in a Python or R shell or running a script manually)")]),e._v(" "),t("li",[e._v("You have access to a web browser (preferably on the same machine as your application), to authenticate with the OpenID Connect provider")]),e._v(" "),t("li",[e._v("The web browser has (network) access")]),e._v(" "),t("li",[e._v("A URL must be whitelisted in the OpenID client's \"redirect URL\" configuration at the OpenID Connect provider's side.")])]),e._v(" "),t("p",[e._v("For authentication, the client forwards a user to the log-in page of the OpenID Connect provider. There the user can log in with an existing account (or create a new one) and then generally has to explicitly grant access to basic profile information (e.g. email address) that the back-end will use to identify the user.")]),e._v(" "),t("h3",{attrs:{id:"device-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#device-flow"}},[e._v("#")]),e._v(" Device Flow")]),e._v(" "),t("p",[e._v("The device flow (also called device authorization grant) is a relatively new OpenID Connect flow and it is not as widely supported across different OpenID Connect Providers as the other flows. It provides a nice alternative that is roughly comparable to the authorization code flow but without the previously mentioned issues related to short-living webservers, network access and browser redirects.")]),e._v(" "),t("p",[e._v("The device flow is only suited for interactive use cases and requires a web browser for the authentication with the OpenID Connect provider. However, it can be any web browser, even one on your mobile phone. There is no networking magic required to be able to access any short-living background webserver like with the authorization code flow.")]),e._v(" "),t("p",[e._v('The "magic" is that the client will show a message like this:')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("To authenticate: visit https://provider.example.com/device\nand enter the user code 'DTNY-KLNX'.\n")])])]),t("p",[e._v("You should now visit this URL. Usually it is intentionally a short URL to make it feasible to type it instead of copy-pasting it (e.g. on another device). Authenticate with the OpenID Connect provider and enter the user code shown in the message. Meanwhile, the client library is usually actively polling the OpenID Connect provider and when you successfully complete the authentication and entering of the user code, it will receive the necessary tokens for authenticated communication with the back-end.")]),e._v(" "),t("h3",{attrs:{id:"client-credentials-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-credentials-flow"}},[e._v("#")]),e._v(" Client Credentials Flow")]),e._v(" "),t("p",[e._v("The Client Credentials flow directly uses the client ID and secret to authenticate. It does not involve interactive authentication through a web browser, which makes it useful for "),t("strong",[e._v("non-interactive use cases")]),e._v(".")]),e._v(" "),t("p",[e._v("The downside is of the Client Credentials flow is that it can be challenging or even impossible with a given OpenID Connect provider, to set up a client that supports this. Also, your openEO back-end might not allow it, because technically you are authenticating a "),t("em",[e._v("client")]),e._v(", and not a "),t("em",[e._v("user")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"resource-owner-password-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#resource-owner-password-flow"}},[e._v("#")]),e._v(" Resource Owner Password flow")]),e._v(" "),t("p",[e._v("With the Resource Owner Password flow you directly pass the user (and client) credentials. Like the Client Credentials flow, it is useful for "),t("strong",[e._v("non-interactive uses cases")]),e._v(".")]),e._v(" "),t("p",[e._v("However, usage of the Resource Owner Password flow is "),t("strong",[e._v("generally discouraged")]),e._v(" because of its poor security features (e.g. OAuth/OIDC was designed to avoid passing and storing user passwords unnecessarily). It is also not widely supported across OpenID Connect providers, probably due to its weak security measures.")]),e._v(" "),t("h3",{attrs:{id:"refresh-token-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#refresh-token-flow"}},[e._v("#")]),e._v(" Refresh Token Flow")]),e._v(" "),t("p",[e._v("When OpenID Connect authentication completes successfully, the client receives an access token to be used when doing authenticated calls to the back-end. The access token usually has a short lifetime to reduce the security risk when it would be stolen or intercepted. The client also receives a "),t("em",[e._v("refresh token")]),e._v(" that can be used, through the Refresh Token flow, to easily request a new access token, without having to re-authenticate, which makes it useful for "),t("strong",[e._v("non-interactive uses cases")]),e._v(".")]),e._v(" "),t("p",[e._v("However, as it needs an existing refresh token, the Refresh Token Flow requires "),t("strong",[e._v("first to authenticate with one of the other flows")]),e._v(" (but in practice it might not be required very often because refresh tokens usually have a relatively long lifetime).")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/73.ec9af781.js b/assets/js/73.c5f1150c.js similarity index 90% rename from assets/js/73.ec9af781.js rename to assets/js/73.c5f1150c.js index 7347f7a65..10d5078c0 100644 --- a/assets/js/73.ec9af781.js +++ b/assets/js/73.c5f1150c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{512:function(t,e,n){"use strict";n.r(e);var a=n(4),o=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"datacube-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#datacube-documentation"}},[t._v("#")]),t._v(" Datacube Documentation")]),t._v(" "),e("p",[t._v("This documentation on datacubes is part of the openEO documentation.")]),t._v(" "),e("p",[t._v("The folder "),e("code",[t._v(".scripts")]),t._v(" contains script*s that output the figures contained in this directory.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{513:function(t,e,n){"use strict";n.r(e);var a=n(4),o=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"datacube-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#datacube-documentation"}},[t._v("#")]),t._v(" Datacube Documentation")]),t._v(" "),e("p",[t._v("This documentation on datacubes is part of the openEO documentation.")]),t._v(" "),e("p",[t._v("The folder "),e("code",[t._v(".scripts")]),t._v(" contains script*s that output the figures contained in this directory.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/74.7a85eb49.js b/assets/js/74.b946be4e.js similarity index 97% rename from assets/js/74.7a85eb49.js rename to assets/js/74.b946be4e.js index 773b61387..07617498a 100644 --- a/assets/js/74.7a85eb49.js +++ b/assets/js/74.b946be4e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{514:function(e,t,n){"use strict";n.r(t);var o=n(4),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("The openEO API defines a "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("HTTP API")]),e._v(" that lets cloud back-ends with large Earth observation datasets communicate with front end analysis applications in an interoperable way.")],1),e._v(" "),t("p",[e._v("As an overview, the openEO API specifies how to")]),e._v(" "),t("ul",[t("li",[e._v("discover which Earth observation data and processes are available at cloud back-ends,")]),e._v(" "),t("li",[e._v("execute (chained) processes on back-ends,")]),e._v(" "),t("li",[e._v("run "),t("RouterLink",{attrs:{to:"/documentation/1.0/udfs.html"}},[e._v("user-defined functions")]),e._v(" (UDFs) on back-ends where UDFs can be exposed to the data in different ways,")],1),e._v(" "),t("li",[e._v("download (intermediate) results, and")]),e._v(" "),t("li",[e._v("manage user content including billing.")])]),e._v(" "),t("p",[e._v("The API is defined as an "),t("a",{attrs:{href:"https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v(" YAML file.")]),e._v(" "),t("p",[e._v("The API and processes are grouped into "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/"}},[e._v("compliance profiles")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"additional-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[e._v("#")]),e._v(" Additional information")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/code-of-conduct.html"}},[e._v("Code of Conduct")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("Software Development Guidelines")])],1)])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{519:function(e,t,n){"use strict";n.r(t);var o=n(4),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("The openEO API defines a "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("HTTP API")]),e._v(" that lets cloud back-ends with large Earth observation datasets communicate with front end analysis applications in an interoperable way.")],1),e._v(" "),t("p",[e._v("As an overview, the openEO API specifies how to")]),e._v(" "),t("ul",[t("li",[e._v("discover which Earth observation data and processes are available at cloud back-ends,")]),e._v(" "),t("li",[e._v("execute (chained) processes on back-ends,")]),e._v(" "),t("li",[e._v("run "),t("RouterLink",{attrs:{to:"/documentation/1.0/udfs.html"}},[e._v("user-defined functions")]),e._v(" (UDFs) on back-ends where UDFs can be exposed to the data in different ways,")],1),e._v(" "),t("li",[e._v("download (intermediate) results, and")]),e._v(" "),t("li",[e._v("manage user content including billing.")])]),e._v(" "),t("p",[e._v("The API is defined as an "),t("a",{attrs:{href:"https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v(" YAML file.")]),e._v(" "),t("p",[e._v("The API and processes are grouped into "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/"}},[e._v("compliance profiles")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"additional-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[e._v("#")]),e._v(" Additional information")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/code-of-conduct.html"}},[e._v("Code of Conduct")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("Software Development Guidelines")])],1)])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/75.b42f4081.js b/assets/js/75.cf1dcd2b.js similarity index 77% rename from assets/js/75.b42f4081.js rename to assets/js/75.cf1dcd2b.js index 0fad00e9a..f3e6cdf42 100644 --- a/assets/js/75.b42f4081.js +++ b/assets/js/75.cf1dcd2b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{516:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{514:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/76.7ec340c6.js b/assets/js/76.1bb4f4bb.js similarity index 95% rename from assets/js/76.7ec340c6.js rename to assets/js/76.1bb4f4bb.js index 5bbad1039..a0c2a9fd7 100644 --- a/assets/js/76.7ec340c6.js +++ b/assets/js/76.1bb4f4bb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{513:function(e,r,o){"use strict";o.r(r);var t=o(4),n=Object(t.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"openeo-error-codes"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#openeo-error-codes"}},[e._v("#")]),e._v(" openEO error codes")]),e._v(" "),r("p",[e._v("The general error handling in the openEO API is documented in the "),r("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/API-Principles/Error-Handling"}},[e._v("API documentation")]),e._v(".")],1),e._v(" "),r("p",[e._v("The following table of error codes is "),r("strong",[e._v("incomplete")]),e._v(". These error codes will evolve over time. If you are missing any common error, please contribute it by adding an "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/new",target:"_blank",rel:"noopener noreferrer"}},[e._v("issue"),r("OutboundLink")],1),e._v(", creating a "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/pulls",target:"_blank",rel:"noopener noreferrer"}},[e._v("pull request"),r("OutboundLink")],1),e._v(" or get in "),r("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact")]),e._v(".")],1),e._v(" "),r("ErrorCodes")],1)}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{516:function(e,r,o){"use strict";o.r(r);var t=o(4),n=Object(t.a)({},(function(){var e=this,r=e._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"openeo-error-codes"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#openeo-error-codes"}},[e._v("#")]),e._v(" openEO error codes")]),e._v(" "),r("p",[e._v("The general error handling in the openEO API is documented in the "),r("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/API-Principles/Error-Handling"}},[e._v("API documentation")]),e._v(".")],1),e._v(" "),r("p",[e._v("The following table of error codes is "),r("strong",[e._v("incomplete")]),e._v(". These error codes will evolve over time. If you are missing any common error, please contribute it by adding an "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/new",target:"_blank",rel:"noopener noreferrer"}},[e._v("issue"),r("OutboundLink")],1),e._v(", creating a "),r("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/pulls",target:"_blank",rel:"noopener noreferrer"}},[e._v("pull request"),r("OutboundLink")],1),e._v(" or get in "),r("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact")]),e._v(".")],1),e._v(" "),r("ErrorCodes")],1)}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/61.70e537af.js b/assets/js/77.e758c278.js similarity index 78% rename from assets/js/61.70e537af.js rename to assets/js/77.e758c278.js index c3c19dd95..4da5b5609 100644 --- a/assets/js/61.70e537af.js +++ b/assets/js/77.e758c278.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{495:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ApiSpec")],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{517:function(t,n,s){"use strict";s.r(n);var e=s(4),o=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ApiSpec")],1)}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/78.36acaa31.js b/assets/js/78.3394d6c2.js similarity index 98% rename from assets/js/78.36acaa31.js rename to assets/js/78.3394d6c2.js index 2f99b5275..d6a5bfb15 100644 --- a/assets/js/78.36acaa31.js +++ b/assets/js/78.3394d6c2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{518:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-service-back-end-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-service-back-end-providers"}},[e._v("#")]),e._v(" Getting started for service (back-end) providers")]),e._v(" "),t("p",[e._v("As a back-end provider who wants to provide its datasets, processes and infrastructure to a broader audience through a standardized interface you may want to implement a driver for openEO.")]),e._v(" "),t("p",[e._v("First of all, you should go through the list of "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO repositories"),t("OutboundLink")],1),e._v(' and check whether there is already a back-end driver that suits your needs. In this case you don\'t need to develop your own driver, but "only" need to ingest your data, adopt your required processes and set up the infrastructure. Please follow the documentation for the individual driver you want to use.')]),e._v(" "),t("p",[e._v("If your preferred technology has no back-end driver yet, you may consider writing your own driver. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("p",[e._v("You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html"}},[e._v("glossary")]),e._v(", the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/arch.html"}},[e._v("architecture")]),e._v(" of openEO and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes/Process-Graphs"}},[e._v("process graphs")]),e._v(". This helps you read and understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(". Technical API related documents like "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Cross-Origin-Resource-Sharing-(CORS)"}},[e._v("CORS")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/API-Principles/Error-Handling"}},[e._v("error handing")]),e._v(" should be read, too.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a server stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(".\nIf you are using Python to implement your driver you may reuse some common modules of the existing driver implementations:")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Driver Commons"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("You can implement a back-end in iterations. It is recommended to start by implementing the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Capabilities"}},[e._v("Capabilities")]),e._v(" microservice. "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/EO-Data-Discovery"}},[e._v("EO Data Discovery")]),e._v(", "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Process-Discovery"}},[e._v("Process Discovery")]),e._v(" are important for the client libraries to be available, too. Afterwards you should implement "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Batch-Jobs"}},[e._v("Batch Job Management")]),e._v(" or "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#/paths/~1result/post"}},[e._v("synchronous data processing")]),e._v(". All other microservices can be added later and are not strictly required to run openEO services. Keep in mind that you don't need to implement all endpoints in the first iteration and that you can specify in the Capabilities, which endpoints you are supporting.")],1),e._v(" "),t("p",[e._v("For example, you could start by implementing the following endpoints in the first iteration:")]),e._v(" "),t("ul",[t("li",[e._v("Well-Known Document: "),t("code",[e._v("GET /.well-known/openeo")])]),e._v(" "),t("li",[e._v("Capabilities: "),t("code",[e._v("GET /")]),e._v(" and "),t("code",[e._v("GET /file_formats")])]),e._v(" "),t("li",[e._v("Data discovery: "),t("code",[e._v("GET /collections")]),e._v(" and "),t("code",[e._v("GET /collections/{collection_id}")])]),e._v(" "),t("li",[e._v("Process discovery: "),t("code",[e._v("GET /processes")])]),e._v(" "),t("li",[e._v("Data processing: "),t("code",[e._v("POST /result")])]),e._v(" "),t("li",[e._v("Authentication (if required): "),t("code",[e._v("GET /credentials/basic")])])]),e._v(" "),t("p",[e._v("A more detailed recommendation about the endpoints and processes to implement can be found in the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/"}},[e._v("API and Processes profiles")]),e._v(".")],1),e._v(" "),t("p",[e._v("Afterwards you can already start experimenting with your first process graphs and process EO data with our client libraries on your back-end.")]),e._v(" "),t("p",[t("em",[e._v("More information will follow soon, for example about back-end compliance testing.")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{521:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-service-back-end-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-service-back-end-providers"}},[e._v("#")]),e._v(" Getting started for service (back-end) providers")]),e._v(" "),t("p",[e._v("As a back-end provider who wants to provide its datasets, processes and infrastructure to a broader audience through a standardized interface you may want to implement a driver for openEO.")]),e._v(" "),t("p",[e._v("First of all, you should go through the list of "),t("a",{attrs:{href:"https://github.com/Open-EO",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO repositories"),t("OutboundLink")],1),e._v(' and check whether there is already a back-end driver that suits your needs. In this case you don\'t need to develop your own driver, but "only" need to ingest your data, adopt your required processes and set up the infrastructure. Please follow the documentation for the individual driver you want to use.')]),e._v(" "),t("p",[e._v("If your preferred technology has no back-end driver yet, you may consider writing your own driver. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("p",[e._v("You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html"}},[e._v("glossary")]),e._v(", the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/arch.html"}},[e._v("architecture")]),e._v(" of openEO and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes/Process-Graphs"}},[e._v("process graphs")]),e._v(". This helps you read and understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(". Technical API related documents like "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Cross-Origin-Resource-Sharing-(CORS)"}},[e._v("CORS")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/API-Principles/Error-Handling"}},[e._v("error handing")]),e._v(" should be read, too.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a server stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(".\nIf you are using Python to implement your driver you may reuse some common modules of the existing driver implementations:")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python Driver Commons"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("You can implement a back-end in iterations. It is recommended to start by implementing the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Capabilities"}},[e._v("Capabilities")]),e._v(" microservice. "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/EO-Data-Discovery"}},[e._v("EO Data Discovery")]),e._v(", "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Process-Discovery"}},[e._v("Process Discovery")]),e._v(" are important for the client libraries to be available, too. Afterwards you should implement "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Batch-Jobs"}},[e._v("Batch Job Management")]),e._v(" or "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#/paths/~1result/post"}},[e._v("synchronous data processing")]),e._v(". All other microservices can be added later and are not strictly required to run openEO services. Keep in mind that you don't need to implement all endpoints in the first iteration and that you can specify in the Capabilities, which endpoints you are supporting.")],1),e._v(" "),t("p",[e._v("For example, you could start by implementing the following endpoints in the first iteration:")]),e._v(" "),t("ul",[t("li",[e._v("Well-Known Document: "),t("code",[e._v("GET /.well-known/openeo")])]),e._v(" "),t("li",[e._v("Capabilities: "),t("code",[e._v("GET /")]),e._v(" and "),t("code",[e._v("GET /file_formats")])]),e._v(" "),t("li",[e._v("Data discovery: "),t("code",[e._v("GET /collections")]),e._v(" and "),t("code",[e._v("GET /collections/{collection_id}")])]),e._v(" "),t("li",[e._v("Process discovery: "),t("code",[e._v("GET /processes")])]),e._v(" "),t("li",[e._v("Data processing: "),t("code",[e._v("POST /result")])]),e._v(" "),t("li",[e._v("Authentication (if required): "),t("code",[e._v("GET /credentials/basic")])])]),e._v(" "),t("p",[e._v("A more detailed recommendation about the endpoints and processes to implement can be found in the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/"}},[e._v("API and Processes profiles")]),e._v(".")],1),e._v(" "),t("p",[e._v("Afterwards you can already start experimenting with your first process graphs and process EO data with our client libraries on your back-end.")]),e._v(" "),t("p",[t("em",[e._v("More information will follow soon, for example about back-end compliance testing.")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/80.f324b4ca.js b/assets/js/80.34938e44.js similarity index 99% rename from assets/js/80.f324b4ca.js rename to assets/js/80.34938e44.js index 7c117cdee..a2029eb0f 100644 --- a/assets/js/80.f324b4ca.js +++ b/assets/js/80.34938e44.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{519:function(e,o,t){"use strict";t.r(o);var a=t(4),r=Object(a.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"getting-started-with-openeo-and-xarray-and-dask"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-with-openeo-and-xarray-and-dask"}},[e._v("#")]),e._v(" Getting started with openEO and Xarray and Dask")]),e._v(" "),o("p",[e._v("As a back-end provider who wants to provide its datasets, processes and infrastructure to a broader audience through a\nstandardized interface you may want to implement a driver for openEO.")]),e._v(" "),o("p",[e._v("First of all, you should read carefully the "),o("RouterLink",{attrs:{to:"/documentation/1.0/developers/backends/getting-started.html"}},[e._v("getting started guide for service providers")]),e._v(".")],1),e._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),o("p",[e._v("The Xarray-Dask implementation for openEO is not a full-fledged out-of-the-box openEO back-end,\nbut can be part of the infrastructure for the data management and processing part.\nIn detail it can be used as data source for "),o("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/EO-Data-Discovery"}},[e._v("EO Data Discovery")]),e._v(" and e.g.\nin combination with a Dask cluster as processing back-end for "),o("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Data-Processing"}},[e._v("Data Processing")]),e._v(".\nIn any case, a "),o("a",{attrs:{href:"#http-rest-interface"}},[e._v("HTTP REST interface must be available in front of process implementations to properly answer openEO requests")]),e._v(".")],1)]),e._v(" "),o("p",[e._v("There are two main components involved with openEO and Xarray:")]),e._v(" "),o("ol",[o("li",[o("a",{attrs:{href:"#process-graph-parser-for-python"}},[e._v("Process Graph Parser for Python")])]),e._v(" "),o("li",[o("a",{attrs:{href:"#python-processes-for-openeo"}},[e._v("Python Processes for openEO")])])]),e._v(" "),o("h2",{attrs:{id:"process-graph-parser-for-python"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#process-graph-parser-for-python"}},[e._v("#")]),e._v(" Process Graph Parser for Python")]),e._v(" "),o("ul",[o("li",[e._v("Repository: "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-pg-parser-networkx"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("This pg-parser parses OpenEO process graphs from raw JSON into fully traversible networkx graph objects.")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("ProcessRegistry")]),e._v(" can be imported from the pg-parser and includes "),o("code",[e._v("Process")]),e._v(" objects, that include a")]),e._v(" "),o("ul",[o("li",[e._v("spec: Process definition (e.g. https://github.com/Open-EO/openeo-processes)")]),e._v(" "),o("li",[e._v("implementation: Callable process implementation (https://github.com/Open-EO/openeo-processes-dask/tree/main/openeo_processes_dask/process_implementations)")]),e._v(" "),o("li",[e._v("namespace")])]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("ProcessRegistry")]),e._v(" automatically maps from the name of a process to the "),o("code",[e._v("spec")]),e._v(" and to the "),o("code",[e._v("implementation")]),e._v(".\nEvery "),o("code",[e._v("Process")]),e._v(" in the "),o("code",[e._v("ProcessRegistry")]),e._v(" requires a "),o("code",[e._v("spec")]),e._v(", while "),o("code",[e._v("implementation")]),e._v(" and "),o("code",[e._v("namespace")]),e._v(" are optional.")]),e._v(" "),o("p",[e._v("An example on how to use the pg-parser can be found "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx/blob/main/examples/01_minibackend_demo.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("h2",{attrs:{id:"python-processes-for-openeo"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#python-processes-for-openeo"}},[e._v("#")]),e._v(" Python Processes for openEO")]),e._v(" "),o("ul",[o("li",[e._v("Repository: "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("This package includes the implementations of openEO processes, using Xarray and Dask. Currently, the "),o("code",[e._v("load_collection")]),e._v(" and "),o("code",[e._v("save_result")]),e._v(" process are not included as these implementations can differ widely for different backends.")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("specs")]),e._v(" can be found in the "),o("code",[e._v("openeo-processes-dask")]),e._v(" as a submodule. That way, the specification and the implementation are stored close to each other.")]),e._v(" "),o("h2",{attrs:{id:"the-load-collection-and-save-result-process"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#the-load-collection-and-save-result-process"}},[e._v("#")]),e._v(" The load_collection and save_result process")]),e._v(" "),o("p",[e._v("As mentioned before, the "),o("code",[e._v("load_collection")]),e._v(" and "),o("code",[e._v("save_result")]),e._v(" processes are back-end-specific and therefore not included in "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(". The "),o("a",{attrs:{href:"https://processes.openeo.org/#load_collection",target:"_blank",rel:"noopener noreferrer"}},[e._v("load_collection"),o("OutboundLink")],1),e._v(" process should return a "),o("code",[e._v("raster-cube")]),e._v(" object - to be compliant with the "),o("code",[e._v("openeo-processes-dask")]),e._v(" implementations, this should be realized by a "),o("code",[e._v("xarray.DataArray")]),e._v(" loaded with "),o("code",[e._v("dask")]),e._v(".")]),e._v(" "),o("h3",{attrs:{id:"connection-to-odc-and-stac"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#connection-to-odc-and-stac"}},[e._v("#")]),e._v(" Connection to ODC and STAC")]),e._v(" "),o("p",[e._v("For testing purposes with "),o("code",[e._v("DataArrays")]),e._v(" - which can be loaded from one file - the "),o("code",[e._v("xarray.open_dataarray()")]),e._v(" function can be used to implement a basic version of "),o("code",[e._v("load_collection")]),e._v(".")]),e._v(" "),o("p",[e._v("Large data sets can be organised as "),o("code",[e._v("opendatacube Products")]),e._v(" or as "),o("code",[e._v("STAC Collections")]),e._v(".")]),e._v(" "),o("ul",[o("li",[o("p",[o("code",[e._v("opendatacube Products")]),e._v(": The implementation of "),o("code",[e._v("load_collection")]),e._v(" can include the "),o("code",[e._v("opendatacube")]),e._v(" function "),o("code",[e._v("datacube.Datacube.load()")]),e._v(". It is recommended to use the "),o("code",[e._v("dask_chunks")]),e._v(" parameter, when loading the data. The function returns a "),o("code",[e._v("xarray DataSet")]),e._v(", in order to be compliant with "),o("code",[e._v("openeo-processes-dask")]),e._v(", it can be converted to a "),o("code",[e._v("DataArray")]),e._v(" using the "),o("code",[e._v("Dataset.to_array(dim='bands')")]),e._v(" function. A sample "),o("code",[e._v("load_collection")]),e._v(" process using OpenDatacube "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo_odc_driver/blob/c197387c10f8fef7d5573270a35961a278a18e1d/openeo_odc_driver/processing.py#L38",target:"_blank",rel:"noopener noreferrer"}},[e._v("can be found here"),o("OutboundLink")],1),e._v(".")])]),e._v(" "),o("li",[o("p",[o("code",[e._v("STAC Collections")]),e._v(": Alternatively, the "),o("code",[e._v("load_collection")]),e._v(" process can be implemented using the "),o("code",[e._v("odc.stac.load()")]),e._v(" function. To make use of "),o("code",[e._v("dask")]),e._v(", the "),o("code",[e._v("chunks")]),e._v(" parameter must be set. Just as in the previous case, the resulting "),o("code",[e._v("xarray DataSet")]),e._v(" can be converted to a "),o("code",[e._v("DataArray")]),e._v(" with "),o("code",[e._v("Dataset.to_array(dim='bands')")]),e._v(". A similar implementation is the one of the "),o("code",[e._v("load_stac")]),e._v(" process "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask/blob/9267e4ccffbbbf755cb7b8a43ba80d9483398314/openeo_processes_dask/process_implementations/cubes/load.py#L83",target:"_blank",rel:"noopener noreferrer"}},[e._v("available here"),o("OutboundLink")],1),e._v(".")])])]),e._v(" "),o("h2",{attrs:{id:"openeo-client-side-processing"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#openeo-client-side-processing"}},[e._v("#")]),e._v(" openEO Client Side Processing")]),e._v(" "),o("p",[e._v("The client-side processing functionality allows to test and use openEO with its processes locally, i.e. without any connection to an openEO back-end.\nIt relies on the projects "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-pg-parser-networkx"),o("OutboundLink")],1),e._v(", which provides an openEO process graph parsing tool, and "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(", which provides an Xarray and Dask implementation of most openEO processes.")]),e._v(" "),o("p",[e._v("You can find more information and usage examples in the openEO Python client documentation "),o("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/cookbook/localprocessing.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("available here"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("h2",{attrs:{id:"adding-a-new-process"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-new-process"}},[e._v("#")]),e._v(" Adding a new process")]),e._v(" "),o("p",[e._v("To add a new process, there are changes required in the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("ol",[o("li",[e._v("Add the process spec")]),e._v(" "),o("li",[e._v("Add the process implementation")])]),e._v(" "),o("p",[e._v("The HTTP rest interface should have a "),o("code",[e._v("processes")]),e._v(" endpoint that reflects the process specs from "),o("code",[e._v("openeo-processes-dask")]),e._v(".")]),e._v(" "),o("h3",{attrs:{id:"add-the-process-spec"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#add-the-process-spec"}},[e._v("#")]),e._v(" Add the process spec")]),e._v(" "),o("p",[e._v("Currently, "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(" includes the process definitions as a "),o("code",[e._v("submodule")]),e._v(" in the "),o("code",[e._v("openeo-processes-dask/specs")]),e._v(". The submodule can be found under https://github.com/eodcgmbh/openeo-processes, which is a fork from https://github.com/Open-EO/openeo-processes to reflect which processes (with their implementations) are actually available in "),o("code",[e._v("openeo-processes-dask")]),e._v(".")]),e._v(" "),o("h3",{attrs:{id:"add-the-process-implementation"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#add-the-process-implementation"}},[e._v("#")]),e._v(" Add the process implementation")]),e._v(" "),o("ol",[o("li",[e._v("Select a process from "),o("a",{attrs:{href:"https://processes.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("processes.openeo.org"),o("OutboundLink")],1),e._v(" which does not yet have an\nimplementation in "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("li",[e._v("Clone "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(", checkout a new branch, and start implementing the missing process. Make sure you properly handle all parameters defined for this process. Add a test for your process in "),o("code",[e._v("openeo-processes-dask/tests")]),e._v(" ideally using dask. The "),o("code",[e._v("create_fake_rastercube")]),e._v(" from the "),o("code",[e._v("openeo-processes-dask/tests/mockdata")]),e._v(" can be used for testing, with the "),o("code",[e._v("backend")]),e._v(" parameter set to "),o("code",[e._v("numpy")]),e._v(" or "),o("code",[e._v("dask")]),e._v(".")]),e._v(" "),o("li",[e._v("Push your code and open a PR.")])]),e._v(" "),o("h2",{attrs:{id:"http-rest-interface"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#http-rest-interface"}},[e._v("#")]),e._v(" HTTP REST Interface")]),e._v(" "),o("p",[e._v("The next step would be to set up a HTTP REST interface (i.e. an implementation of the openEO HTTP API) for the new openEO environment.\nIt must be available in front of the process implementations to properly answer openEO client requests.\nCurrently, the "),o("a",{attrs:{href:"https://openeo.eodc.eu/v1.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("EODC"),o("OutboundLink")],1),e._v(" and "),o("a",{attrs:{href:"https://openeo.eurac.edu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Eurac Research"),o("OutboundLink")],1),e._v(" back-ends use Xarray and Dask and thus\nare the first implementations of back-ends to look at.")]),e._v(" "),o("ul",[o("li",[e._v("EODC is using a Python implementation, the "),o("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-fastapi",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-fastapi"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("li",[e._v("Eurac Research relies on a Java based implementation, the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-spring-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-spring-driver"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("If you have any questions, please "),o("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact us")]),e._v(".")],1)])}),[],!1,null,null,null);o.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{522:function(e,o,t){"use strict";t.r(o);var a=t(4),r=Object(a.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"getting-started-with-openeo-and-xarray-and-dask"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-with-openeo-and-xarray-and-dask"}},[e._v("#")]),e._v(" Getting started with openEO and Xarray and Dask")]),e._v(" "),o("p",[e._v("As a back-end provider who wants to provide its datasets, processes and infrastructure to a broader audience through a\nstandardized interface you may want to implement a driver for openEO.")]),e._v(" "),o("p",[e._v("First of all, you should read carefully the "),o("RouterLink",{attrs:{to:"/documentation/1.0/developers/backends/getting-started.html"}},[e._v("getting started guide for service providers")]),e._v(".")],1),e._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),o("p",[e._v("The Xarray-Dask implementation for openEO is not a full-fledged out-of-the-box openEO back-end,\nbut can be part of the infrastructure for the data management and processing part.\nIn detail it can be used as data source for "),o("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/EO-Data-Discovery"}},[e._v("EO Data Discovery")]),e._v(" and e.g.\nin combination with a Dask cluster as processing back-end for "),o("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#tag/Data-Processing"}},[e._v("Data Processing")]),e._v(".\nIn any case, a "),o("a",{attrs:{href:"#http-rest-interface"}},[e._v("HTTP REST interface must be available in front of process implementations to properly answer openEO requests")]),e._v(".")],1)]),e._v(" "),o("p",[e._v("There are two main components involved with openEO and Xarray:")]),e._v(" "),o("ol",[o("li",[o("a",{attrs:{href:"#process-graph-parser-for-python"}},[e._v("Process Graph Parser for Python")])]),e._v(" "),o("li",[o("a",{attrs:{href:"#python-processes-for-openeo"}},[e._v("Python Processes for openEO")])])]),e._v(" "),o("h2",{attrs:{id:"process-graph-parser-for-python"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#process-graph-parser-for-python"}},[e._v("#")]),e._v(" Process Graph Parser for Python")]),e._v(" "),o("ul",[o("li",[e._v("Repository: "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-pg-parser-networkx"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("This pg-parser parses OpenEO process graphs from raw JSON into fully traversible networkx graph objects.")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("ProcessRegistry")]),e._v(" can be imported from the pg-parser and includes "),o("code",[e._v("Process")]),e._v(" objects, that include a")]),e._v(" "),o("ul",[o("li",[e._v("spec: Process definition (e.g. https://github.com/Open-EO/openeo-processes)")]),e._v(" "),o("li",[e._v("implementation: Callable process implementation (https://github.com/Open-EO/openeo-processes-dask/tree/main/openeo_processes_dask/process_implementations)")]),e._v(" "),o("li",[e._v("namespace")])]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("ProcessRegistry")]),e._v(" automatically maps from the name of a process to the "),o("code",[e._v("spec")]),e._v(" and to the "),o("code",[e._v("implementation")]),e._v(".\nEvery "),o("code",[e._v("Process")]),e._v(" in the "),o("code",[e._v("ProcessRegistry")]),e._v(" requires a "),o("code",[e._v("spec")]),e._v(", while "),o("code",[e._v("implementation")]),e._v(" and "),o("code",[e._v("namespace")]),e._v(" are optional.")]),e._v(" "),o("p",[e._v("An example on how to use the pg-parser can be found "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx/blob/main/examples/01_minibackend_demo.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("h2",{attrs:{id:"python-processes-for-openeo"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#python-processes-for-openeo"}},[e._v("#")]),e._v(" Python Processes for openEO")]),e._v(" "),o("ul",[o("li",[e._v("Repository: "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("This package includes the implementations of openEO processes, using Xarray and Dask. Currently, the "),o("code",[e._v("load_collection")]),e._v(" and "),o("code",[e._v("save_result")]),e._v(" process are not included as these implementations can differ widely for different backends.")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("specs")]),e._v(" can be found in the "),o("code",[e._v("openeo-processes-dask")]),e._v(" as a submodule. That way, the specification and the implementation are stored close to each other.")]),e._v(" "),o("h2",{attrs:{id:"the-load-collection-and-save-result-process"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#the-load-collection-and-save-result-process"}},[e._v("#")]),e._v(" The load_collection and save_result process")]),e._v(" "),o("p",[e._v("As mentioned before, the "),o("code",[e._v("load_collection")]),e._v(" and "),o("code",[e._v("save_result")]),e._v(" processes are back-end-specific and therefore not included in "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(". The "),o("a",{attrs:{href:"https://processes.openeo.org/#load_collection",target:"_blank",rel:"noopener noreferrer"}},[e._v("load_collection"),o("OutboundLink")],1),e._v(" process should return a "),o("code",[e._v("raster-cube")]),e._v(" object - to be compliant with the "),o("code",[e._v("openeo-processes-dask")]),e._v(" implementations, this should be realized by a "),o("code",[e._v("xarray.DataArray")]),e._v(" loaded with "),o("code",[e._v("dask")]),e._v(".")]),e._v(" "),o("h3",{attrs:{id:"connection-to-odc-and-stac"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#connection-to-odc-and-stac"}},[e._v("#")]),e._v(" Connection to ODC and STAC")]),e._v(" "),o("p",[e._v("For testing purposes with "),o("code",[e._v("DataArrays")]),e._v(" - which can be loaded from one file - the "),o("code",[e._v("xarray.open_dataarray()")]),e._v(" function can be used to implement a basic version of "),o("code",[e._v("load_collection")]),e._v(".")]),e._v(" "),o("p",[e._v("Large data sets can be organised as "),o("code",[e._v("opendatacube Products")]),e._v(" or as "),o("code",[e._v("STAC Collections")]),e._v(".")]),e._v(" "),o("ul",[o("li",[o("p",[o("code",[e._v("opendatacube Products")]),e._v(": The implementation of "),o("code",[e._v("load_collection")]),e._v(" can include the "),o("code",[e._v("opendatacube")]),e._v(" function "),o("code",[e._v("datacube.Datacube.load()")]),e._v(". It is recommended to use the "),o("code",[e._v("dask_chunks")]),e._v(" parameter, when loading the data. The function returns a "),o("code",[e._v("xarray DataSet")]),e._v(", in order to be compliant with "),o("code",[e._v("openeo-processes-dask")]),e._v(", it can be converted to a "),o("code",[e._v("DataArray")]),e._v(" using the "),o("code",[e._v("Dataset.to_array(dim='bands')")]),e._v(" function. A sample "),o("code",[e._v("load_collection")]),e._v(" process using OpenDatacube "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo_odc_driver/blob/c197387c10f8fef7d5573270a35961a278a18e1d/openeo_odc_driver/processing.py#L38",target:"_blank",rel:"noopener noreferrer"}},[e._v("can be found here"),o("OutboundLink")],1),e._v(".")])]),e._v(" "),o("li",[o("p",[o("code",[e._v("STAC Collections")]),e._v(": Alternatively, the "),o("code",[e._v("load_collection")]),e._v(" process can be implemented using the "),o("code",[e._v("odc.stac.load()")]),e._v(" function. To make use of "),o("code",[e._v("dask")]),e._v(", the "),o("code",[e._v("chunks")]),e._v(" parameter must be set. Just as in the previous case, the resulting "),o("code",[e._v("xarray DataSet")]),e._v(" can be converted to a "),o("code",[e._v("DataArray")]),e._v(" with "),o("code",[e._v("Dataset.to_array(dim='bands')")]),e._v(". A similar implementation is the one of the "),o("code",[e._v("load_stac")]),e._v(" process "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask/blob/9267e4ccffbbbf755cb7b8a43ba80d9483398314/openeo_processes_dask/process_implementations/cubes/load.py#L83",target:"_blank",rel:"noopener noreferrer"}},[e._v("available here"),o("OutboundLink")],1),e._v(".")])])]),e._v(" "),o("h2",{attrs:{id:"openeo-client-side-processing"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#openeo-client-side-processing"}},[e._v("#")]),e._v(" openEO Client Side Processing")]),e._v(" "),o("p",[e._v("The client-side processing functionality allows to test and use openEO with its processes locally, i.e. without any connection to an openEO back-end.\nIt relies on the projects "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-pg-parser-networkx"),o("OutboundLink")],1),e._v(", which provides an openEO process graph parsing tool, and "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(", which provides an Xarray and Dask implementation of most openEO processes.")]),e._v(" "),o("p",[e._v("You can find more information and usage examples in the openEO Python client documentation "),o("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/cookbook/localprocessing.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("available here"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("h2",{attrs:{id:"adding-a-new-process"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-new-process"}},[e._v("#")]),e._v(" Adding a new process")]),e._v(" "),o("p",[e._v("To add a new process, there are changes required in the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("ol",[o("li",[e._v("Add the process spec")]),e._v(" "),o("li",[e._v("Add the process implementation")])]),e._v(" "),o("p",[e._v("The HTTP rest interface should have a "),o("code",[e._v("processes")]),e._v(" endpoint that reflects the process specs from "),o("code",[e._v("openeo-processes-dask")]),e._v(".")]),e._v(" "),o("h3",{attrs:{id:"add-the-process-spec"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#add-the-process-spec"}},[e._v("#")]),e._v(" Add the process spec")]),e._v(" "),o("p",[e._v("Currently, "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(" includes the process definitions as a "),o("code",[e._v("submodule")]),e._v(" in the "),o("code",[e._v("openeo-processes-dask/specs")]),e._v(". The submodule can be found under https://github.com/eodcgmbh/openeo-processes, which is a fork from https://github.com/Open-EO/openeo-processes to reflect which processes (with their implementations) are actually available in "),o("code",[e._v("openeo-processes-dask")]),e._v(".")]),e._v(" "),o("h3",{attrs:{id:"add-the-process-implementation"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#add-the-process-implementation"}},[e._v("#")]),e._v(" Add the process implementation")]),e._v(" "),o("ol",[o("li",[e._v("Select a process from "),o("a",{attrs:{href:"https://processes.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("processes.openeo.org"),o("OutboundLink")],1),e._v(" which does not yet have an\nimplementation in "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("li",[e._v("Clone "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-processes-dask"),o("OutboundLink")],1),e._v(", checkout a new branch, and start implementing the missing process. Make sure you properly handle all parameters defined for this process. Add a test for your process in "),o("code",[e._v("openeo-processes-dask/tests")]),e._v(" ideally using dask. The "),o("code",[e._v("create_fake_rastercube")]),e._v(" from the "),o("code",[e._v("openeo-processes-dask/tests/mockdata")]),e._v(" can be used for testing, with the "),o("code",[e._v("backend")]),e._v(" parameter set to "),o("code",[e._v("numpy")]),e._v(" or "),o("code",[e._v("dask")]),e._v(".")]),e._v(" "),o("li",[e._v("Push your code and open a PR.")])]),e._v(" "),o("h2",{attrs:{id:"http-rest-interface"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#http-rest-interface"}},[e._v("#")]),e._v(" HTTP REST Interface")]),e._v(" "),o("p",[e._v("The next step would be to set up a HTTP REST interface (i.e. an implementation of the openEO HTTP API) for the new openEO environment.\nIt must be available in front of the process implementations to properly answer openEO client requests.\nCurrently, the "),o("a",{attrs:{href:"https://openeo.eodc.eu/v1.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("EODC"),o("OutboundLink")],1),e._v(" and "),o("a",{attrs:{href:"https://openeo.eurac.edu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Eurac Research"),o("OutboundLink")],1),e._v(" back-ends use Xarray and Dask and thus\nare the first implementations of back-ends to look at.")]),e._v(" "),o("ul",[o("li",[e._v("EODC is using a Python implementation, the "),o("a",{attrs:{href:"https://github.com/eodcgmbh/openeo-fastapi",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-fastapi"),o("OutboundLink")],1),e._v(".")]),e._v(" "),o("li",[e._v("Eurac Research relies on a Java based implementation, the "),o("a",{attrs:{href:"https://github.com/Open-EO/openeo-spring-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("openeo-spring-driver"),o("OutboundLink")],1)])]),e._v(" "),o("p",[e._v("If you have any questions, please "),o("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact us")]),e._v(".")],1)])}),[],!1,null,null,null);o.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/81.96e8e3ba.js b/assets/js/81.cd3fa397.js similarity index 98% rename from assets/js/81.96e8e3ba.js rename to assets/js/81.cd3fa397.js index 86ce25e8c..9bc3a732a 100644 --- a/assets/js/81.96e8e3ba.js +++ b/assets/js/81.cd3fa397.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{521:function(e,t,r){"use strict";r.r(t);var n=r(4),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-client-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-client-developers"}},[e._v("#")]),e._v(" Getting started for client developers")]),e._v(" "),t("p",[e._v("For easy access to openEO back-ends it is essential to provide client libraries for users in their well-known programming languages or working environments. This can be either a "),t("em",[e._v("client library")]),e._v(" for a specific programming language that hides the technical details of the openEO API or an application with a user interface, e.g. a GIS software plugin or a web-based tool. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"client-library-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-library-developers"}},[e._v("#")]),e._v(" Client library developers")]),e._v(" "),t("p",[e._v("If your preferred programming language is not part of the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("available client libraries")]),e._v(" you may consider writing your own client library. Our client libraries are basically translating the openEO API into native concepts of the programming languages. Working with openEO should feel like being a "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/First-class_citizen",target:"_blank",rel:"noopener noreferrer"}},[e._v("first-class citizen"),t("OutboundLink")],1),e._v(" of the programming language.")],1),e._v(" "),t("p",[e._v("Get started by reading the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/clients/library-guidelines.html"}},[e._v("guidelines to develop client libraries")]),e._v(", which have been written to ensure the client libraries provide a consistent feel and behavior across programming languages. You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html"}},[e._v("glossary")]),e._v(" and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes/Process-Graphs"}},[e._v("process graphs")]),e._v(". This helps you understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(" and related documents.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a client library stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(". Make sure the generated code complies to the client library guidelines mentioned above.")],1),e._v(" "),t("p",[t("em",[e._v("More information will follow soon, for example about client testing.")])]),e._v(" "),t("h2",{attrs:{id:"applications-and-software-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applications-and-software-plugins"}},[e._v("#")]),e._v(" Applications and Software plugins")]),e._v(" "),t("p",[e._v("Standalone applications and software plugins written in a certain programming language could use the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("existing client libraries")]),e._v(" to facilitate access to openEO back-ends. Web applications potentially could use the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript client"),t("OutboundLink")],1),e._v(" to access openEO back-ends. Back-Ends may also provide standardized web interfaces such as OGC WMS or OGC WCS to access processed EO data.")],1),e._v(" "),t("p",[t("em",[e._v("More information will follow soon...")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{523:function(e,t,r){"use strict";r.r(t);var n=r(4),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"getting-started-for-client-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-for-client-developers"}},[e._v("#")]),e._v(" Getting started for client developers")]),e._v(" "),t("p",[e._v("For easy access to openEO back-ends it is essential to provide client libraries for users in their well-known programming languages or working environments. This can be either a "),t("em",[e._v("client library")]),e._v(" for a specific programming language that hides the technical details of the openEO API or an application with a user interface, e.g. a GIS software plugin or a web-based tool. All software written for openEO should follow the "),t("RouterLink",{attrs:{to:"/documentation/software-guidelines.html"}},[e._v("software development guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"client-library-developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-library-developers"}},[e._v("#")]),e._v(" Client library developers")]),e._v(" "),t("p",[e._v("If your preferred programming language is not part of the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("available client libraries")]),e._v(" you may consider writing your own client library. Our client libraries are basically translating the openEO API into native concepts of the programming languages. Working with openEO should feel like being a "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/First-class_citizen",target:"_blank",rel:"noopener noreferrer"}},[e._v("first-class citizen"),t("OutboundLink")],1),e._v(" of the programming language.")],1),e._v(" "),t("p",[e._v("Get started by reading the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/clients/library-guidelines.html"}},[e._v("guidelines to develop client libraries")]),e._v(", which have been written to ensure the client libraries provide a consistent feel and behavior across programming languages. You certainly need to understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/glossary.html"}},[e._v("glossary")]),e._v(" and the concepts behind "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes"}},[e._v("processes")]),e._v(" and "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html#section/Processes/Process-Graphs"}},[e._v("process graphs")]),e._v(". This helps you understand the "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(" and related documents.")],1),e._v(" "),t("p",[e._v("If you do not want to start from scratch, you could try to generate a client library stub from the "),t("a",{attrs:{href:"https://www.openapis.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI 3.0"),t("OutboundLink")],1),e._v("-based "),t("RouterLink",{attrs:{to:"/documentation/1.0/developers/api/reference.html"}},[e._v("API specification")]),e._v(" with the "),t("a",{attrs:{href:"https://github.com/OpenAPITools/openapi-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI Generator"),t("OutboundLink")],1),e._v(". Make sure the generated code complies to the client library guidelines mentioned above.")],1),e._v(" "),t("p",[t("em",[e._v("More information will follow soon, for example about client testing.")])]),e._v(" "),t("h2",{attrs:{id:"applications-and-software-plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applications-and-software-plugins"}},[e._v("#")]),e._v(" Applications and Software plugins")]),e._v(" "),t("p",[e._v("Standalone applications and software plugins written in a certain programming language could use the "),t("RouterLink",{attrs:{to:"/software.html#clients"}},[e._v("existing client libraries")]),e._v(" to facilitate access to openEO back-ends. Web applications potentially could use the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript client"),t("OutboundLink")],1),e._v(" to access openEO back-ends. Back-Ends may also provide standardized web interfaces such as OGC WMS or OGC WCS to access processed EO data.")],1),e._v(" "),t("p",[t("em",[e._v("More information will follow soon...")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/82.fb0a3e2e.js b/assets/js/82.4f4bed4a.js similarity index 99% rename from assets/js/82.fb0a3e2e.js rename to assets/js/82.4f4bed4a.js index 26735a493..00bf09bcc 100644 --- a/assets/js/82.fb0a3e2e.js +++ b/assets/js/82.4f4bed4a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{522:function(t,e,s){"use strict";s.r(e);var a=s(4),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"client-library-development-guidelines"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#client-library-development-guidelines"}},[t._v("#")]),t._v(" Client library development guidelines")]),t._v(" "),e("p",[t._v("This is a proposal for workflows that client libraries should support to make the experience with each library similar and users can easily adopt examples and workflows.")]),t._v(" "),e("p",[t._v("For best experience libraries should still embrace best practices common in their environments. This means clients can...")]),t._v(" "),e("ul",[e("li",[t._v("choose which kind of casing they use (see below).")]),t._v(" "),e("li",[t._v("feel free to implement aliases for methods.")])]),t._v(" "),e("h2",{attrs:{id:"conventions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#conventions"}},[t._v("#")]),t._v(" Conventions")]),t._v(" "),e("h3",{attrs:{id:"casing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#casing"}},[t._v("#")]),t._v(" Casing")]),t._v(" "),e("p",[t._v("Clients can use "),e("code",[t._v("snake_case")]),t._v(", "),e("code",[t._v("camelCase")]),t._v(" or any method used commonly in their environment. For example, the API request to get a list of collections can either be names "),e("code",[t._v("get_collections")]),t._v(" or "),e("code",[t._v("getCollections")]),t._v(". This applies for all names, including scopes, method names and parameters.")]),t._v(" "),e("h3",{attrs:{id:"scopes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scopes"}},[t._v("#")]),t._v(" Scopes")]),t._v(" "),e("p",[t._v('Each method belongs to a scope. To achieve this in object-oriented (OO) programming languages, methods would be part of a class. If programming languages don\'t support scopes, you may need to simulate it somehow to prevent name collisions, e.g. by adding a prefix to the method names (like in the "procedural style" example below). Best practices for this will likely evolve over time.')]),t._v(" "),e("p",[t._v("Example for the "),e("code",[t._v("clientVersion")]),t._v(" method in "),e("code",[t._v("openEO")]),t._v(":")]),t._v(" "),e("ul",[e("li",[t._v("Procedural style: "),e("code",[t._v("openeo_client_version()")])]),t._v(" "),e("li",[t._v("Object-oriented style:"),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nobj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("clientVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),e("p",[t._v("If you can't store scope data in an object, you may need to pass these information as argument(s) to the method.")]),t._v(" "),e("p",[t._v("Example:")]),t._v(" "),e("ul",[e("li",[t._v("Procedural style:"),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),e("li",[t._v("Object-oriented style:"),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncon"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),e("h3",{attrs:{id:"scope-categories"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-categories"}},[t._v("#")]),t._v(" Scope categories")]),t._v(" "),e("p",[t._v("Each scope is assigned to a scope category, of which there are three:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Root")]),t._v(" category: Contains only the scope "),e("code",[t._v("openEO")]),t._v(".")]),t._v(" "),e("li",[e("em",[t._v("API")]),t._v(" category: Mostly methods hiding API calls to the back-ends. Methods may be implemented asynchronously. Contains the scopes "),e("code",[t._v("Connection")]),t._v(", "),e("code",[t._v("File")]),t._v(", "),e("code",[t._v("Job")]),t._v(", "),e("code",[t._v("UserProcess")]),t._v(", "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("li",[e("em",[t._v("Content")]),t._v(": Mostly methods hiding the complexity of response content. Methods are usually implemented synchronously. Currently contains only the scope "),e("code",[t._v("Capabilities")]),t._v(". Method names should be prefixed if name collisions are likely.")])]),t._v(" "),e("p",[t._v("Method names across ALL the scopes that belong to the "),e("em",[t._v("root")]),t._v(" or "),e("em",[t._v("API")]),t._v(" categories MUST be unique. This is the case because the parameter in "),e("code",[t._v("hasFeature(method_name)")]),t._v(" must be unambiguous.")]),t._v(" "),e("p",[t._v("Method names of scopes in the "),e("em",[t._v("Content")]),t._v(" category may collide with method names of scopes in the "),e("em",[t._v("root")]),t._v("/"),e("em",[t._v("API")]),t._v(" categories and names should be prefixed if collisions of names between different scope categories are to be expected.")]),t._v(" "),e("h3",{attrs:{id:"parameters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("p",[t._v("The parameters usually follow the request schemes in the openAPI specification. The parameters should follow their characteristics, for example regarding the default values.")]),t._v(" "),e("p",[t._v("Some methods have a long list of (optional) parameters. This is easy to implement in languages that support named parameters such as R. For example, creating a job in R with a budget would lead to this method call:")]),t._v(" "),e("div",{staticClass:"language-R extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("createJob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process_graph "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token ellipsis"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" budget "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Other languages that only support non-named parameters (i.e. the order of parameters is fixed) need to fill many parameters with default values, which is not convenient for a user. The example above in PHP would be:")]),t._v(" "),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("To avoid such method calls client developers should consider to pass either")]),t._v(" "),e("ul",[e("li",[t._v("an instance of a class, which contains all parameters as member variables or")]),t._v(" "),e("li",[t._v("the required parameters directly and the optional parameters as a dictionary (see example below).")])]),t._v(" "),e("p",[t._v("This basically emulates named parameters. The member variables / dictionary keys should use the same names as the parameters. The exemplary method call in PHP could be improved as follows:")]),t._v(" "),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("budget "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"method-mappings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#method-mappings"}},[t._v("#")]),t._v(" Method mappings")]),t._v(" "),e("p",[e("strong",[t._v("Note:")]),t._v(" Some scopes for response JSON objects are still missing. We are open for proposals.")]),t._v(" "),e("p",[t._v("Parameters with a leading "),e("code",[t._v("?")]),t._v(" are optional.")]),t._v(" "),e("h3",{attrs:{id:"scope-openeo-root-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-openeo-root-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("openEO")]),t._v(" (root category)")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Connect to a back-end, includes version discovery ("),e("code",[t._v("GET /.well-known/openeo")]),t._v("), requesting capabilities and authentication where required. Returns "),e("code",[t._v("Connection")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("connect(url, ?authType, ?authOptions)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get client library version.")]),t._v(" "),e("td",[e("code",[t._v("clientVersion()")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-2"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("authType")]),t._v(" in "),e("code",[t._v("connect")]),t._v(": "),e("code",[t._v("null")]),t._v(", "),e("code",[t._v("basic")]),t._v(" or "),e("code",[t._v("oidc")]),t._v(" (non-exclusive). Defaults to "),e("code",[t._v("null")]),t._v(" (no authentication).")]),t._v(" "),e("li",[e("strong",[t._v("authOptions")]),t._v(" in "),e("code",[t._v("connect")]),t._v(": May hold additional data for authentication, for example a username and password for "),e("code",[t._v("basic")]),t._v(" authentication.")])]),t._v(" "),e("h3",{attrs:{id:"scope-connection-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-connection-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("Connection")]),t._v(" (API category)")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get the capabilities of the back-end. Returns "),e("code",[t._v("Capabilities")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /")])]),t._v(" "),e("td",[e("code",[t._v("capabilities()")])])]),t._v(" "),e("tr",[e("td",[t._v("List the supported output file formats.")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[e("code",[t._v("listFileTypes()")])])]),t._v(" "),e("tr",[e("td",[t._v("List the supported secondary service types.")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[e("code",[t._v("listServiceTypes()")])])]),t._v(" "),e("tr",[e("td",[t._v("List the supported UDF runtimes.")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[e("code",[t._v("listUdfRuntimes()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all collections available on the back-end.")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[e("code",[t._v("listCollections()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get information about a single collection.")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{collection_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeCollection(collection_id)")])])]),t._v(" "),e("tr",[e("td",[t._v("List all pre-defined processes available on the back-end.")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[e("code",[t._v("listProcesses()")])])]),t._v(" "),e("tr",[e("td",[t._v("List authentication providers (may also list HTTP Basic).")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/oidc")]),t._v(" / "),e("code",[t._v("GET /credentials/basic")])]),t._v(" "),e("td",[e("code",[t._v("listAuthProviders()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get information about the authenticated user.")]),t._v(" "),e("td",[e("code",[t._v("GET /me")])]),t._v(" "),e("td",[e("code",[t._v("describeAccount()")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all files from a user. Returns a list of "),e("code",[t._v("File")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /files")])]),t._v(" "),e("td",[e("code",[t._v("listFiles()")])])]),t._v(" "),e("tr",[e("td",[t._v("Opens an (existing or non-existing) file without reading it. Returns a "),e("code",[t._v("File")]),t._v(".")]),t._v(" "),e("td",[e("em",[t._v("None")])]),t._v(" "),e("td",[e("code",[t._v("getFile(path)")])])]),t._v(" "),e("tr",[e("td",[t._v("Upload a user file. Returns a "),e("code",[t._v("File")]),t._v(".")]),t._v(" "),e("td",[t._v("Shortcut: "),e("code",[t._v("getFile(path).uploadFile(source)")])]),t._v(" "),e("td",[e("code",[t._v("uploadFile(source, path)")])])]),t._v(" "),e("tr",[e("td",[t._v("Validates a process graph.")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[e("code",[t._v("validateProcess(process)")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all user-defined processes of the authenticated user. Returns a list of "),e("code",[t._v("UserProcess")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")])]),t._v(" "),e("td",[e("code",[t._v("listUserProcesses()")])])]),t._v(" "),e("tr",[e("td",[t._v("Creates a new user-defined process. Returns a "),e("code",[t._v("UserProcess")]),t._v(".")]),t._v(" "),e("td",[t._v("Shortcut: "),e("code",[t._v("getUserProcess(id).replaceUserProcess(process)")])]),t._v(" "),e("td",[e("code",[t._v("setUserProcess(id, process)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get all information about a user-defined process. Returns a "),e("code",[t._v("UserProcess")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("getUserProcess(id)")])])]),t._v(" "),e("tr",[e("td",[t._v("Executes a process graph synchronously.")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[e("code",[t._v("computeResult(process, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all jobs of the authenticated user. Returns a list of "),e("code",[t._v("Job")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[e("code",[t._v("listJobs()")])])]),t._v(" "),e("tr",[e("td",[t._v("Creates a new job. Returns a "),e("code",[t._v("Job")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[e("code",[t._v("createJob(process, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get all information about a job. Returns a "),e("code",[t._v("Job")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("getJob(id)")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all secondary services of the authenticated user. Returns a list of "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[e("code",[t._v("listServices()")])])]),t._v(" "),e("tr",[e("td",[t._v("Creates a new secondary service. Returns a "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[e("code",[t._v("createService(process, type, ?title, ?description, ?enabled, ?parameters, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get all information about a service. Returns a "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("getService(id)")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-3"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("options")]),t._v(" in "),e("code",[t._v("authenticateOIDC")]),t._v(": May hold additional data required for OpenID connect authentication.")]),t._v(" "),e("li",[e("strong",[t._v("additional")]),t._v(" in "),e("code",[t._v("createJob")]),t._v(" and "),e("code",[t._v("createService")]),t._v(" (also below in "),e("code",[t._v("updateJob")]),t._v(" and "),e("code",[t._v("updateService")]),t._v("): May hold additional key-value-pairs as object. The object should be merged with the body of the request.")])]),t._v(" "),e("h3",{attrs:{id:"scope-capabilities-content-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-capabilities-content-category"}},[t._v("#")]),t._v(" Scope "),e("code",[t._v("Capabilities")]),t._v(" (Content category)")]),t._v(" "),e("p",[t._v("Should be prefixed with "),e("code",[t._v("Capabilities")]),t._v(" if collisions of names between different scope categories are to be expected.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("Field")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get the implemented openEO version.")]),t._v(" "),e("td",[e("code",[t._v("api_version")])]),t._v(" "),e("td",[e("code",[t._v("apiVersion()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the back-end version.")]),t._v(" "),e("td",[e("code",[t._v("backend_version")])]),t._v(" "),e("td",[e("code",[t._v("backendVersion()")])])]),t._v(" "),e("tr",[e("td",[t._v("Is the back-end suitable for use in production?")]),t._v(" "),e("td",[e("code",[t._v("production")])]),t._v(" "),e("td",[e("code",[t._v("isStable()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the name of the back-end.")]),t._v(" "),e("td",[e("code",[t._v("title")])]),t._v(" "),e("td",[e("code",[t._v("title()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the description of the back-end.")]),t._v(" "),e("td",[e("code",[t._v("description")])]),t._v(" "),e("td",[e("code",[t._v("description()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all supported features / endpoints.")]),t._v(" "),e("td",[e("code",[t._v("endpoints")])]),t._v(" "),e("td",[e("code",[t._v("listFeatures()")])])]),t._v(" "),e("tr",[e("td",[t._v("Check whether a feature / endpoint is supported.")]),t._v(" "),e("td",[e("code",[t._v("endpoints")]),t._v(" > ...")]),t._v(" "),e("td",[e("code",[t._v("hasFeature(methodName)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the default billing currency.")]),t._v(" "),e("td",[e("code",[t._v("billing")]),t._v(" > "),e("code",[t._v("currency")])]),t._v(" "),e("td",[e("code",[t._v("currency()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all billing plans.")]),t._v(" "),e("td",[e("code",[t._v("billing")]),t._v(" > "),e("code",[t._v("plans")])]),t._v(" "),e("td",[e("code",[t._v("listPlans()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all links.")]),t._v(" "),e("td",[e("code",[t._v("links")])]),t._v(" "),e("td",[e("code",[t._v("links()")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-4"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("methodName")]),t._v(" in "),e("code",[t._v("hasFeature")]),t._v(": The name of a client method in any of the scopes that are part of the "),e("em",[t._v("API")]),t._v(" category. E.g. "),e("code",[t._v('hasFeature("describeAccount")')]),t._v(" checks whether the "),e("code",[t._v("GET /me")]),t._v(" endpoint is contained in the capabilities response's "),e("code",[t._v("endpoints")]),t._v(" object.")])]),t._v(" "),e("h3",{attrs:{id:"scope-file-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-file-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("File")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("File")]),t._v(" scope internally knows the "),e("code",[t._v("path")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Download a user file.")]),t._v(" "),e("td",[e("code",[t._v("GET /files/{path}")])]),t._v(" "),e("td",[e("code",[t._v("downloadFile(target)")])])]),t._v(" "),e("tr",[e("td",[t._v("Upload a user file.")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[e("code",[t._v("uploadFile(source)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a user file.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /files/{path}")])]),t._v(" "),e("td",[e("code",[t._v("deleteFile()")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-5"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("target")]),t._v(" in "),e("code",[t._v("downloadFile")]),t._v(": Path to a local file or folder.")])]),t._v(" "),e("h3",{attrs:{id:"scope-job-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-job-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("Job")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Job")]),t._v(" scope internally knows the "),e("code",[t._v("job_id")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get all job information.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Modify a job at the back-end.")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("updateJob(?process, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a job")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("deleteJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Calculate an time/cost estimate for a job.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/estimate")])]),t._v(" "),e("td",[e("code",[t._v("estimateJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the log files for a job.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/logs")])]),t._v(" "),e("td",[e("code",[t._v("debugJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Start / queue a job for processing.")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{job_id}/results")])]),t._v(" "),e("td",[e("code",[t._v("startJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Stop / cancel job processing.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{job_id}/results")])]),t._v(" "),e("td",[e("code",[t._v("stopJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get STAC catalog with download links.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/results")])]),t._v(" "),e("td",[e("code",[t._v("listResults()")])])]),t._v(" "),e("tr",[e("td",[t._v("Download job results.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/results")]),t._v(" > assets")]),t._v(" "),e("td",[e("code",[t._v("downloadResults(target)")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-6"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-6"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("target")]),t._v(" in "),e("code",[t._v("downloadResults")]),t._v(": Path to a local folder.")])]),t._v(" "),e("h3",{attrs:{id:"scope-userprocess-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-userprocess-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("UserProcess")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("UserProcess")]),t._v(" scope manages the user-defined processes and internally knows the "),e("code",[t._v("process_graph_id")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get information about a user-defined process.")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeUserProcess()")])])]),t._v(" "),e("tr",[e("td",[t._v("Create or replace a user-defined process at the back-end.")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("replaceUserProcess(process)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a user-defined process.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("deleteUserProcess()")])])])])]),t._v(" "),e("h3",{attrs:{id:"scope-service-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-service-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("Service")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Service")]),t._v(" scope internally knows the "),e("code",[t._v("service_id")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get all information about a secondary web service.")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeService()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the log files for a web service.")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{service_id}/logs")])]),t._v(" "),e("td",[e("code",[t._v("debugService()")])])]),t._v(" "),e("tr",[e("td",[t._v("Modify a secondary web service at the back-end.")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("updateService(?process, ?title, ?description, ?enabled, ?configuration, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a secondary web service.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("deleteService()")])])])])]),t._v(" "),e("h2",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v("The processes a back-end supports may be offered by the clients as methods in its own scope. The method names should follow the process names, but the conventions listed above can be applied here as well, e.g. converting "),e("code",[t._v("filter_bands")]),t._v(" to "),e("code",[t._v("filterBands")]),t._v(". As parameters have no natural or technical ordering in the JSON objects, clients must come up with a reasonable ordering of parameters if required. This could be inspired by existing clients. The way of building a process graph from processes heavily depends on the technical capabilities of the programming language. Therefore it may differ between the client libraries. Follow the best practices of the programming language, e.g. support method chaining if possible.")]),t._v(" "),e("h2",{attrs:{id:"workflow-example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#workflow-example"}},[t._v("#")]),t._v(" Workflow example")]),t._v(" "),e("p",[t._v("Some simplified example workflows using different programming styles are listed below. The following steps are executed:")]),t._v(" "),e("ol",[e("li",[t._v("Loading the client library.")]),t._v(" "),e("li",[t._v("Connecting to a back-end and authenticating with username and password via OpenID Connect.")]),t._v(" "),e("li",[t._v("Requesting the capabilities and showing the implemented openEO version of the back-end.")]),t._v(" "),e("li",[t._v('Showing information about the "Sentinel-2A" collection.')]),t._v(" "),e("li",[t._v("Showing information about all processes supported by the back-end.")]),t._v(" "),e("li",[t._v("Building a simple process graph.")]),t._v(" "),e("li",[t._v("Creating a job.")]),t._v(" "),e("li",[t._v("Pushing the job to the processing queue.")]),t._v(" "),e("li",[t._v("After a while, showing the job details, e.g. checking the job status.")]),t._v(" "),e("li",[t._v("Once processing is finished, downloading the job results to the local directory "),e("code",[t._v("/tmp/job_results/")]),t._v(".")])]),t._v(" "),e("p",[t._v("Please note that the examples below do not comply to the latest process specification. They are meant to show the differences in client development, but are no working examples!")]),t._v(" "),e("h3",{attrs:{id:"r-functional-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#r-functional-style"}},[t._v("#")]),t._v(" R (functional style)")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token ellipsis"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" capabilities"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("api_version"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndescribe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlist_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Chain processes, implementation is up to the client")]),t._v("\n\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" createJob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nstart_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndescribe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndownload_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" folder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h3",{attrs:{id:"python-mixed-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#python-mixed-style"}},[t._v("#")]),t._v(" Python (mixed style)")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_basic"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("capabilities"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api_version"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Chain processes, implementation is up to the client")]),t._v("\n\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h3",{attrs:{id:"java-object-oriented-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java-object-oriented-style"}},[t._v("#")]),t._v(" Java (object oriented style)")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Capabilities")]),t._v(" cap "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DataCube")]),t._v(" cube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createDataCube")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Chain processes, implementation is up to the client")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Job")]),t._v(" job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("downloadResults")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"php-procedural-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-procedural-style"}},[t._v("#")]),t._v(" PHP (procedural style)")]),t._v(" "),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("require_once")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/path/to/openeo.php"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"http://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilities")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_api_version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilites")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_collection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_list_processes")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$datacube")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_datacube")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Chain processes, implementation is up to the client")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_create_job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$datacube")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_start_job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_download_results")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{524:function(t,e,s){"use strict";s.r(e);var a=s(4),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"client-library-development-guidelines"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#client-library-development-guidelines"}},[t._v("#")]),t._v(" Client library development guidelines")]),t._v(" "),e("p",[t._v("This is a proposal for workflows that client libraries should support to make the experience with each library similar and users can easily adopt examples and workflows.")]),t._v(" "),e("p",[t._v("For best experience libraries should still embrace best practices common in their environments. This means clients can...")]),t._v(" "),e("ul",[e("li",[t._v("choose which kind of casing they use (see below).")]),t._v(" "),e("li",[t._v("feel free to implement aliases for methods.")])]),t._v(" "),e("h2",{attrs:{id:"conventions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#conventions"}},[t._v("#")]),t._v(" Conventions")]),t._v(" "),e("h3",{attrs:{id:"casing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#casing"}},[t._v("#")]),t._v(" Casing")]),t._v(" "),e("p",[t._v("Clients can use "),e("code",[t._v("snake_case")]),t._v(", "),e("code",[t._v("camelCase")]),t._v(" or any method used commonly in their environment. For example, the API request to get a list of collections can either be names "),e("code",[t._v("get_collections")]),t._v(" or "),e("code",[t._v("getCollections")]),t._v(". This applies for all names, including scopes, method names and parameters.")]),t._v(" "),e("h3",{attrs:{id:"scopes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scopes"}},[t._v("#")]),t._v(" Scopes")]),t._v(" "),e("p",[t._v('Each method belongs to a scope. To achieve this in object-oriented (OO) programming languages, methods would be part of a class. If programming languages don\'t support scopes, you may need to simulate it somehow to prevent name collisions, e.g. by adding a prefix to the method names (like in the "procedural style" example below). Best practices for this will likely evolve over time.')]),t._v(" "),e("p",[t._v("Example for the "),e("code",[t._v("clientVersion")]),t._v(" method in "),e("code",[t._v("openEO")]),t._v(":")]),t._v(" "),e("ul",[e("li",[t._v("Procedural style: "),e("code",[t._v("openeo_client_version()")])]),t._v(" "),e("li",[t._v("Object-oriented style:"),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nobj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("clientVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),e("p",[t._v("If you can't store scope data in an object, you may need to pass these information as argument(s) to the method.")]),t._v(" "),e("p",[t._v("Example:")]),t._v(" "),e("ul",[e("li",[t._v("Procedural style:"),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])]),t._v(" "),e("li",[t._v("Object-oriented style:"),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ncon"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])]),t._v(" "),e("h3",{attrs:{id:"scope-categories"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-categories"}},[t._v("#")]),t._v(" Scope categories")]),t._v(" "),e("p",[t._v("Each scope is assigned to a scope category, of which there are three:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("Root")]),t._v(" category: Contains only the scope "),e("code",[t._v("openEO")]),t._v(".")]),t._v(" "),e("li",[e("em",[t._v("API")]),t._v(" category: Mostly methods hiding API calls to the back-ends. Methods may be implemented asynchronously. Contains the scopes "),e("code",[t._v("Connection")]),t._v(", "),e("code",[t._v("File")]),t._v(", "),e("code",[t._v("Job")]),t._v(", "),e("code",[t._v("UserProcess")]),t._v(", "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("li",[e("em",[t._v("Content")]),t._v(": Mostly methods hiding the complexity of response content. Methods are usually implemented synchronously. Currently contains only the scope "),e("code",[t._v("Capabilities")]),t._v(". Method names should be prefixed if name collisions are likely.")])]),t._v(" "),e("p",[t._v("Method names across ALL the scopes that belong to the "),e("em",[t._v("root")]),t._v(" or "),e("em",[t._v("API")]),t._v(" categories MUST be unique. This is the case because the parameter in "),e("code",[t._v("hasFeature(method_name)")]),t._v(" must be unambiguous.")]),t._v(" "),e("p",[t._v("Method names of scopes in the "),e("em",[t._v("Content")]),t._v(" category may collide with method names of scopes in the "),e("em",[t._v("root")]),t._v("/"),e("em",[t._v("API")]),t._v(" categories and names should be prefixed if collisions of names between different scope categories are to be expected.")]),t._v(" "),e("h3",{attrs:{id:"parameters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("p",[t._v("The parameters usually follow the request schemes in the openAPI specification. The parameters should follow their characteristics, for example regarding the default values.")]),t._v(" "),e("p",[t._v("Some methods have a long list of (optional) parameters. This is easy to implement in languages that support named parameters such as R. For example, creating a job in R with a budget would lead to this method call:")]),t._v(" "),e("div",{staticClass:"language-R extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("createJob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process_graph "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token ellipsis"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" budget "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("Other languages that only support non-named parameters (i.e. the order of parameters is fixed) need to fill many parameters with default values, which is not convenient for a user. The example above in PHP would be:")]),t._v(" "),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constant"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("To avoid such method calls client developers should consider to pass either")]),t._v(" "),e("ul",[e("li",[t._v("an instance of a class, which contains all parameters as member variables or")]),t._v(" "),e("li",[t._v("the required parameters directly and the optional parameters as a dictionary (see example below).")])]),t._v(" "),e("p",[t._v("This basically emulates named parameters. The member variables / dictionary keys should use the same names as the parameters. The exemplary method call in PHP could be improved as follows:")]),t._v(" "),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("budget "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h2",{attrs:{id:"method-mappings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#method-mappings"}},[t._v("#")]),t._v(" Method mappings")]),t._v(" "),e("p",[e("strong",[t._v("Note:")]),t._v(" Some scopes for response JSON objects are still missing. We are open for proposals.")]),t._v(" "),e("p",[t._v("Parameters with a leading "),e("code",[t._v("?")]),t._v(" are optional.")]),t._v(" "),e("h3",{attrs:{id:"scope-openeo-root-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-openeo-root-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("openEO")]),t._v(" (root category)")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Connect to a back-end, includes version discovery ("),e("code",[t._v("GET /.well-known/openeo")]),t._v("), requesting capabilities and authentication where required. Returns "),e("code",[t._v("Connection")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("connect(url, ?authType, ?authOptions)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get client library version.")]),t._v(" "),e("td",[e("code",[t._v("clientVersion()")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-2"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("authType")]),t._v(" in "),e("code",[t._v("connect")]),t._v(": "),e("code",[t._v("null")]),t._v(", "),e("code",[t._v("basic")]),t._v(" or "),e("code",[t._v("oidc")]),t._v(" (non-exclusive). Defaults to "),e("code",[t._v("null")]),t._v(" (no authentication).")]),t._v(" "),e("li",[e("strong",[t._v("authOptions")]),t._v(" in "),e("code",[t._v("connect")]),t._v(": May hold additional data for authentication, for example a username and password for "),e("code",[t._v("basic")]),t._v(" authentication.")])]),t._v(" "),e("h3",{attrs:{id:"scope-connection-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-connection-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("Connection")]),t._v(" (API category)")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get the capabilities of the back-end. Returns "),e("code",[t._v("Capabilities")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /")])]),t._v(" "),e("td",[e("code",[t._v("capabilities()")])])]),t._v(" "),e("tr",[e("td",[t._v("List the supported output file formats.")]),t._v(" "),e("td",[e("code",[t._v("GET /file_formats")])]),t._v(" "),e("td",[e("code",[t._v("listFileTypes()")])])]),t._v(" "),e("tr",[e("td",[t._v("List the supported secondary service types.")]),t._v(" "),e("td",[e("code",[t._v("GET /service_types")])]),t._v(" "),e("td",[e("code",[t._v("listServiceTypes()")])])]),t._v(" "),e("tr",[e("td",[t._v("List the supported UDF runtimes.")]),t._v(" "),e("td",[e("code",[t._v("GET /udf_runtimes")])]),t._v(" "),e("td",[e("code",[t._v("listUdfRuntimes()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all collections available on the back-end.")]),t._v(" "),e("td",[e("code",[t._v("GET /collections")])]),t._v(" "),e("td",[e("code",[t._v("listCollections()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get information about a single collection.")]),t._v(" "),e("td",[e("code",[t._v("GET /collections/{collection_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeCollection(collection_id)")])])]),t._v(" "),e("tr",[e("td",[t._v("List all pre-defined processes available on the back-end.")]),t._v(" "),e("td",[e("code",[t._v("GET /processes")])]),t._v(" "),e("td",[e("code",[t._v("listProcesses()")])])]),t._v(" "),e("tr",[e("td",[t._v("List authentication providers (may also list HTTP Basic).")]),t._v(" "),e("td",[e("code",[t._v("GET /credentials/oidc")]),t._v(" / "),e("code",[t._v("GET /credentials/basic")])]),t._v(" "),e("td",[e("code",[t._v("listAuthProviders()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get information about the authenticated user.")]),t._v(" "),e("td",[e("code",[t._v("GET /me")])]),t._v(" "),e("td",[e("code",[t._v("describeAccount()")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all files from a user. Returns a list of "),e("code",[t._v("File")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /files")])]),t._v(" "),e("td",[e("code",[t._v("listFiles()")])])]),t._v(" "),e("tr",[e("td",[t._v("Opens an (existing or non-existing) file without reading it. Returns a "),e("code",[t._v("File")]),t._v(".")]),t._v(" "),e("td",[e("em",[t._v("None")])]),t._v(" "),e("td",[e("code",[t._v("getFile(path)")])])]),t._v(" "),e("tr",[e("td",[t._v("Upload a user file. Returns a "),e("code",[t._v("File")]),t._v(".")]),t._v(" "),e("td",[t._v("Shortcut: "),e("code",[t._v("getFile(path).uploadFile(source)")])]),t._v(" "),e("td",[e("code",[t._v("uploadFile(source, path)")])])]),t._v(" "),e("tr",[e("td",[t._v("Validates a process graph.")]),t._v(" "),e("td",[e("code",[t._v("POST /validation")])]),t._v(" "),e("td",[e("code",[t._v("validateProcess(process)")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all user-defined processes of the authenticated user. Returns a list of "),e("code",[t._v("UserProcess")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs")])]),t._v(" "),e("td",[e("code",[t._v("listUserProcesses()")])])]),t._v(" "),e("tr",[e("td",[t._v("Creates a new user-defined process. Returns a "),e("code",[t._v("UserProcess")]),t._v(".")]),t._v(" "),e("td",[t._v("Shortcut: "),e("code",[t._v("getUserProcess(id).replaceUserProcess(process)")])]),t._v(" "),e("td",[e("code",[t._v("setUserProcess(id, process)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get all information about a user-defined process. Returns a "),e("code",[t._v("UserProcess")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("getUserProcess(id)")])])]),t._v(" "),e("tr",[e("td",[t._v("Executes a process graph synchronously.")]),t._v(" "),e("td",[e("code",[t._v("POST /result")])]),t._v(" "),e("td",[e("code",[t._v("computeResult(process, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all jobs of the authenticated user. Returns a list of "),e("code",[t._v("Job")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs")])]),t._v(" "),e("td",[e("code",[t._v("listJobs()")])])]),t._v(" "),e("tr",[e("td",[t._v("Creates a new job. Returns a "),e("code",[t._v("Job")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs")])]),t._v(" "),e("td",[e("code",[t._v("createJob(process, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get all information about a job. Returns a "),e("code",[t._v("Job")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("getJob(id)")])])]),t._v(" "),e("tr",[e("td",[t._v("Lists all secondary services of the authenticated user. Returns a list of "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /services")])]),t._v(" "),e("td",[e("code",[t._v("listServices()")])])]),t._v(" "),e("tr",[e("td",[t._v("Creates a new secondary service. Returns a "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("POST /services")])]),t._v(" "),e("td",[e("code",[t._v("createService(process, type, ?title, ?description, ?enabled, ?parameters, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get all information about a service. Returns a "),e("code",[t._v("Service")]),t._v(".")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("getService(id)")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-3"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("options")]),t._v(" in "),e("code",[t._v("authenticateOIDC")]),t._v(": May hold additional data required for OpenID connect authentication.")]),t._v(" "),e("li",[e("strong",[t._v("additional")]),t._v(" in "),e("code",[t._v("createJob")]),t._v(" and "),e("code",[t._v("createService")]),t._v(" (also below in "),e("code",[t._v("updateJob")]),t._v(" and "),e("code",[t._v("updateService")]),t._v("): May hold additional key-value-pairs as object. The object should be merged with the body of the request.")])]),t._v(" "),e("h3",{attrs:{id:"scope-capabilities-content-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-capabilities-content-category"}},[t._v("#")]),t._v(" Scope "),e("code",[t._v("Capabilities")]),t._v(" (Content category)")]),t._v(" "),e("p",[t._v("Should be prefixed with "),e("code",[t._v("Capabilities")]),t._v(" if collisions of names between different scope categories are to be expected.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("Field")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get the implemented openEO version.")]),t._v(" "),e("td",[e("code",[t._v("api_version")])]),t._v(" "),e("td",[e("code",[t._v("apiVersion()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the back-end version.")]),t._v(" "),e("td",[e("code",[t._v("backend_version")])]),t._v(" "),e("td",[e("code",[t._v("backendVersion()")])])]),t._v(" "),e("tr",[e("td",[t._v("Is the back-end suitable for use in production?")]),t._v(" "),e("td",[e("code",[t._v("production")])]),t._v(" "),e("td",[e("code",[t._v("isStable()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the name of the back-end.")]),t._v(" "),e("td",[e("code",[t._v("title")])]),t._v(" "),e("td",[e("code",[t._v("title()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the description of the back-end.")]),t._v(" "),e("td",[e("code",[t._v("description")])]),t._v(" "),e("td",[e("code",[t._v("description()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all supported features / endpoints.")]),t._v(" "),e("td",[e("code",[t._v("endpoints")])]),t._v(" "),e("td",[e("code",[t._v("listFeatures()")])])]),t._v(" "),e("tr",[e("td",[t._v("Check whether a feature / endpoint is supported.")]),t._v(" "),e("td",[e("code",[t._v("endpoints")]),t._v(" > ...")]),t._v(" "),e("td",[e("code",[t._v("hasFeature(methodName)")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the default billing currency.")]),t._v(" "),e("td",[e("code",[t._v("billing")]),t._v(" > "),e("code",[t._v("currency")])]),t._v(" "),e("td",[e("code",[t._v("currency()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all billing plans.")]),t._v(" "),e("td",[e("code",[t._v("billing")]),t._v(" > "),e("code",[t._v("plans")])]),t._v(" "),e("td",[e("code",[t._v("listPlans()")])])]),t._v(" "),e("tr",[e("td",[t._v("List all links.")]),t._v(" "),e("td",[e("code",[t._v("links")])]),t._v(" "),e("td",[e("code",[t._v("links()")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-4"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("methodName")]),t._v(" in "),e("code",[t._v("hasFeature")]),t._v(": The name of a client method in any of the scopes that are part of the "),e("em",[t._v("API")]),t._v(" category. E.g. "),e("code",[t._v('hasFeature("describeAccount")')]),t._v(" checks whether the "),e("code",[t._v("GET /me")]),t._v(" endpoint is contained in the capabilities response's "),e("code",[t._v("endpoints")]),t._v(" object.")])]),t._v(" "),e("h3",{attrs:{id:"scope-file-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-file-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("File")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("File")]),t._v(" scope internally knows the "),e("code",[t._v("path")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Download a user file.")]),t._v(" "),e("td",[e("code",[t._v("GET /files/{path}")])]),t._v(" "),e("td",[e("code",[t._v("downloadFile(target)")])])]),t._v(" "),e("tr",[e("td",[t._v("Upload a user file.")]),t._v(" "),e("td",[e("code",[t._v("PUT /files/{path}")])]),t._v(" "),e("td",[e("code",[t._v("uploadFile(source)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a user file.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /files/{path}")])]),t._v(" "),e("td",[e("code",[t._v("deleteFile()")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-5"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("target")]),t._v(" in "),e("code",[t._v("downloadFile")]),t._v(": Path to a local file or folder.")])]),t._v(" "),e("h3",{attrs:{id:"scope-job-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-job-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("Job")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Job")]),t._v(" scope internally knows the "),e("code",[t._v("job_id")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get all job information.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Modify a job at the back-end.")]),t._v(" "),e("td",[e("code",[t._v("PATCH /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("updateJob(?process, ?title, ?description, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a job")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{job_id}")])]),t._v(" "),e("td",[e("code",[t._v("deleteJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Calculate an time/cost estimate for a job.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/estimate")])]),t._v(" "),e("td",[e("code",[t._v("estimateJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the log files for a job.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/logs")])]),t._v(" "),e("td",[e("code",[t._v("debugJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Start / queue a job for processing.")]),t._v(" "),e("td",[e("code",[t._v("POST /jobs/{job_id}/results")])]),t._v(" "),e("td",[e("code",[t._v("startJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Stop / cancel job processing.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /jobs/{job_id}/results")])]),t._v(" "),e("td",[e("code",[t._v("stopJob()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get STAC catalog with download links.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/results")])]),t._v(" "),e("td",[e("code",[t._v("listResults()")])])]),t._v(" "),e("tr",[e("td",[t._v("Download job results.")]),t._v(" "),e("td",[e("code",[t._v("GET /jobs/{job_id}/results")]),t._v(" > assets")]),t._v(" "),e("td",[e("code",[t._v("downloadResults(target)")])])])])]),t._v(" "),e("h4",{attrs:{id:"parameters-6"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parameters-6"}},[t._v("#")]),t._v(" Parameters")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("target")]),t._v(" in "),e("code",[t._v("downloadResults")]),t._v(": Path to a local folder.")])]),t._v(" "),e("h3",{attrs:{id:"scope-userprocess-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-userprocess-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("UserProcess")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("UserProcess")]),t._v(" scope manages the user-defined processes and internally knows the "),e("code",[t._v("process_graph_id")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get information about a user-defined process.")]),t._v(" "),e("td",[e("code",[t._v("GET /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeUserProcess()")])])]),t._v(" "),e("tr",[e("td",[t._v("Create or replace a user-defined process at the back-end.")]),t._v(" "),e("td",[e("code",[t._v("PUT /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("replaceUserProcess(process)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a user-defined process.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /process_graphs/{process_graph_id}")])]),t._v(" "),e("td",[e("code",[t._v("deleteUserProcess()")])])])])]),t._v(" "),e("h3",{attrs:{id:"scope-service-api-category"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scope-service-api-category"}},[t._v("#")]),t._v(" Scope: "),e("code",[t._v("Service")]),t._v(" (API category)")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Service")]),t._v(" scope internally knows the "),e("code",[t._v("service_id")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Description")]),t._v(" "),e("th",[t._v("API Request")]),t._v(" "),e("th",[t._v("Client method")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("Get all information about a secondary web service.")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("describeService()")])])]),t._v(" "),e("tr",[e("td",[t._v("Get the log files for a web service.")]),t._v(" "),e("td",[e("code",[t._v("GET /services/{service_id}/logs")])]),t._v(" "),e("td",[e("code",[t._v("debugService()")])])]),t._v(" "),e("tr",[e("td",[t._v("Modify a secondary web service at the back-end.")]),t._v(" "),e("td",[e("code",[t._v("PATCH /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("updateService(?process, ?title, ?description, ?enabled, ?configuration, ?plan, ?budget, ?additional)")])])]),t._v(" "),e("tr",[e("td",[t._v("Delete a secondary web service.")]),t._v(" "),e("td",[e("code",[t._v("DELETE /services/{service_id}")])]),t._v(" "),e("td",[e("code",[t._v("deleteService()")])])])])]),t._v(" "),e("h2",{attrs:{id:"processes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[t._v("#")]),t._v(" Processes")]),t._v(" "),e("p",[t._v("The processes a back-end supports may be offered by the clients as methods in its own scope. The method names should follow the process names, but the conventions listed above can be applied here as well, e.g. converting "),e("code",[t._v("filter_bands")]),t._v(" to "),e("code",[t._v("filterBands")]),t._v(". As parameters have no natural or technical ordering in the JSON objects, clients must come up with a reasonable ordering of parameters if required. This could be inspired by existing clients. The way of building a process graph from processes heavily depends on the technical capabilities of the programming language. Therefore it may differ between the client libraries. Follow the best practices of the programming language, e.g. support method chaining if possible.")]),t._v(" "),e("h2",{attrs:{id:"workflow-example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#workflow-example"}},[t._v("#")]),t._v(" Workflow example")]),t._v(" "),e("p",[t._v("Some simplified example workflows using different programming styles are listed below. The following steps are executed:")]),t._v(" "),e("ol",[e("li",[t._v("Loading the client library.")]),t._v(" "),e("li",[t._v("Connecting to a back-end and authenticating with username and password via OpenID Connect.")]),t._v(" "),e("li",[t._v("Requesting the capabilities and showing the implemented openEO version of the back-end.")]),t._v(" "),e("li",[t._v('Showing information about the "Sentinel-2A" collection.')]),t._v(" "),e("li",[t._v("Showing information about all processes supported by the back-end.")]),t._v(" "),e("li",[t._v("Building a simple process graph.")]),t._v(" "),e("li",[t._v("Creating a job.")]),t._v(" "),e("li",[t._v("Pushing the job to the processing queue.")]),t._v(" "),e("li",[t._v("After a while, showing the job details, e.g. checking the job status.")]),t._v(" "),e("li",[t._v("Once processing is finished, downloading the job results to the local directory "),e("code",[t._v("/tmp/job_results/")]),t._v(".")])]),t._v(" "),e("p",[t._v("Please note that the examples below do not comply to the latest process specification. They are meant to show the differences in client development, but are no working examples!")]),t._v(" "),e("h3",{attrs:{id:"r-functional-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#r-functional-style"}},[t._v("#")]),t._v(" R (functional style)")]),t._v(" "),e("div",{staticClass:"language-r extra-class"},[e("pre",{pre:!0,attrs:{class:"language-r"}},[e("code",[t._v("library"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token ellipsis"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" capabilities"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("api_version"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndescribe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlist_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Chain processes, implementation is up to the client")]),t._v("\n\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" createJob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nstart_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndescribe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndownload_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" folder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h3",{attrs:{id:"python-mixed-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#python-mixed-style"}},[t._v("#")]),t._v(" Python (mixed style)")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" openeo\n\ncon "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connect"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("authenticate_basic"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"username"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ncap "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("capabilities"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api_version"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("list_processes"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ndatacube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_collection"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Chain processes, implementation is up to the client")]),t._v("\n\njob "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datacube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("create_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("describe_job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("download_results"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("h3",{attrs:{id:"java-object-oriented-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java-object-oriented-style"}},[t._v("#")]),t._v(" Java (object oriented style)")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token import"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("org"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("openeo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),t._v(" obj "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OpenEO")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connection")]),t._v(" con "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" obj"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Capabilities")]),t._v(" cap "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apiVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeCollection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("listProcesses")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DataCube")]),t._v(" cube "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" con"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createDataCube")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Chain processes, implementation is up to the client")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Job")]),t._v(" job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cube"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("createJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("startJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("describeJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("downloadResults")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"php-procedural-style"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-procedural-style"}},[t._v("#")]),t._v(" PHP (procedural style)")]),t._v(" "),e("div",{staticClass:"language-php extra-class"},[e("pre",{pre:!0,attrs:{class:"language-php"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("require_once")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/path/to/openeo.php"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_connect")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"http://openeo.org"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilities")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_capabilities")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_api_version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$capabilites")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_collection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"Sentinel-2A"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_list_processes")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$datacube")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_datacube")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Chain processes, implementation is up to the client")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_create_job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$datacube")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_start_job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_describe_job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("openeo_download_results")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$job")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string double-quoted-string"}},[t._v('"/tmp/job_results/"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/83.58b5665f.js b/assets/js/83.2fdd1946.js similarity index 93% rename from assets/js/83.58b5665f.js rename to assets/js/83.2fdd1946.js index cd662d8a3..30d63cd1f 100644 --- a/assets/js/83.58b5665f.js +++ b/assets/js/83.2fdd1946.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{525:function(e,t,o){"use strict";o.r(t);var s=o(4),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"openeo-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-profiles"}},[e._v("#")]),e._v(" openEO Profiles")]),e._v(" "),t("p",[e._v("We've defined requirements grouped into a set of profiles for the openEO API and the openEO Processes. This helps to classify the implementation status of an openEO instance and gives recommendations to implementors which functionality to prioritize.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/api.html"}},[e._v("API Profiles")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/processes.html"}},[e._v("Process Profiles")])],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{526:function(e,t,o){"use strict";o.r(t);var s=o(4),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"openeo-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-profiles"}},[e._v("#")]),e._v(" openEO Profiles")]),e._v(" "),t("p",[e._v("We've defined requirements grouped into a set of profiles for the openEO API and the openEO Processes. This helps to classify the implementation status of an openEO instance and gives recommendations to implementors which functionality to prioritize.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/api.html"}},[e._v("API Profiles")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/developers/profiles/processes.html"}},[e._v("Process Profiles")])],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/84.2d980e77.js b/assets/js/84.45a846f1.js similarity index 99% rename from assets/js/84.2d980e77.js rename to assets/js/84.45a846f1.js index badf2ddef..5f3f4cff5 100644 --- a/assets/js/84.2d980e77.js +++ b/assets/js/84.45a846f1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{526:function(e,t,a){"use strict";a.r(t);var o=a(4),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"glossary"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#glossary"}},[e._v("#")]),e._v(" Glossary")]),e._v(" "),t("p",[e._v("This glossary introduces the major technical terms used in the openEO project.")]),e._v(" "),t("h2",{attrs:{id:"general-terms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-terms"}},[e._v("#")]),e._v(" General terms")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("EO")]),e._v(": Earth observation")]),e._v(" "),t("li",[t("strong",[e._v("API")]),e._v(": application programming interface ("),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Application_programming_interface",target:"_blank",rel:"noopener noreferrer"}},[e._v("wikipedia"),t("OutboundLink")],1),e._v("); a communication protocol between client and back-end")]),e._v(" "),t("li",[t("strong",[e._v("client")]),e._v(": software tool or environment that end-users directly interact with, e.g. R (RStudio), Python (Jupyter notebook), and JavaScript (web browser); R and Python are two major data science platforms; JavaScript is a major language for web development")]),e._v(" "),t("li",[t("strong",[e._v("(cloud) back-end")]),e._v(": server; computer infrastructure (one or more physical computers or virtual machines) used for storing EO data and processing it")]),e._v(" "),t("li",[t("strong",[e._v("big Earth observation cloud back-end")]),e._v(": server infrastructure where industry and researchers analyse large amounts of EO data")])]),e._v(" "),t("h2",{attrs:{id:"processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("process")]),e._v(" is an operation that performs a specific task on a set of parameters and returns a result. An example is computing a statistical operation, such as mean or median, on selected EO data. A process is similar to a function or method in programming languages.")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("pre-defined process")]),e._v(" is a process provided by the "),t("em",[e._v("back-end")]),e._v(", often one of the "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[e._v("ones centrally defined by openEO")]),e._v(".")],1),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("user-defined process")]),e._v(" is a process defined by the "),t("em",[e._v("user")]),e._v(". It can directly be part of another process graph or be stored as custom process on a back-end. Internally it is a "),t("em",[e._v("process graph")]),e._v(" with optional additional metadata.")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("process graph")]),e._v(" chains specific process calls from the set of pre-defined and user-defined processes together. A process graph itself is a (user-defined) process again. Similarly to scripts in the context of programming, process graphs organize and automate the execution of one or more processes that could alternatively be executed individually.")]),e._v(" "),t("h2",{attrs:{id:"eo-data-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eo-data-collections"}},[e._v("#")]),e._v(" EO data (Collections)")]),e._v(" "),t("p",[e._v("In our domain, different terms are used to describe EO data(sets). Within openEO, a "),t("strong",[e._v("granule")]),e._v(" (sometimes also called "),t("em",[e._v("item")]),e._v(" or "),t("em",[e._v("asset")]),e._v(" in the specification) typically refers to a limited area and a single overpass leading to a very short observation period (seconds) or a temporal aggregation of such data (e.g. for 16-day MODIS composites). A "),t("strong",[e._v("collection")]),e._v(" is a sequence of granules sharing the same product specification. It typically corresponds to the series of products derived from data acquired by a sensor on board a satellite and having the same mode of operation.")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"http://ceos.org/ourwork/workinggroups/wgiss/access/opensearch/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS OpenSearch Best Practice Document v1.2"),t("OutboundLink")],1),e._v(" lists the following synonyms used by other organizations:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("granule")]),e._v(": dataset (ESA, ISO 19115), granule (NASA), product (ESA, CNES), scene (JAXA)")]),e._v(" "),t("li",[t("strong",[e._v("collection")]),e._v(": dataset series (ESA, ISO 19115), collection (CNES, NASA), dataset (JAXA), product (JAXA)")])]),e._v(" "),t("p",[e._v("In openEO, a back-end offers a set of collections to be processed. All collections can be requested using a client and are described using the "),t("a",{attrs:{href:"https://github.com/radiantearth/stac-spec",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC (SpatioTemporal Asset Catalog) metadata specification"),t("OutboundLink")],1),e._v(" as STAC collections. A user can load (a subset of) a collection using a special process, which returns a (spatial) datacube. All further processing is then applied to the datacube on the back-end.")]),e._v(" "),t("h2",{attrs:{id:"spatial-datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spatial-datacubes"}},[e._v("#")]),e._v(" Spatial datacubes")]),e._v(" "),t("p",[e._v("A spatiotemporal datacube is a multidimensional array with one or more spatial or temporal dimensions.\nIn the EO domain, it is common to be implicit about the temporal dimension and just refer to them as spatial datacubes in short.\nSpecial cases are raster and "),t("a",{attrs:{href:"https://r-spatial.org/r/2022/09/12/vdc.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("vector datacubes"),t("OutboundLink")],1),e._v(".\nLearn more about datacubes in the "),t("a",{attrs:{href:"https://openeo.org/documentation/1.0/datacubes.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("datacube documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"vector-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vector-data"}},[e._v("#")]),e._v(" Vector data")]),e._v(" "),t("p",[e._v("In general, "),t("strong",[e._v("vector data")]),e._v(' represent specific things (also called "features") in a space, e.g. on the surface of the Earth.')]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("coordinate")]),e._v(" represents a specific point in space.")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("feature")]),e._v(' is a thing that usually has a geometry (e.g. the outline of an agricultural field, a forest or an urban area) and it may have additional properties assigned (e.g. a name, a color or a population).\nIn rare cases features may not have a geometry, which is often referred to as an "empty geometry".')]),e._v(" "),t("p",[t("strong",[e._v("Geometries")]),e._v(" consist of one or more coordinates that may be connected and then form a specific type of geometry, e.g. two points can be connected to a straight line and four straight lines can be connected to rectangle.")]),e._v(" "),t("p",[e._v("Commonly used types of geometries are:")]),e._v(" "),t("ul",[t("li",[e._v("Point")]),e._v(" "),t("li",[e._v("LineString (connected straight line pieces)")]),e._v(" "),t("li",[e._v("Polygon (connected straight line pieces forming a closed ring, possibly with holes - for example a triangle or rectangle)")])]),e._v(" "),t("p",[e._v('Multiple geometries of the same type can be combined into a group of geometries, e.g. a so-called "multi point" or "multi polygon".')]),e._v(" "),t("p",[e._v("Features and geometries are specified by the OGC in the "),t("a",{attrs:{href:"https://www.ogc.org/standards/sfa",target:"_blank",rel:"noopener noreferrer"}},[e._v("Simple Feature Access specification"),t("OutboundLink")],1),e._v(" (and ISO 19125). See the specification for more details.")]),e._v(" "),t("h2",{attrs:{id:"user-defined-function-udf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-function-udf"}},[e._v("#")]),e._v(" User-defined function (UDF)")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, or applied to a particular dimension or set of dimensions, allowing custom server-side calculations. See the section on "),t("RouterLink",{attrs:{to:"/documentation/1.0/udfs.html"}},[e._v("UDFs")]),e._v(" for more information.")],1),e._v(" "),t("h2",{attrs:{id:"data-processing-modes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-processing-modes"}},[e._v("#")]),e._v(" Data Processing modes")]),e._v(" "),t("p",[e._v("Processes can run in three different ways:")]),e._v(" "),t("ol",[t("li",[e._v("Results can be pre-computed by creating a "),t("em",[t("strong",[e._v("batch job")])]),e._v(". They are submitted to the back-end's processing system, but will remain inactive until explicitly put into the processing queue. They will run only once and store results after execution. Results can be downloaded. Batch jobs are typically time consuming and user interaction is not possible although log files are generated for them. This is the only mode that allows to get an estimate about time, volume and costs beforehand.")]),e._v(" "),t("li",[e._v("A more dynamic way of processing and accessing data is to create a "),t("strong",[e._v("secondary web service")]),e._v(". They allow web-based access using different protocols such as "),t("a",{attrs:{href:"http://www.opengeospatial.org/standards/wms",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WMS"),t("OutboundLink")],1),e._v(" (Open Geospatial Consortium Web Map Service), "),t("a",{attrs:{href:"http://www.opengeospatial.org/standards/wcs",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WCS"),t("OutboundLink")],1),e._v(" (Web Coverage Service) or "),t("a",{attrs:{href:"https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames",target:"_blank",rel:"noopener noreferrer"}},[e._v("XYZ tiles"),t("OutboundLink")],1),e._v(". These protocols usually allow users to change the viewing extent or level of detail (zoom level). Therefore, computations often run "),t("em",[e._v("on demand")]),e._v(" so that the requested data is calculated during the request. Back-ends should make sure to cache processed data to avoid additional/high costs and reduce waiting times for the user.")]),e._v(" "),t("li",[e._v("Processes can also be executed "),t("strong",[e._v("on-demand")]),e._v(" (i.e. synchronously). Results are delivered with the request itself and no job is created. Only lightweight computations, for example previews, should be executed using this approach as timeouts are to be expected for "),t("a",{attrs:{href:"https://www.pubnub.com/blog/2014-12-01-http-long-polling/",target:"_blank",rel:"noopener noreferrer"}},[e._v("long-polling HTTP requests"),t("OutboundLink")],1),e._v(".")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{527:function(e,t,a){"use strict";a.r(t);var o=a(4),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"glossary"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#glossary"}},[e._v("#")]),e._v(" Glossary")]),e._v(" "),t("p",[e._v("This glossary introduces the major technical terms used in the openEO project.")]),e._v(" "),t("h2",{attrs:{id:"general-terms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-terms"}},[e._v("#")]),e._v(" General terms")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("EO")]),e._v(": Earth observation")]),e._v(" "),t("li",[t("strong",[e._v("API")]),e._v(": application programming interface ("),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Application_programming_interface",target:"_blank",rel:"noopener noreferrer"}},[e._v("wikipedia"),t("OutboundLink")],1),e._v("); a communication protocol between client and back-end")]),e._v(" "),t("li",[t("strong",[e._v("client")]),e._v(": software tool or environment that end-users directly interact with, e.g. R (RStudio), Python (Jupyter notebook), and JavaScript (web browser); R and Python are two major data science platforms; JavaScript is a major language for web development")]),e._v(" "),t("li",[t("strong",[e._v("(cloud) back-end")]),e._v(": server; computer infrastructure (one or more physical computers or virtual machines) used for storing EO data and processing it")]),e._v(" "),t("li",[t("strong",[e._v("big Earth observation cloud back-end")]),e._v(": server infrastructure where industry and researchers analyse large amounts of EO data")])]),e._v(" "),t("h2",{attrs:{id:"processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("process")]),e._v(" is an operation that performs a specific task on a set of parameters and returns a result. An example is computing a statistical operation, such as mean or median, on selected EO data. A process is similar to a function or method in programming languages.")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("pre-defined process")]),e._v(" is a process provided by the "),t("em",[e._v("back-end")]),e._v(", often one of the "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[e._v("ones centrally defined by openEO")]),e._v(".")],1),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("user-defined process")]),e._v(" is a process defined by the "),t("em",[e._v("user")]),e._v(". It can directly be part of another process graph or be stored as custom process on a back-end. Internally it is a "),t("em",[e._v("process graph")]),e._v(" with optional additional metadata.")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("process graph")]),e._v(" chains specific process calls from the set of pre-defined and user-defined processes together. A process graph itself is a (user-defined) process again. Similarly to scripts in the context of programming, process graphs organize and automate the execution of one or more processes that could alternatively be executed individually.")]),e._v(" "),t("h2",{attrs:{id:"eo-data-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eo-data-collections"}},[e._v("#")]),e._v(" EO data (Collections)")]),e._v(" "),t("p",[e._v("In our domain, different terms are used to describe EO data(sets). Within openEO, a "),t("strong",[e._v("granule")]),e._v(" (sometimes also called "),t("em",[e._v("item")]),e._v(" or "),t("em",[e._v("asset")]),e._v(" in the specification) typically refers to a limited area and a single overpass leading to a very short observation period (seconds) or a temporal aggregation of such data (e.g. for 16-day MODIS composites). A "),t("strong",[e._v("collection")]),e._v(" is a sequence of granules sharing the same product specification. It typically corresponds to the series of products derived from data acquired by a sensor on board a satellite and having the same mode of operation.")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"http://ceos.org/ourwork/workinggroups/wgiss/access/opensearch/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS OpenSearch Best Practice Document v1.2"),t("OutboundLink")],1),e._v(" lists the following synonyms used by other organizations:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("granule")]),e._v(": dataset (ESA, ISO 19115), granule (NASA), product (ESA, CNES), scene (JAXA)")]),e._v(" "),t("li",[t("strong",[e._v("collection")]),e._v(": dataset series (ESA, ISO 19115), collection (CNES, NASA), dataset (JAXA), product (JAXA)")])]),e._v(" "),t("p",[e._v("In openEO, a back-end offers a set of collections to be processed. All collections can be requested using a client and are described using the "),t("a",{attrs:{href:"https://github.com/radiantearth/stac-spec",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC (SpatioTemporal Asset Catalog) metadata specification"),t("OutboundLink")],1),e._v(" as STAC collections. A user can load (a subset of) a collection using a special process, which returns a (spatial) datacube. All further processing is then applied to the datacube on the back-end.")]),e._v(" "),t("h2",{attrs:{id:"spatial-datacubes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spatial-datacubes"}},[e._v("#")]),e._v(" Spatial datacubes")]),e._v(" "),t("p",[e._v("A spatiotemporal datacube is a multidimensional array with one or more spatial or temporal dimensions.\nIn the EO domain, it is common to be implicit about the temporal dimension and just refer to them as spatial datacubes in short.\nSpecial cases are raster and "),t("a",{attrs:{href:"https://r-spatial.org/r/2022/09/12/vdc.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("vector datacubes"),t("OutboundLink")],1),e._v(".\nLearn more about datacubes in the "),t("a",{attrs:{href:"https://openeo.org/documentation/1.0/datacubes.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("datacube documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"vector-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vector-data"}},[e._v("#")]),e._v(" Vector data")]),e._v(" "),t("p",[e._v("In general, "),t("strong",[e._v("vector data")]),e._v(' represent specific things (also called "features") in a space, e.g. on the surface of the Earth.')]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("coordinate")]),e._v(" represents a specific point in space.")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("feature")]),e._v(' is a thing that usually has a geometry (e.g. the outline of an agricultural field, a forest or an urban area) and it may have additional properties assigned (e.g. a name, a color or a population).\nIn rare cases features may not have a geometry, which is often referred to as an "empty geometry".')]),e._v(" "),t("p",[t("strong",[e._v("Geometries")]),e._v(" consist of one or more coordinates that may be connected and then form a specific type of geometry, e.g. two points can be connected to a straight line and four straight lines can be connected to rectangle.")]),e._v(" "),t("p",[e._v("Commonly used types of geometries are:")]),e._v(" "),t("ul",[t("li",[e._v("Point")]),e._v(" "),t("li",[e._v("LineString (connected straight line pieces)")]),e._v(" "),t("li",[e._v("Polygon (connected straight line pieces forming a closed ring, possibly with holes - for example a triangle or rectangle)")])]),e._v(" "),t("p",[e._v('Multiple geometries of the same type can be combined into a group of geometries, e.g. a so-called "multi point" or "multi polygon".')]),e._v(" "),t("p",[e._v("Features and geometries are specified by the OGC in the "),t("a",{attrs:{href:"https://www.ogc.org/standards/sfa",target:"_blank",rel:"noopener noreferrer"}},[e._v("Simple Feature Access specification"),t("OutboundLink")],1),e._v(" (and ISO 19125). See the specification for more details.")]),e._v(" "),t("h2",{attrs:{id:"user-defined-function-udf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-function-udf"}},[e._v("#")]),e._v(" User-defined function (UDF)")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, or applied to a particular dimension or set of dimensions, allowing custom server-side calculations. See the section on "),t("RouterLink",{attrs:{to:"/documentation/1.0/udfs.html"}},[e._v("UDFs")]),e._v(" for more information.")],1),e._v(" "),t("h2",{attrs:{id:"data-processing-modes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-processing-modes"}},[e._v("#")]),e._v(" Data Processing modes")]),e._v(" "),t("p",[e._v("Processes can run in three different ways:")]),e._v(" "),t("ol",[t("li",[e._v("Results can be pre-computed by creating a "),t("em",[t("strong",[e._v("batch job")])]),e._v(". They are submitted to the back-end's processing system, but will remain inactive until explicitly put into the processing queue. They will run only once and store results after execution. Results can be downloaded. Batch jobs are typically time consuming and user interaction is not possible although log files are generated for them. This is the only mode that allows to get an estimate about time, volume and costs beforehand.")]),e._v(" "),t("li",[e._v("A more dynamic way of processing and accessing data is to create a "),t("strong",[e._v("secondary web service")]),e._v(". They allow web-based access using different protocols such as "),t("a",{attrs:{href:"http://www.opengeospatial.org/standards/wms",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WMS"),t("OutboundLink")],1),e._v(" (Open Geospatial Consortium Web Map Service), "),t("a",{attrs:{href:"http://www.opengeospatial.org/standards/wcs",target:"_blank",rel:"noopener noreferrer"}},[e._v("OGC WCS"),t("OutboundLink")],1),e._v(" (Web Coverage Service) or "),t("a",{attrs:{href:"https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames",target:"_blank",rel:"noopener noreferrer"}},[e._v("XYZ tiles"),t("OutboundLink")],1),e._v(". These protocols usually allow users to change the viewing extent or level of detail (zoom level). Therefore, computations often run "),t("em",[e._v("on demand")]),e._v(" so that the requested data is calculated during the request. Back-ends should make sure to cache processed data to avoid additional/high costs and reduce waiting times for the user.")]),e._v(" "),t("li",[e._v("Processes can also be executed "),t("strong",[e._v("on-demand")]),e._v(" (i.e. synchronously). Results are delivered with the request itself and no job is created. Only lightweight computations, for example previews, should be executed using this approach as timeouts are to be expected for "),t("a",{attrs:{href:"https://www.pubnub.com/blog/2014-12-01-http-long-polling/",target:"_blank",rel:"noopener noreferrer"}},[e._v("long-polling HTTP requests"),t("OutboundLink")],1),e._v(".")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/85.7aaec4ca.js b/assets/js/85.287bcd71.js similarity index 79% rename from assets/js/85.7aaec4ca.js rename to assets/js/85.287bcd71.js index 3611c7a11..d38538354 100644 --- a/assets/js/85.7aaec4ca.js +++ b/assets/js/85.287bcd71.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{527:function(t,s,e){"use strict";e.r(s);var n=e(4),o=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ProcessesSpec")],1)}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{530:function(t,s,e){"use strict";e.r(s);var n=e(4),o=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("ProcessesSpec")],1)}),[],!1,null,null,null);s.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/86.3b7f1c05.js b/assets/js/86.888a3275.js similarity index 99% rename from assets/js/86.3b7f1c05.js rename to assets/js/86.888a3275.js index 99c28a710..641b30400 100644 --- a/assets/js/86.3b7f1c05.js +++ b/assets/js/86.888a3275.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[86],{528:function(t,a,s){"use strict";s.r(a);var e=s(4),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"get-started-with-the-openeo-python-client-client-side-processing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-python-client-client-side-processing"}},[t._v("#")]),t._v(" Get started with the openEO Python Client Client Side Processing")]),t._v(" "),a("h2",{attrs:{id:"background"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[t._v("#")]),t._v(" Background")]),t._v(" "),a("p",[t._v("The client-side processing functionality allows to test and use openEO with its processes locally, i.e. without any connection to an openEO back-end.\nIt relies on the projects "),a("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx%3E",target:"_blank",rel:"noopener noreferrer"}},[t._v("openeo-pg-parser-networkx"),a("OutboundLink")],1),t._v(", which provides an openEO process graph parsing tool, and "),a("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[t._v("openeo-processes-dask"),a("OutboundLink")],1),t._v(", which provides an Xarray and Dask implementation of most openEO processes.")]),t._v(" "),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),a("p",[t._v("This feature requires "),a("code",[t._v("Python>=3.9")]),t._v(".")])]),t._v(" "),a("p",[t._v("The openEO Python client library can easily be installed with a tool like "),a("code",[t._v("pip")]),t._v(", for example:")]),t._v(" "),a("div",{staticClass:"language-shell script extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("pip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("localprocessing"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h2",{attrs:{id:"usage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),a("p",[t._v("Every openEO process graph relies on data which is typically provided by a cloud infrastructure (the openEO back-end).\nThe client-side processing adds the possibility to read and use local netCDFs, geoTIFFs, ZARR files, and remote STAC Collections or Items for your experiments.")]),t._v(" "),a("h3",{attrs:{id:"stac-collections-and-items"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stac-collections-and-items"}},[t._v("#")]),t._v(" STAC Collections and Items")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),a("p",[t._v("The provided examples using STAC rely on third party STAC Catalogs, we can't guarantee that the urls will remain valid.")])]),t._v(" "),a("p",[t._v("With the "),a("code",[t._v("load_stac")]),t._v(" process it's possible to load and use data provided by remote or local STAC Collections or Items.\nThe following code snippet loads Sentinel-2 L2A data from a public STAC Catalog, using specific spatial and temporal extent, band name and also properties for cloud coverage.")]),t._v(" "),a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("local "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" LocalConnection\nlocal_conn "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" LocalConnection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nurl "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"')]),t._v("\nspatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("46")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("47")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-01-01"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-06-15"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nproperties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eo:cloud_cover"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("dict")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ns2_cube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" local_conn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_stac"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("url"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("properties"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ns2_cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("When calling the "),a("code",[t._v(".execute()")]),t._v(" method on a "),a("code",[t._v("Datacube")]),t._v(" created from a "),a("code",[t._v("LocalConnection")]),t._v(", an "),a("code",[t._v("xarray.DataArray")]),t._v(" object containing dask arrays is returned:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v(" >>> s2_cube.execute()\n \n dask.array\n Coordinates: (12/53)\n * time (time) datetime64[ns] 2019-01-02...\n id (time) >> # Check if the data is loaded correctly\n>>> s2_datacube.execute()\n\ndask.array\nCoordinates:\n * t (t) datetime64[ns] 2022-06-02 2022-06-05 ... 2022-06-27 2022-06-30\n * x (x) float64 6.75e+05 6.75e+05 6.75e+05 ... 6.843e+05 6.843e+05\n * y (y) float64 5.155e+06 5.155e+06 5.155e+06 ... 5.148e+06 5.148e+06\n crs |S1 ...\n * bands (bands) object 'B04' 'B03' 'B02' 'B08' 'SCL'\nAttributes:\n Conventions: CF-1.9\n institution: openEO platform - Geotrellis backend: 0.9.5a1\n description:\n title:\n")])])]),a("p",[t._v("As you can see in the previous example, we are using a call to "),a("code",[t._v(".execute()")]),t._v(" which will execute locally the generated openEO process graph.\nIn this case, the process graph consist only in a single "),a("code",[t._v("load_collection")]),t._v(", which performs lazy loading of the data. With this first step you can check if the data is being read correctly by openEO.")]),t._v(" "),a("p",[t._v("Looking at the metadata of this netCDF sample, we can see that it contains the bands B04, B03, B02, B08 and SCL.\nAdditionally, we also see that it is composed by more than one element in time and that it covers the month of June 2022.")]),t._v(" "),a("p",[t._v("We can now do a simple processing for demo purposes, let's compute the median NDVI in time and visualize the result:")]),t._v(" "),a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("b04 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nb08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_median "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"median"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult_ndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_median"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult_ndvi"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("plot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cmap"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Greens"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("We can perform the same example using data provided by STAC Collection:")]),t._v(" "),a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("local "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" LocalConnection\nlocal_conn "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" LocalConnection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nurl "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"')]),t._v("\nspatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.52")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.46")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.25")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-06-01"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-06-30"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nproperties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eo:cloud_cover"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("dict")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ns2_datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" local_conn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_stac"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n url"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("url"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("properties"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nb04 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nb08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_median "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"median"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult_ndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_median"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"client-side-processing-example-notebooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#client-side-processing-example-notebooks"}},[t._v("#")]),t._v(" Client-Side Processing Example Notebooks")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks/Client_Side_Processing",target:"_blank",rel:"noopener noreferrer"}},[t._v("From the openEO Python Client repo"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/EO-College/cubes-and-clouds/blob/main/lectures/3.1_data_processing/exercises/_alternatives/31_data_processing_stac.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("From the Cubes and Clouds repo"),a("OutboundLink")],1)])]),t._v(" "),a("h2",{attrs:{id:"additional-information"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),a("p",[t._v("Additional information and resources about the openEO Python Client Library:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openEO Python Client Library Documentation"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Python scripts"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Jupyter Notebooks"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository on GitHub"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[86],{531:function(t,a,s){"use strict";s.r(a);var e=s(4),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"get-started-with-the-openeo-python-client-client-side-processing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#get-started-with-the-openeo-python-client-client-side-processing"}},[t._v("#")]),t._v(" Get started with the openEO Python Client Client Side Processing")]),t._v(" "),a("h2",{attrs:{id:"background"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[t._v("#")]),t._v(" Background")]),t._v(" "),a("p",[t._v("The client-side processing functionality allows to test and use openEO with its processes locally, i.e. without any connection to an openEO back-end.\nIt relies on the projects "),a("a",{attrs:{href:"https://github.com/Open-EO/openeo-pg-parser-networkx%3E",target:"_blank",rel:"noopener noreferrer"}},[t._v("openeo-pg-parser-networkx"),a("OutboundLink")],1),t._v(", which provides an openEO process graph parsing tool, and "),a("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes-dask",target:"_blank",rel:"noopener noreferrer"}},[t._v("openeo-processes-dask"),a("OutboundLink")],1),t._v(", which provides an Xarray and Dask implementation of most openEO processes.")]),t._v(" "),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),a("p",[t._v("This feature requires "),a("code",[t._v("Python>=3.9")]),t._v(".")])]),t._v(" "),a("p",[t._v("The openEO Python client library can easily be installed with a tool like "),a("code",[t._v("pip")]),t._v(", for example:")]),t._v(" "),a("div",{staticClass:"language-shell script extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("pip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("localprocessing"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h2",{attrs:{id:"usage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),a("p",[t._v("Every openEO process graph relies on data which is typically provided by a cloud infrastructure (the openEO back-end).\nThe client-side processing adds the possibility to read and use local netCDFs, geoTIFFs, ZARR files, and remote STAC Collections or Items for your experiments.")]),t._v(" "),a("h3",{attrs:{id:"stac-collections-and-items"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stac-collections-and-items"}},[t._v("#")]),t._v(" STAC Collections and Items")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Important")]),t._v(" "),a("p",[t._v("The provided examples using STAC rely on third party STAC Catalogs, we can't guarantee that the urls will remain valid.")])]),t._v(" "),a("p",[t._v("With the "),a("code",[t._v("load_stac")]),t._v(" process it's possible to load and use data provided by remote or local STAC Collections or Items.\nThe following code snippet loads Sentinel-2 L2A data from a public STAC Catalog, using specific spatial and temporal extent, band name and also properties for cloud coverage.")]),t._v(" "),a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("local "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" LocalConnection\nlocal_conn "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" LocalConnection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nurl "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"')]),t._v("\nspatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("46")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("47")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-01-01"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-06-15"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nproperties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eo:cloud_cover"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("dict")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ns2_cube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" local_conn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_stac"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("url"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("properties"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ns2_cube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("When calling the "),a("code",[t._v(".execute()")]),t._v(" method on a "),a("code",[t._v("Datacube")]),t._v(" created from a "),a("code",[t._v("LocalConnection")]),t._v(", an "),a("code",[t._v("xarray.DataArray")]),t._v(" object containing dask arrays is returned:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v(" >>> s2_cube.execute()\n \n dask.array\n Coordinates: (12/53)\n * time (time) datetime64[ns] 2019-01-02...\n id (time) >> # Check if the data is loaded correctly\n>>> s2_datacube.execute()\n\ndask.array\nCoordinates:\n * t (t) datetime64[ns] 2022-06-02 2022-06-05 ... 2022-06-27 2022-06-30\n * x (x) float64 6.75e+05 6.75e+05 6.75e+05 ... 6.843e+05 6.843e+05\n * y (y) float64 5.155e+06 5.155e+06 5.155e+06 ... 5.148e+06 5.148e+06\n crs |S1 ...\n * bands (bands) object 'B04' 'B03' 'B02' 'B08' 'SCL'\nAttributes:\n Conventions: CF-1.9\n institution: openEO platform - Geotrellis backend: 0.9.5a1\n description:\n title:\n")])])]),a("p",[t._v("As you can see in the previous example, we are using a call to "),a("code",[t._v(".execute()")]),t._v(" which will execute locally the generated openEO process graph.\nIn this case, the process graph consist only in a single "),a("code",[t._v("load_collection")]),t._v(", which performs lazy loading of the data. With this first step you can check if the data is being read correctly by openEO.")]),t._v(" "),a("p",[t._v("Looking at the metadata of this netCDF sample, we can see that it contains the bands B04, B03, B02, B08 and SCL.\nAdditionally, we also see that it is composed by more than one element in time and that it covers the month of June 2022.")]),t._v(" "),a("p",[t._v("We can now do a simple processing for demo purposes, let's compute the median NDVI in time and visualize the result:")]),t._v(" "),a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[t._v("b04 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B04"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nb08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"B08"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_median "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"t"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"median"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult_ndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_median"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult_ndvi"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("plot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("imshow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cmap"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Greens"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("We can perform the same example using data provided by STAC Collection:")]),t._v(" "),a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" openeo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("local "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" LocalConnection\nlocal_conn "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" LocalConnection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nurl "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"')]),t._v("\nspatial_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"east"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"north"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.52")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"south"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("46.46")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"west"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.25")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ntemporal_extent "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-06-01"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2022-06-30"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nbands "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nproperties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eo:cloud_cover"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("dict")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\ns2_datacube "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" local_conn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load_stac"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n url"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("url"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n spatial_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("spatial_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n temporal_extent"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("temporal_extent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bands"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("bands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("properties"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nb04 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"red"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nb08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" s2_datacube"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("band"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nir"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("b08 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" b04"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nndvi_median "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("reduce_dimension"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dimension"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" reducer"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"median"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nresult_ndvi "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ndvi_median"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("execute"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"client-side-processing-example-notebooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#client-side-processing-example-notebooks"}},[t._v("#")]),t._v(" Client-Side Processing Example Notebooks")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks/Client_Side_Processing",target:"_blank",rel:"noopener noreferrer"}},[t._v("From the openEO Python Client repo"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/EO-College/cubes-and-clouds/blob/main/lectures/3.1_data_processing/exercises/_alternatives/31_data_processing_stac.ipynb",target:"_blank",rel:"noopener noreferrer"}},[t._v("From the Cubes and Clouds repo"),a("OutboundLink")],1)])]),t._v(" "),a("h2",{attrs:{id:"additional-information"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[t._v("#")]),t._v(" Additional Information")]),t._v(" "),a("p",[t._v("Additional information and resources about the openEO Python Client Library:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official openEO Python Client Library Documentation"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Python scripts"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/tree/master/examples/notebooks",target:"_blank",rel:"noopener noreferrer"}},[t._v("Example Jupyter Notebooks"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Repository on GitHub"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/87.ca238b9d.js b/assets/js/87.d0ccee79.js similarity index 99% rename from assets/js/87.ca238b9d.js rename to assets/js/87.d0ccee79.js index 45aeda13f..dbdf48e48 100644 --- a/assets/js/87.ca238b9d.js +++ b/assets/js/87.d0ccee79.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{533:function(e,t,s){"use strict";s.r(t);var n=s(4),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"user-defined-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[e._v("#")]),e._v(" User-defined functions")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, allowing custom calculations on server-side data that are not (easily) covered with "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[e._v("pre-defined processes")]),e._v(" or user-defined processes. While openEO UDFs are in principle language-agnostic, we currently implement UDFs for Python and R.")],1),e._v(" "),t("h2",{attrs:{id:"users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#users"}},[e._v("#")]),e._v(" Users")]),e._v(" "),t("p",[e._v("You can run UDFs with any client (including JavaScript and Web Editor), but the code you can execute on the server will be limited to Python and R.\nAll openEO clients allow to run UDFs via the pre-defined process "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf"}},[t("code",[e._v("run_udf")])]),e._v(" if the back-end implements UDFs. You can check the "),t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),t("OutboundLink")],1),e._v(" for back-ends that support user-defined functions. There's also "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf_externally"}},[t("code",[e._v("run_udf_externally")])]),e._v(" if you want to host UDFs yourself (see back-end instructions below), but the process is still experimental and not widely supported yet. If we refer to "),t("code",[e._v("run_udf")]),e._v(" below and the back-end supports it, you can also use "),t("code",[e._v("run_udf_externally")]),e._v(" without it being explicitly mentioned.")],1),e._v(" "),t("p",[e._v("As data cubes can be very large, the back-end may only be able to run your code on a smaller chunk of the whole cube. So you need to help the server a bit, by designing your code to work on smaller piece of data. This can be done by using data cube processes that run the UDF on smaller chunks of the data. There are a number of pre-defined processes that can run UDFs on such chunks, for example:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#aggregate_spatial"}},[t("code",[e._v("aggregate_spatial")])]),e._v(": Reduces pixels within geometries to a single value using an UDF")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply"}},[t("code",[e._v("apply")])]),e._v(": Applies an UDF to each pixel (it might also be slow to make the chunks too small though)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply_dimension"}},[t("code",[e._v("apply_dimension")])]),e._v(": Applies an UDF to all pixels along a dimension, without changing the number of values")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply_neighborhood"}},[t("code",[e._v("apply_neighborhood")])]),e._v(": Applies an UDF to all pixels in a multidimensional neighborhood")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#merge_cubes"}},[t("code",[e._v("merge_cubes")])]),e._v(": Reduces overlapping pixels of the data cubes to a single value")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#reduce_dimension"}},[t("code",[e._v("reduce_dimension")])]),e._v(": Reduces values along a dimension using an UDF")],1)]),e._v(" "),t("p",[e._v("There are more processes that accept and run a sub-process. Each of them can also be used to run UDFs.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("Not all functions will require you to write a UDF. For instance, if you want to take the absolute value of your data cube, you can simply "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply"}},[t("code",[e._v("apply")])]),e._v(" the predefined "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#absolute"}},[t("code",[e._v("absolute")])]),e._v(") process. In fact, it is recommended to try and use predefined functions first, as they can be more efficiently implemented.")],1)]),e._v(" "),t("p",[e._v("The following chapters have further information on UDF usage in the openEO clients:")]),e._v(" "),t("h3",{attrs:{id:"javascript"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#javascript"}},[e._v("#")]),e._v(" JavaScript")]),e._v(" "),t("p",[e._v("The easiest way to run UDFs in the JavaScript client is to use the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Builder.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("process builder"),t("OutboundLink")],1),e._v(". You can use the builder to execute the "),t("code",[e._v("run_udf")]),e._v(" process. A simple example:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Connect to the back-end first and store the connection in the variable `con`...")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Discover UDF runtimes")]),e._v("\nconsole"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("log")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("await")]),e._v(" con"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("listUdfRuntimes")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Upload a UDF file to the server as udf.py, the source can only be a local path in a NodeJS environment")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("await")]),e._v(" con"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("uploadFile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'/home/user/myudf.py'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'udf.py'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Create a process builder")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("var")]),e._v(" builder "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("await")]),e._v(" con"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("buildProcess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Load some data from the back-end")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("var")]),e._v(" datacube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" builder"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("load_collection")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Sentinel-2"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("null")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2018"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2019"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Create a sub-process that runs a UDF")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("var")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function-variable function"}},[e._v("udfProcess")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("function")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token parameter"}},[e._v("data")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// This assumes that a file udf.py with the Python UDF code has been uploaded to the server before, you can also directly insert the UDF code instead. ")]),e._v("\n\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// You need to replace `Python` and `3.7` with the respective runtime identifier and version as returned in UDF discovery")]),e._v("\n\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("return")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("run_udf")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"udf.py"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Python"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Call the UDF as part of the reduce_dimension process to reduce the bands to a single value")]),e._v("\ndatacube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" builder"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("reduce_dimension")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("datacube"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" udfProcess"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"bands"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Further process the data cube or save it using save_result...")]),e._v("\n")])])]),t("h3",{attrs:{id:"python"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#python"}},[e._v("#")]),e._v(" Python")]),e._v(" "),t("p",[e._v("The Python client has "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/udf.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("separate documentation on UDFs"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"qgis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#qgis"}},[e._v("#")]),e._v(" QGIS")]),e._v(" "),t("p",[e._v("QGIS doesn't natively support running UDFs yet, but you can use copy and paste user-defined processes that include UDFs.")]),e._v(" "),t("h3",{attrs:{id:"r"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r"}},[e._v("#")]),e._v(" R")]),e._v(" "),t("p",[e._v("There's no dedicated UDF documentation for R yet, but you can have a look at the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf#usage",target:"_blank",rel:"noopener noreferrer"}},[e._v("getting started guide and examples in the UDF server repository"),t("OutboundLink")],1),e._v(" for now.")]),e._v(" "),t("h3",{attrs:{id:"web-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#web-editor"}},[e._v("#")]),e._v(" Web Editor")]),e._v(" "),t("p",[e._v("Running UDFs in the Web Editor just requires you to drag the "),t("code",[e._v("run_udf")]),e._v(" process into the model builder. Afterwards you can edit the process parameters to your needs. You have to set the environment / programming language to run the UDF with and then you can either directly program a UDF in the code editor or select an UDF file you have previously uploaded to the user workspace.")]),e._v(" "),t("h2",{attrs:{id:"back-ends"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#back-ends"}},[e._v("#")]),e._v(" Back-ends")]),e._v(" "),t("p",[e._v("If you'd like to offer user-defined functions for your users, you need to implement either the process "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf"}},[t("code",[e._v("run_udf")])]),e._v(" or "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf_externally"}},[t("code",[e._v("run_udf_externally")])]),e._v(" (or both). Both usually require you to access UDF servers via the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/api_docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF API"),t("OutboundLink")],1),e._v(". For the process "),t("code",[e._v("run_udf")]),e._v(" you may bypass the API and exchange data directly between the openEO back-end and the openEO UDF servers for performance reasons.")],1),e._v(" "),t("p",[t("code",[e._v("run_udf")]),e._v(" allows users to run their code on your infrastructure. This can be done using one of the UDF server implementations in "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("R"),t("OutboundLink")],1),e._v(". Please note that both UDF servers are "),t("strong",[e._v("drafts")]),e._v(" and still need work to improve performance and make them secure! This is not yet an out-of-the-box solution for running UDFs securely and fast.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{535:function(e,t,s){"use strict";s.r(t);var n=s(4),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"user-defined-functions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions"}},[e._v("#")]),e._v(" User-defined functions")]),e._v(" "),t("p",[e._v("The abbreviation "),t("strong",[e._v("UDF")]),e._v(" stands for "),t("strong",[e._v("user-defined function")]),e._v(". With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, allowing custom calculations on server-side data that are not (easily) covered with "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html"}},[e._v("pre-defined processes")]),e._v(" or user-defined processes. While openEO UDFs are in principle language-agnostic, we currently implement UDFs for Python and R.")],1),e._v(" "),t("h2",{attrs:{id:"users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#users"}},[e._v("#")]),e._v(" Users")]),e._v(" "),t("p",[e._v("You can run UDFs with any client (including JavaScript and Web Editor), but the code you can execute on the server will be limited to Python and R.\nAll openEO clients allow to run UDFs via the pre-defined process "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf"}},[t("code",[e._v("run_udf")])]),e._v(" if the back-end implements UDFs. You can check the "),t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),t("OutboundLink")],1),e._v(" for back-ends that support user-defined functions. There's also "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf_externally"}},[t("code",[e._v("run_udf_externally")])]),e._v(" if you want to host UDFs yourself (see back-end instructions below), but the process is still experimental and not widely supported yet. If we refer to "),t("code",[e._v("run_udf")]),e._v(" below and the back-end supports it, you can also use "),t("code",[e._v("run_udf_externally")]),e._v(" without it being explicitly mentioned.")],1),e._v(" "),t("p",[e._v("As data cubes can be very large, the back-end may only be able to run your code on a smaller chunk of the whole cube. So you need to help the server a bit, by designing your code to work on smaller piece of data. This can be done by using data cube processes that run the UDF on smaller chunks of the data. There are a number of pre-defined processes that can run UDFs on such chunks, for example:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#aggregate_spatial"}},[t("code",[e._v("aggregate_spatial")])]),e._v(": Reduces pixels within geometries to a single value using an UDF")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply"}},[t("code",[e._v("apply")])]),e._v(": Applies an UDF to each pixel (it might also be slow to make the chunks too small though)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply_dimension"}},[t("code",[e._v("apply_dimension")])]),e._v(": Applies an UDF to all pixels along a dimension, without changing the number of values")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply_neighborhood"}},[t("code",[e._v("apply_neighborhood")])]),e._v(": Applies an UDF to all pixels in a multidimensional neighborhood")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#merge_cubes"}},[t("code",[e._v("merge_cubes")])]),e._v(": Reduces overlapping pixels of the data cubes to a single value")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#reduce_dimension"}},[t("code",[e._v("reduce_dimension")])]),e._v(": Reduces values along a dimension using an UDF")],1)]),e._v(" "),t("p",[e._v("There are more processes that accept and run a sub-process. Each of them can also be used to run UDFs.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("Not all functions will require you to write a UDF. For instance, if you want to take the absolute value of your data cube, you can simply "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#apply"}},[t("code",[e._v("apply")])]),e._v(" the predefined "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#absolute"}},[t("code",[e._v("absolute")])]),e._v(") process. In fact, it is recommended to try and use predefined functions first, as they can be more efficiently implemented.")],1)]),e._v(" "),t("p",[e._v("The following chapters have further information on UDF usage in the openEO clients:")]),e._v(" "),t("h3",{attrs:{id:"javascript"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#javascript"}},[e._v("#")]),e._v(" JavaScript")]),e._v(" "),t("p",[e._v("The easiest way to run UDFs in the JavaScript client is to use the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-js-client/latest/Builder.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("process builder"),t("OutboundLink")],1),e._v(". You can use the builder to execute the "),t("code",[e._v("run_udf")]),e._v(" process. A simple example:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Connect to the back-end first and store the connection in the variable `con`...")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Discover UDF runtimes")]),e._v("\nconsole"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("log")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("await")]),e._v(" con"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("listUdfRuntimes")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Upload a UDF file to the server as udf.py, the source can only be a local path in a NodeJS environment")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("await")]),e._v(" con"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("uploadFile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'/home/user/myudf.py'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'udf.py'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Create a process builder")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("var")]),e._v(" builder "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("await")]),e._v(" con"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("buildProcess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Load some data from the back-end")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("var")]),e._v(" datacube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" builder"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("load_collection")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Sentinel-2"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("null")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2018"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2019"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Create a sub-process that runs a UDF")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("var")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function-variable function"}},[e._v("udfProcess")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("function")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token parameter"}},[e._v("data")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// This assumes that a file udf.py with the Python UDF code has been uploaded to the server before, you can also directly insert the UDF code instead. ")]),e._v("\n\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// You need to replace `Python` and `3.7` with the respective runtime identifier and version as returned in UDF discovery")]),e._v("\n\t"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("return")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("this")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("run_udf")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"udf.py"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Python"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Call the UDF as part of the reduce_dimension process to reduce the bands to a single value")]),e._v("\ndatacube "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" builder"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("reduce_dimension")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("datacube"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" udfProcess"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"bands"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Further process the data cube or save it using save_result...")]),e._v("\n")])])]),t("h3",{attrs:{id:"python"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#python"}},[e._v("#")]),e._v(" Python")]),e._v(" "),t("p",[e._v("The Python client has "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/udf.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("separate documentation on UDFs"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"qgis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#qgis"}},[e._v("#")]),e._v(" QGIS")]),e._v(" "),t("p",[e._v("QGIS doesn't natively support running UDFs yet, but you can use copy and paste user-defined processes that include UDFs.")]),e._v(" "),t("h3",{attrs:{id:"r"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r"}},[e._v("#")]),e._v(" R")]),e._v(" "),t("p",[e._v("There's no dedicated UDF documentation for R yet, but you can have a look at the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf#usage",target:"_blank",rel:"noopener noreferrer"}},[e._v("getting started guide and examples in the UDF server repository"),t("OutboundLink")],1),e._v(" for now.")]),e._v(" "),t("h3",{attrs:{id:"web-editor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#web-editor"}},[e._v("#")]),e._v(" Web Editor")]),e._v(" "),t("p",[e._v("Running UDFs in the Web Editor just requires you to drag the "),t("code",[e._v("run_udf")]),e._v(" process into the model builder. Afterwards you can edit the process parameters to your needs. You have to set the environment / programming language to run the UDF with and then you can either directly program a UDF in the code editor or select an UDF file you have previously uploaded to the user workspace.")]),e._v(" "),t("h2",{attrs:{id:"back-ends"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#back-ends"}},[e._v("#")]),e._v(" Back-ends")]),e._v(" "),t("p",[e._v("If you'd like to offer user-defined functions for your users, you need to implement either the process "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf"}},[t("code",[e._v("run_udf")])]),e._v(" or "),t("RouterLink",{attrs:{to:"/documentation/1.0/processes.html#run_udf_externally"}},[t("code",[e._v("run_udf_externally")])]),e._v(" (or both). Both usually require you to access UDF servers via the "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-udf/api_docs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("UDF API"),t("OutboundLink")],1),e._v(". For the process "),t("code",[e._v("run_udf")]),e._v(" you may bypass the API and exchange data directly between the openEO back-end and the openEO UDF servers for performance reasons.")],1),e._v(" "),t("p",[t("code",[e._v("run_udf")]),e._v(" allows users to run their code on your infrastructure. This can be done using one of the UDF server implementations in "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-udf",target:"_blank",rel:"noopener noreferrer"}},[e._v("R"),t("OutboundLink")],1),e._v(". Please note that both UDF servers are "),t("strong",[e._v("drafts")]),e._v(" and still need work to improve performance and make them secure! This is not yet an out-of-the-box solution for running UDFs securely and fast.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/88.98123f03.js b/assets/js/88.92a50275.js similarity index 97% rename from assets/js/88.98123f03.js rename to assets/js/88.92a50275.js index b414210ba..2b10bb7af 100644 --- a/assets/js/88.98123f03.js +++ b/assets/js/88.92a50275.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{534:function(e,t,o){"use strict";o.r(t);var n=o(4),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contributor-code-of-conduct"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contributor-code-of-conduct"}},[e._v("#")]),e._v(" Contributor Code of Conduct")]),e._v(" "),t("p",[e._v("As contributors and maintainers of this project, we pledge to respect all people who\ncontribute through reporting issues, posting feature requests, updating documentation,\nsubmitting pull requests or patches, and other activities.")]),e._v(" "),t("p",[e._v("We are committed to making participation in this project a harassment-free experience for\neveryone, regardless of level of experience, gender, gender identity and expression,\nsexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.")]),e._v(" "),t("p",[e._v("Examples of unacceptable behavior by participants include the use of sexual language or\nimagery, derogatory comments or personal attacks, trolling, public or private harassment,\ninsults, or other unprofessional conduct.")]),e._v(" "),t("p",[e._v("Project maintainers have the right and responsibility to remove, edit, or reject comments,\ncommits, code, wiki edits, issues, and other contributions that are not aligned to this\nCode of Conduct. Project maintainers who do not follow the Code of Conduct may be removed\nfrom the project team.")]),e._v(" "),t("p",[e._v("Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by\nopening an issue or contacting one or more of the project maintainers.")]),e._v(" "),t("p",[e._v("This Code of Conduct is adapted from the "),t("a",{attrs:{href:"http://contributor-covenant.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Contributor Covenant"),t("OutboundLink")],1),e._v(", version 1.0.0, available at\n"),t("a",{attrs:{href:"http://contributor-covenant.org/version/1/0/0/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://contributor-covenant.org/version/1/0/0/"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{536:function(e,t,o){"use strict";o.r(t);var n=o(4),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contributor-code-of-conduct"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contributor-code-of-conduct"}},[e._v("#")]),e._v(" Contributor Code of Conduct")]),e._v(" "),t("p",[e._v("As contributors and maintainers of this project, we pledge to respect all people who\ncontribute through reporting issues, posting feature requests, updating documentation,\nsubmitting pull requests or patches, and other activities.")]),e._v(" "),t("p",[e._v("We are committed to making participation in this project a harassment-free experience for\neveryone, regardless of level of experience, gender, gender identity and expression,\nsexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.")]),e._v(" "),t("p",[e._v("Examples of unacceptable behavior by participants include the use of sexual language or\nimagery, derogatory comments or personal attacks, trolling, public or private harassment,\ninsults, or other unprofessional conduct.")]),e._v(" "),t("p",[e._v("Project maintainers have the right and responsibility to remove, edit, or reject comments,\ncommits, code, wiki edits, issues, and other contributions that are not aligned to this\nCode of Conduct. Project maintainers who do not follow the Code of Conduct may be removed\nfrom the project team.")]),e._v(" "),t("p",[e._v("Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by\nopening an issue or contacting one or more of the project maintainers.")]),e._v(" "),t("p",[e._v("This Code of Conduct is adapted from the "),t("a",{attrs:{href:"http://contributor-covenant.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Contributor Covenant"),t("OutboundLink")],1),e._v(", version 1.0.0, available at\n"),t("a",{attrs:{href:"http://contributor-covenant.org/version/1/0/0/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://contributor-covenant.org/version/1/0/0/"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/89.44d8e1da.js b/assets/js/89.144159fa.js similarity index 99% rename from assets/js/89.44d8e1da.js rename to assets/js/89.144159fa.js index 14ffcae5a..92627ba6a 100644 --- a/assets/js/89.44d8e1da.js +++ b/assets/js/89.144159fa.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{535:function(e,t,o){"use strict";o.r(t);var n=o(4),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"software-development-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-development-guidelines"}},[e._v("#")]),e._v(" Software Development Guidelines")]),e._v(" "),t("p",[e._v("This document describes guidelines for software developers, written for the "),t("a",{attrs:{href:"http://openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO"),t("OutboundLink")],1),e._v(" project.\nSince the openEO infrastructure encompasses several programming languages and software environments, this document does not prescribe particular tools or platforms but rather focuses on general principles and methods behind them.")]),e._v(" "),t("ol",[t("li",[e._v("License: all software developed in the openEO project and published on the "),t("a",{attrs:{href:"http://github.com/open-eo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO GitHub"),t("OutboundLink")],1),e._v(" organisation shall be licensed under the "),t("a",{attrs:{href:"https://opensource.org/licenses/Apache-2.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("Apache 2.0 license"),t("OutboundLink")],1),e._v(". If software repositories deviate from this, or contain code or other artifacts that deviates from this, this shall be described in the "),t("code",[e._v("README.md")]),e._v(" file.")]),e._v(" "),t("li",[e._v("Location: Official openEO software is developed under the "),t("a",{attrs:{href:"https://github.com/open-EO/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO GitHub organisation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Proof-of-concept versus sustainable: each repository shall indicate its status: either "),t("em",[e._v("proof-of-concept")]),e._v(", or "),t("em",[e._v("sustainable")]),e._v(". Proof-of-concept code is meant to work but comes without quality assurance. Software repositories with proof-of-concept developments shall clearly say so in the first paragraph of the "),t("code",[e._v("README.md")]),e._v(" file.")]),e._v(" "),t("li",[e._v("Sustainable code should undergo standard "),t("a",{attrs:{href:"#software-quality-guidelines"}},[e._v("quality checks")]),e._v(", and point out its "),t("a",{attrs:{href:"#software-documentation-guidelines"}},[e._v("documentation")]),e._v(".")]),e._v(" "),t("li",[e._v("Sustainable code shall undergo "),t("a",{attrs:{href:"#software-review"}},[e._v("code review")]),e._v("; no direct commits to master; any commit shall come in the form of a PR, commit after review.")]),e._v(" "),t("li",[e._v("Sustainable code shall be written in a "),t("a",{attrs:{href:"#test-driven-development"}},[e._v("Test-driven manner")]),e._v(", and repositories shall at the top of their "),t("code",[e._v("README.md")]),e._v(" give indication of the degree to which code is covered by tests.")]),e._v(" "),t("li",[t("a",{attrs:{href:"#continuous-integration"}},[e._v("Continuous integration")]),e._v(" shall be used to indicate code currently passes its test on CI platforms.")]),e._v(" "),t("li",[e._v("A "),t("RouterLink",{attrs:{to:"/documentation/code-of-conduct.html"}},[e._v("Code of conduct")]),e._v(" describes the rules and constraints to developers and contributors.")],1),e._v(" "),t("li",[e._v("Version numbers of sustainable software releases shall follow "),t("a",{attrs:{href:"http://semver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Semantic Versioning 2.0.0"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"software-quality-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-quality-guidelines"}},[e._v("#")]),e._v(" Software quality guidelines")]),e._v(" "),t("ul",[t("li",[e._v("software shall be written in such a way that another person can understand its intention")]),e._v(" "),t("li",[e._v("comment lines shall be used sparsely, but effectively")]),e._v(" "),t("li",[e._v("reuse of unstable or esoteric libraries shall be avoided")])]),e._v(" "),t("h2",{attrs:{id:"software-documentation-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-documentation-guidelines"}},[e._v("#")]),e._v(" Software documentation guidelines")]),e._v(" "),t("p",[e._v("Software documentation shall include:")]),e._v(" "),t("ul",[t("li",[e._v("installation instructions")]),e._v(" "),t("li",[e._v("usage instructions")]),e._v(" "),t("li",[e._v("explain in detail the intention of the software")]),e._v(" "),t("li",[e._v("pointers to reference documents explaining overarching concepts")])]),e._v(" "),t("p",[e._v("Each repository's "),t("code",[e._v("README.md")]),e._v(" shall point to the documentation.")]),e._v(" "),t("p",[e._v("Reference documentation shall be written using well-defined reference documentation language, such as "),t("a",{attrs:{href:"https://tools.ietf.org/html/rfc2119",target:"_blank",rel:"noopener noreferrer"}},[e._v("RFC2119"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"http://arc42.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("arc42"),t("OutboundLink")],1),e._v(", and refer to the definitions used.")]),e._v(" "),t("h2",{attrs:{id:"software-review"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-review"}},[e._v("#")]),e._v(" Software review")]),e._v(" "),t("ul",[t("li",[e._v("sustainable software development shall take place by always having two persons involved in a change to the master branch: individuals push to branches, pull request indicate readiness to be taken up in the master branch, a second developer reviews the pull request before merging it into the master branch.")]),e._v(" "),t("li",[e._v("software review discussions shall be intelligible for external developers, and serve as implicit documentation of development decisions taken")])]),e._v(" "),t("h2",{attrs:{id:"test-driven-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#test-driven-development"}},[e._v("#")]),e._v(" Test-driven development")]),e._v(" "),t("p",[e._v("Software shall be developed in a test-driven fashion, meaning that while the code is written, tests are developed that verify, to a reasonable extent, the correctness of the code. Tools such as "),t("a",{attrs:{href:"https://codecov.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("codecov.io"),t("OutboundLink")],1),e._v(" to automatically indicate the amount of code covered by tests, and code that is not covered by tests shall be used in combination with a continuous integration framework.")]),e._v(" "),t("h2",{attrs:{id:"continuous-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#continuous-integration"}},[e._v("#")]),e._v(" Continuous integration")]),e._v(" "),t("p",[e._v("Repositories containing running software shall use an appropriate continuous integration platform, such as GitHub Actions or similar, to show whether the current build passes all checks. This helps understand contributors that the software passes tests on an independent platform, and may give insights in the way the software is compiled, deployed and tested.")]),e._v(" "),t("h2",{attrs:{id:"additional-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-guidelines"}},[e._v("#")]),e._v(" Additional guidelines")]),e._v(" "),t("p",[e._v("There is specific guideline for "),t("a",{attrs:{href:e.$site.themeConfig.docPath+"developers/clients/library-guidelines.html"}},[e._v("client library development")]),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{537:function(e,t,o){"use strict";o.r(t);var n=o(4),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"software-development-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-development-guidelines"}},[e._v("#")]),e._v(" Software Development Guidelines")]),e._v(" "),t("p",[e._v("This document describes guidelines for software developers, written for the "),t("a",{attrs:{href:"http://openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO"),t("OutboundLink")],1),e._v(" project.\nSince the openEO infrastructure encompasses several programming languages and software environments, this document does not prescribe particular tools or platforms but rather focuses on general principles and methods behind them.")]),e._v(" "),t("ol",[t("li",[e._v("License: all software developed in the openEO project and published on the "),t("a",{attrs:{href:"http://github.com/open-eo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO GitHub"),t("OutboundLink")],1),e._v(" organisation shall be licensed under the "),t("a",{attrs:{href:"https://opensource.org/licenses/Apache-2.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("Apache 2.0 license"),t("OutboundLink")],1),e._v(". If software repositories deviate from this, or contain code or other artifacts that deviates from this, this shall be described in the "),t("code",[e._v("README.md")]),e._v(" file.")]),e._v(" "),t("li",[e._v("Location: Official openEO software is developed under the "),t("a",{attrs:{href:"https://github.com/open-EO/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO GitHub organisation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Proof-of-concept versus sustainable: each repository shall indicate its status: either "),t("em",[e._v("proof-of-concept")]),e._v(", or "),t("em",[e._v("sustainable")]),e._v(". Proof-of-concept code is meant to work but comes without quality assurance. Software repositories with proof-of-concept developments shall clearly say so in the first paragraph of the "),t("code",[e._v("README.md")]),e._v(" file.")]),e._v(" "),t("li",[e._v("Sustainable code should undergo standard "),t("a",{attrs:{href:"#software-quality-guidelines"}},[e._v("quality checks")]),e._v(", and point out its "),t("a",{attrs:{href:"#software-documentation-guidelines"}},[e._v("documentation")]),e._v(".")]),e._v(" "),t("li",[e._v("Sustainable code shall undergo "),t("a",{attrs:{href:"#software-review"}},[e._v("code review")]),e._v("; no direct commits to master; any commit shall come in the form of a PR, commit after review.")]),e._v(" "),t("li",[e._v("Sustainable code shall be written in a "),t("a",{attrs:{href:"#test-driven-development"}},[e._v("Test-driven manner")]),e._v(", and repositories shall at the top of their "),t("code",[e._v("README.md")]),e._v(" give indication of the degree to which code is covered by tests.")]),e._v(" "),t("li",[t("a",{attrs:{href:"#continuous-integration"}},[e._v("Continuous integration")]),e._v(" shall be used to indicate code currently passes its test on CI platforms.")]),e._v(" "),t("li",[e._v("A "),t("RouterLink",{attrs:{to:"/documentation/code-of-conduct.html"}},[e._v("Code of conduct")]),e._v(" describes the rules and constraints to developers and contributors.")],1),e._v(" "),t("li",[e._v("Version numbers of sustainable software releases shall follow "),t("a",{attrs:{href:"http://semver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Semantic Versioning 2.0.0"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"software-quality-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-quality-guidelines"}},[e._v("#")]),e._v(" Software quality guidelines")]),e._v(" "),t("ul",[t("li",[e._v("software shall be written in such a way that another person can understand its intention")]),e._v(" "),t("li",[e._v("comment lines shall be used sparsely, but effectively")]),e._v(" "),t("li",[e._v("reuse of unstable or esoteric libraries shall be avoided")])]),e._v(" "),t("h2",{attrs:{id:"software-documentation-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-documentation-guidelines"}},[e._v("#")]),e._v(" Software documentation guidelines")]),e._v(" "),t("p",[e._v("Software documentation shall include:")]),e._v(" "),t("ul",[t("li",[e._v("installation instructions")]),e._v(" "),t("li",[e._v("usage instructions")]),e._v(" "),t("li",[e._v("explain in detail the intention of the software")]),e._v(" "),t("li",[e._v("pointers to reference documents explaining overarching concepts")])]),e._v(" "),t("p",[e._v("Each repository's "),t("code",[e._v("README.md")]),e._v(" shall point to the documentation.")]),e._v(" "),t("p",[e._v("Reference documentation shall be written using well-defined reference documentation language, such as "),t("a",{attrs:{href:"https://tools.ietf.org/html/rfc2119",target:"_blank",rel:"noopener noreferrer"}},[e._v("RFC2119"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"http://arc42.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("arc42"),t("OutboundLink")],1),e._v(", and refer to the definitions used.")]),e._v(" "),t("h2",{attrs:{id:"software-review"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#software-review"}},[e._v("#")]),e._v(" Software review")]),e._v(" "),t("ul",[t("li",[e._v("sustainable software development shall take place by always having two persons involved in a change to the master branch: individuals push to branches, pull request indicate readiness to be taken up in the master branch, a second developer reviews the pull request before merging it into the master branch.")]),e._v(" "),t("li",[e._v("software review discussions shall be intelligible for external developers, and serve as implicit documentation of development decisions taken")])]),e._v(" "),t("h2",{attrs:{id:"test-driven-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#test-driven-development"}},[e._v("#")]),e._v(" Test-driven development")]),e._v(" "),t("p",[e._v("Software shall be developed in a test-driven fashion, meaning that while the code is written, tests are developed that verify, to a reasonable extent, the correctness of the code. Tools such as "),t("a",{attrs:{href:"https://codecov.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("codecov.io"),t("OutboundLink")],1),e._v(" to automatically indicate the amount of code covered by tests, and code that is not covered by tests shall be used in combination with a continuous integration framework.")]),e._v(" "),t("h2",{attrs:{id:"continuous-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#continuous-integration"}},[e._v("#")]),e._v(" Continuous integration")]),e._v(" "),t("p",[e._v("Repositories containing running software shall use an appropriate continuous integration platform, such as GitHub Actions or similar, to show whether the current build passes all checks. This helps understand contributors that the software passes tests on an independent platform, and may give insights in the way the software is compiled, deployed and tested.")]),e._v(" "),t("h2",{attrs:{id:"additional-guidelines"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-guidelines"}},[e._v("#")]),e._v(" Additional guidelines")]),e._v(" "),t("p",[e._v("There is specific guideline for "),t("a",{attrs:{href:e.$site.themeConfig.docPath+"developers/clients/library-guidelines.html"}},[e._v("client library development")]),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/90.4f1ca23b.js b/assets/js/90.dcb0053c.js similarity index 99% rename from assets/js/90.4f1ca23b.js rename to assets/js/90.dcb0053c.js index 53fc49a5c..3ce679746 100644 --- a/assets/js/90.4f1ca23b.js +++ b/assets/js/90.dcb0053c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[90],{536:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"ieee-igarrs-2021-hd-3-hands-on-openeo-access-cloud-platforms-using-your-preferred-programming-language"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ieee-igarrs-2021-hd-3-hands-on-openeo-access-cloud-platforms-using-your-preferred-programming-language"}},[e._v("#")]),e._v(" IEEE IGARRS 2021 HD-3: Hands-on openEO: access cloud platforms using your preferred programming language")]),e._v(" "),t("p",[e._v("This page contains the agenda, and links to used material for the\nIEEE IGARRS 2021 openEO tutorial.")]),e._v(" "),t("p",[e._v("Details: "),t("a",{attrs:{href:"https://igarss2021.com/tutorials.php#tut9",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://igarss2021.com/tutorials.php#tut9"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"agenda"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#agenda"}},[e._v("#")]),e._v(" Agenda")]),e._v(" "),t("ul",[t("li",[e._v("14:00-14:20: Introduction to openEO (Pieter Kempeneers - JRC)")]),e._v(" "),t("li",[e._v("14:20-14:30: Q&A")]),e._v(" "),t("li",[e._v("14:30-15:30: Python client (VITO) (Jeroen Dries - VITO)")]),e._v(" "),t("li",[e._v("15:30-16:15: R client (WUR) (Dainius Masiliunas - WUR)")]),e._v(" "),t("li",[e._v("16:15-16:30: Break")]),e._v(" "),t("li",[e._v("16:30-16:45: openEO UIs (Jeroen Dries - VITO)")]),e._v(" "),t("li",[e._v("16:45-17:15: Use case demo (Jeroen Dries - VITO)")]),e._v(" "),t("li",[e._v("17:15-18:00: Q&A")])]),e._v(" "),t("h2",{attrs:{id:"python-client"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#python-client"}},[e._v("#")]),e._v(" Python client")]),e._v(" "),t("h3",{attrs:{id:"logging-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#logging-in"}},[e._v("#")]),e._v(" Logging in")]),e._v(" "),t("p",[e._v("For participants interested in trying thing out, try logging into Terrascope openEO backend:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://docs.terrascope.be/#/Developers/WebServices/OpenEO/OpenEO",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.terrascope.be/#/Developers/WebServices/OpenEO/OpenEO"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Jupyter notebooks with the openEO Python client installed:\n"),t("a",{attrs:{href:"https://notebooks.terrascope.be",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://notebooks.terrascope.be"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("This jupyter environment also has the notebook samples in this git repository already available:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Otherwise, git can be used to check out the notebooks, or simply download the 'ipynb' file.")]),e._v(" "),t("p",[e._v("Use 'edugain and social accounts' login to avoid having to register at Terrascope, you may still be required\nto fill in a form.")]),e._v(" "),t("h3",{attrs:{id:"openeo-in-python-intro"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-in-python-intro"}},[e._v("#")]),e._v(" openEO in Python intro")]),e._v(" "),t("p",[e._v("General Python documentation:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://open-eo.github.io/openeo-python-client/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Basics:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/blob/master/examples/notebooks/openeo-terrascope-webinar.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/openeo-python-client/blob/master/examples/notebooks/openeo-terrascope-webinar.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("More advanced:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-showcase.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-showcase.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"r-client"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client"}},[e._v("#")]),e._v(" R client")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://openeo.org/documentation/1.0/r/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://openeo.org/documentation/1.0/r/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Demonstration notebook:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-r-client.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-r-client.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"openeo-user-interfaces"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-user-interfaces"}},[e._v("#")]),e._v(" openEO user interfaces")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://hub.openeo.org"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://editor.openeo.org"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases"}},[e._v("#")]),e._v(" Use cases")]),e._v(" "),t("p",[e._v("Using predefined 'higher level' services:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples/blob/master/Terrascope/Beginner/OpenEO_CropCalendarService.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples/blob/master/Terrascope/Beginner/OpenEO_CropCalendarService.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Creating 'higher level' services:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/udp.html#building-and-storing-user-defined-process",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://open-eo.github.io/openeo-python-client/udp.html#building-and-storing-user-defined-process"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[90],{538:function(e,t,o){"use strict";o.r(t);var r=o(4),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"ieee-igarrs-2021-hd-3-hands-on-openeo-access-cloud-platforms-using-your-preferred-programming-language"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ieee-igarrs-2021-hd-3-hands-on-openeo-access-cloud-platforms-using-your-preferred-programming-language"}},[e._v("#")]),e._v(" IEEE IGARRS 2021 HD-3: Hands-on openEO: access cloud platforms using your preferred programming language")]),e._v(" "),t("p",[e._v("This page contains the agenda, and links to used material for the\nIEEE IGARRS 2021 openEO tutorial.")]),e._v(" "),t("p",[e._v("Details: "),t("a",{attrs:{href:"https://igarss2021.com/tutorials.php#tut9",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://igarss2021.com/tutorials.php#tut9"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"agenda"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#agenda"}},[e._v("#")]),e._v(" Agenda")]),e._v(" "),t("ul",[t("li",[e._v("14:00-14:20: Introduction to openEO (Pieter Kempeneers - JRC)")]),e._v(" "),t("li",[e._v("14:20-14:30: Q&A")]),e._v(" "),t("li",[e._v("14:30-15:30: Python client (VITO) (Jeroen Dries - VITO)")]),e._v(" "),t("li",[e._v("15:30-16:15: R client (WUR) (Dainius Masiliunas - WUR)")]),e._v(" "),t("li",[e._v("16:15-16:30: Break")]),e._v(" "),t("li",[e._v("16:30-16:45: openEO UIs (Jeroen Dries - VITO)")]),e._v(" "),t("li",[e._v("16:45-17:15: Use case demo (Jeroen Dries - VITO)")]),e._v(" "),t("li",[e._v("17:15-18:00: Q&A")])]),e._v(" "),t("h2",{attrs:{id:"python-client"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#python-client"}},[e._v("#")]),e._v(" Python client")]),e._v(" "),t("h3",{attrs:{id:"logging-in"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#logging-in"}},[e._v("#")]),e._v(" Logging in")]),e._v(" "),t("p",[e._v("For participants interested in trying thing out, try logging into Terrascope openEO backend:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://docs.terrascope.be/#/Developers/WebServices/OpenEO/OpenEO",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.terrascope.be/#/Developers/WebServices/OpenEO/OpenEO"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Jupyter notebooks with the openEO Python client installed:\n"),t("a",{attrs:{href:"https://notebooks.terrascope.be",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://notebooks.terrascope.be"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("This jupyter environment also has the notebook samples in this git repository already available:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Otherwise, git can be used to check out the notebooks, or simply download the 'ipynb' file.")]),e._v(" "),t("p",[e._v("Use 'edugain and social accounts' login to avoid having to register at Terrascope, you may still be required\nto fill in a form.")]),e._v(" "),t("h3",{attrs:{id:"openeo-in-python-intro"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-in-python-intro"}},[e._v("#")]),e._v(" openEO in Python intro")]),e._v(" "),t("p",[e._v("General Python documentation:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://open-eo.github.io/openeo-python-client/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Basics:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/blob/master/examples/notebooks/openeo-terrascope-webinar.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/Open-EO/openeo-python-client/blob/master/examples/notebooks/openeo-terrascope-webinar.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("More advanced:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-showcase.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-showcase.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"r-client"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client"}},[e._v("#")]),e._v(" R client")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://openeo.org/documentation/1.0/r/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://openeo.org/documentation/1.0/r/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Demonstration notebook:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-r-client.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples/blob/master/tools/openEO/openeo-r-client.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"openeo-user-interfaces"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-user-interfaces"}},[e._v("#")]),e._v(" openEO user interfaces")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://hub.openeo.org"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://editor.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://editor.openeo.org"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases"}},[e._v("#")]),e._v(" Use cases")]),e._v(" "),t("p",[e._v("Using predefined 'higher level' services:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/VITObelgium/notebook-samples/blob/master/Terrascope/Beginner/OpenEO_CropCalendarService.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/VITObelgium/notebook-samples/blob/master/Terrascope/Beginner/OpenEO_CropCalendarService.ipynb"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Creating 'higher level' services:")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-python-client/udp.html#building-and-storing-user-defined-process",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://open-eo.github.io/openeo-python-client/udp.html#building-and-storing-user-defined-process"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/91.9fb090ad.js b/assets/js/91.47420dce.js similarity index 93% rename from assets/js/91.9fb090ad.js rename to assets/js/91.47420dce.js index f17b285c1..2685d0563 100644 --- a/assets/js/91.9fb090ad.js +++ b/assets/js/91.47420dce.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{537:function(t,e,n){"use strict";n.r(e);var o=n(4),a=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("openEO is an H2020 project funded under call "),t("a",{attrs:{href:"https://ec.europa.eu/research/participants/portal/desktop/en/opportunities/h2020/topics/eo-2-2017.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("EO-2-2017: EO Big Data\nShift"),t("OutboundLink")],1),this._v(", from Oct 2017 to Sept 2020.")]),this._v(" "),t("p",[this._v("The project aims at making it easier to analyse large amounts of\nEarth observation data, and tries to do this by developing open\nsource software solutions. We develop an API to connect R, python\nand javascript clients to big Earth observation cloud back-ends in a\nsimple and unified way.")]),this._v(" "),t("p",[this._v("We invite everyone interested to participate. Get in touch today!")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{539:function(t,e,n){"use strict";n.r(e);var o=n(4),a=Object(o.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("openEO is an H2020 project funded under call "),t("a",{attrs:{href:"https://ec.europa.eu/research/participants/portal/desktop/en/opportunities/h2020/topics/eo-2-2017.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("EO-2-2017: EO Big Data\nShift"),t("OutboundLink")],1),this._v(", from Oct 2017 to Sept 2020.")]),this._v(" "),t("p",[this._v("The project aims at making it easier to analyse large amounts of\nEarth observation data, and tries to do this by developing open\nsource software solutions. We develop an API to connect R, python\nand javascript clients to big Earth observation cloud back-ends in a\nsimple and unified way.")]),this._v(" "),t("p",[this._v("We invite everyone interested to participate. Get in touch today!")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/92.c565c6db.js b/assets/js/92.800bc3c2.js similarity index 98% rename from assets/js/92.c565c6db.js rename to assets/js/92.800bc3c2.js index fae772d81..d5593a031 100644 --- a/assets/js/92.c565c6db.js +++ b/assets/js/92.800bc3c2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{538:function(t,e,r){"use strict";r.r(e);var s=r(4),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("On Dec 4-6, VITO's "),e("a",{attrs:{href:"https://remotesensing.vito.be/",target:"_blank",rel:"noopener noreferrer"}},[t._v("remote sensing\nlab"),e("OutboundLink")],1),t._v(" hosted the first\nopenEO "),e("em",[t._v("week of intensive collaboration")]),t._v(", in Mol,\nBelgium. Thirteen developers from 8 different partners\ngathered to discuss, and work on realising the "),e("a",{attrs:{href:"https://appelmar.github.io/openeo-api-docs/poc/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("first three use\ncases"),e("OutboundLink")],1),t._v(",\nwhich are planned to be delivered in Month 6 (March 2018):")]),t._v(" "),e("blockquote",{staticClass:"twitter-tweet",attrs:{"data-lang":"en"}},[e("p",{attrs:{lang:"en",dir:"ltr"}},[t._v("First week of intense collaboration for "),e("a",{attrs:{href:"https://twitter.com/hashtag/openEO?src=hash&ref_src=twsrc%5Etfw"}},[t._v("#openEO")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/VITO_RS_?ref_src=twsrc%5Etfw"}},[t._v("@VITO_RS_")]),t._v(", drafting a first API and doing use cases. "),e("a",{attrs:{href:"https://twitter.com/MundialisInfo?ref_src=twsrc%5Etfw"}},[t._v("@MundialisInfo")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/EODC_GmbH?ref_src=twsrc%5Etfw"}},[t._v("@EODC_GmbH")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/hashtag/ifgi?src=hash&ref_src=twsrc%5Etfw"}},[t._v("#ifgi")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/CopernicusEU?ref_src=twsrc%5Etfw"}},[t._v("@CopernicusEU")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/sinergise?ref_src=twsrc%5Etfw"}},[t._v("@sinergise")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/EURAC?ref_src=twsrc%5Etfw"}},[t._v("@EURAC")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/hashtag/JRC?src=hash&ref_src=twsrc%5Etfw"}},[t._v("#JRC")]),t._v(" "),e("a",{attrs:{href:"https://t.co/9uCYd9A96S"}},[t._v("pic.twitter.com/9uCYd9A96S")])]),t._v("— openEO (@open_EO) "),e("a",{attrs:{href:"https://twitter.com/open_EO/status/938000627078230016?ref_src=twsrc%5Etfw"}},[t._v("December 5, 2017")])]),t._v(" "),e("script",{attrs:{async:"",src:"https://platform.twitter.com/widgets.js",charset:"utf-8"}}),t._v(" "),e("p",[t._v("We worked on the following back-ends:")]),t._v(" "),e("ul",[e("li",[t._v("Sentinel hub")]),t._v(" "),e("li",[t._v("EODC file-based")]),t._v(" "),e("li",[t._v("Rasdaman")]),t._v(" "),e("li",[t._v("GRASS")]),t._v(" "),e("li",[t._v("GeoTrellis")])]),t._v(" "),e("p",[t._v("and on the R and python clients, and started working on a "),e("a",{attrs:{href:t.$site.themeConfig.docPath+"glossary.html"}},[t._v("glossary")]),t._v(".")]),t._v(" "),e("p",[t._v("Among the many insights we gathered by sitting together and talk, we found that")]),t._v(" "),e("ul",[e("li",[t._v('the "core API" as described in the proposal is not so much a software layer on itself, but rather an API in front of every compute back-end; this simplifies the whole architecture pretty much')]),t._v(" "),e("li",[t._v("OpenSearch should have the ability to describe "),e("em",[t._v("collections")]),t._v(" of granules (or images, tiles) in addition to describing individual granules")]),t._v(" "),e("li",[t._v("band can be seen as array dimension as well as attributes of array records, but seeing it as a dimension may make life easier")]),t._v(" "),e("li",[t._v("use case 1 can be described as a sequence of filter operations (on image collection, bounding box, date range, and bands) followed by two aggregate operations (compute division over bands, compute mininum over time)")])]),t._v(" "),e("p",[t._v("Intermediate results can be found in a bunch of repositories, mostly proof-of-concept, on the openEO "),e("a",{attrs:{href:"https://github.com/Open-EO/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github organisation"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{540:function(t,e,r){"use strict";r.r(e);var s=r(4),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("On Dec 4-6, VITO's "),e("a",{attrs:{href:"https://remotesensing.vito.be/",target:"_blank",rel:"noopener noreferrer"}},[t._v("remote sensing\nlab"),e("OutboundLink")],1),t._v(" hosted the first\nopenEO "),e("em",[t._v("week of intensive collaboration")]),t._v(", in Mol,\nBelgium. Thirteen developers from 8 different partners\ngathered to discuss, and work on realising the "),e("a",{attrs:{href:"https://appelmar.github.io/openeo-api-docs/poc/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("first three use\ncases"),e("OutboundLink")],1),t._v(",\nwhich are planned to be delivered in Month 6 (March 2018):")]),t._v(" "),e("blockquote",{staticClass:"twitter-tweet",attrs:{"data-lang":"en"}},[e("p",{attrs:{lang:"en",dir:"ltr"}},[t._v("First week of intense collaboration for "),e("a",{attrs:{href:"https://twitter.com/hashtag/openEO?src=hash&ref_src=twsrc%5Etfw"}},[t._v("#openEO")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/VITO_RS_?ref_src=twsrc%5Etfw"}},[t._v("@VITO_RS_")]),t._v(", drafting a first API and doing use cases. "),e("a",{attrs:{href:"https://twitter.com/MundialisInfo?ref_src=twsrc%5Etfw"}},[t._v("@MundialisInfo")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/EODC_GmbH?ref_src=twsrc%5Etfw"}},[t._v("@EODC_GmbH")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/hashtag/ifgi?src=hash&ref_src=twsrc%5Etfw"}},[t._v("#ifgi")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/CopernicusEU?ref_src=twsrc%5Etfw"}},[t._v("@CopernicusEU")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/sinergise?ref_src=twsrc%5Etfw"}},[t._v("@sinergise")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/EURAC?ref_src=twsrc%5Etfw"}},[t._v("@EURAC")]),t._v(" "),e("a",{attrs:{href:"https://twitter.com/hashtag/JRC?src=hash&ref_src=twsrc%5Etfw"}},[t._v("#JRC")]),t._v(" "),e("a",{attrs:{href:"https://t.co/9uCYd9A96S"}},[t._v("pic.twitter.com/9uCYd9A96S")])]),t._v("— openEO (@open_EO) "),e("a",{attrs:{href:"https://twitter.com/open_EO/status/938000627078230016?ref_src=twsrc%5Etfw"}},[t._v("December 5, 2017")])]),t._v(" "),e("script",{attrs:{async:"",src:"https://platform.twitter.com/widgets.js",charset:"utf-8"}}),t._v(" "),e("p",[t._v("We worked on the following back-ends:")]),t._v(" "),e("ul",[e("li",[t._v("Sentinel hub")]),t._v(" "),e("li",[t._v("EODC file-based")]),t._v(" "),e("li",[t._v("Rasdaman")]),t._v(" "),e("li",[t._v("GRASS")]),t._v(" "),e("li",[t._v("GeoTrellis")])]),t._v(" "),e("p",[t._v("and on the R and python clients, and started working on a "),e("a",{attrs:{href:t.$site.themeConfig.docPath+"glossary.html"}},[t._v("glossary")]),t._v(".")]),t._v(" "),e("p",[t._v("Among the many insights we gathered by sitting together and talk, we found that")]),t._v(" "),e("ul",[e("li",[t._v('the "core API" as described in the proposal is not so much a software layer on itself, but rather an API in front of every compute back-end; this simplifies the whole architecture pretty much')]),t._v(" "),e("li",[t._v("OpenSearch should have the ability to describe "),e("em",[t._v("collections")]),t._v(" of granules (or images, tiles) in addition to describing individual granules")]),t._v(" "),e("li",[t._v("band can be seen as array dimension as well as attributes of array records, but seeing it as a dimension may make life easier")]),t._v(" "),e("li",[t._v("use case 1 can be described as a sequence of filter operations (on image collection, bounding box, date range, and bands) followed by two aggregate operations (compute division over bands, compute mininum over time)")])]),t._v(" "),e("p",[t._v("Intermediate results can be found in a bunch of repositories, mostly proof-of-concept, on the openEO "),e("a",{attrs:{href:"https://github.com/Open-EO/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github organisation"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/93.f2f0d9e0.js b/assets/js/93.7e1b8d20.js similarity index 99% rename from assets/js/93.f2f0d9e0.js rename to assets/js/93.7e1b8d20.js index 798643066..6bc30d82f 100644 --- a/assets/js/93.f2f0d9e0.js +++ b/assets/js/93.7e1b8d20.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{539:function(e,t,n){"use strict";n.r(t);var a=n(4),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"the-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-problem"}},[e._v("#")]),e._v(" The problem")]),e._v(" "),t("p",[e._v("Earth Observation data are becoming too large to be downloaded\nlocally for analysis. Also, the way they are organised (as tiles,\nor "),t("em",[e._v("granules")]),e._v(": files containing the imagery for a small part of\nthe Earth and a single observation date) makes it unnecessary\ncomplicated to analyse them. The solution to this is to store these\ndata in the cloud, on compute back-ends, process them there, and\nbrowse the results or download resulting figures or numbers. But\nhow do we do that?")]),e._v(" "),t("p",[e._v("The aim of openEO is to develop an open API to connect R, python\nand javascript clients to big Earth observation cloud back-ends in\na simple and unified way.")]),e._v(" "),t("p",[e._v("With such an API,")]),e._v(" "),t("ul",[t("li",[e._v("each client can work with every back-end, and")]),e._v(" "),t("li",[e._v("it becomes possible to compare back-ends in terms of capacity,\ncost, and results (validation, reproducibility)")])]),e._v(" "),t("h2",{attrs:{id:"why-an-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-an-api"}},[e._v("#")]),e._v(" Why an API?")]),e._v(" "),t("p",[e._v("An API is an application programming interface. It "),t("em",[e._v("defines")]),e._v("\na "),t("em",[e._v("language")]),e._v(" that two computers (a client and a server) use to\ncommunicate.")]),e._v(" "),t("p",[e._v("The following figure shows how many interfaces are needed to be able\nto compare back-ends from different clients, without an openEO API:")]),e._v(" "),t("p",[t("img",{attrs:{src:"/images/api.png",alt:"Current situation, without openEO API"}})]),e._v(" "),t("p",[e._v("With an openEO API (dark blue), the situation becomes much easier:")]),e._v(" "),t("p",[t("img",{attrs:{src:"/images/api2.png",alt:"Situation in the future, with openEO API"}})]),e._v(" "),t("p",[e._v("However, existing back-ends need to be taught to work with the new\nAPI, and clients that interact with back-ends need to be developed.")]),e._v(" "),t("p",[e._v("The task of the openEO project is to design, develop, and evaluate\nan API for cloud-based Earth Observation data processing.")]),e._v(" "),t("h2",{attrs:{id:"first-results"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#first-results"}},[e._v("#")]),e._v(" First results")]),e._v(" "),t("p",[e._v("The openEO project started in Oct 2017. Now, within 6 months, we\nfinished the first proof of concept, and demonstrate it. Three use\ncases were selected for this, three clients were developed pretty\nmuch from scratch (Python, R, and JavaScript), and\nseven back-ends were built or interfaced. Full information is available\nfrom the projects "),t("a",{attrs:{href:"https://github.com/Open-EO/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github organisation"),t("OutboundLink")],1),e._v(",\nand we point here to the")]),e._v(" "),t("ul",[t("li",[e._v("swagger-2.0 complient "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api",target:"_blank",rel:"noopener noreferrer"}},[e._v("API"),t("OutboundLink")],1),e._v(" and its "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-api/",target:"_blank",rel:"noopener noreferrer"}},[e._v("documentation"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"the-three-use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-three-use-cases"}},[e._v("#")]),e._v(" The three use cases")]),e._v(" "),t("p",[e._v("The three use cases comprise")]),e._v(" "),t("ol",[t("li",[e._v("Derive minimum NDVI measurements over pixel time series of Sentinel 2 imagery")]),e._v(" "),t("li",[e._v("Create a monthly aggregated Sentinel 1 product from a custom Python script")]),e._v(" "),t("li",[e._v("Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-uploaded polygons")])]),e._v(" "),t("p",[e._v("The full description, including the consecutive interaction steps of the API, is found on the")]),e._v(" "),t("ul",[t("li",[e._v("proof-of-concept "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-api/poc/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("use cases"),t("OutboundLink")],1),e._v(" site")])]),e._v(" "),t("h2",{attrs:{id:"links-to-the-client-and-back-end-implementations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#links-to-the-client-and-back-end-implementations"}},[e._v("#")]),e._v(" Links to the client and back-end implementations")]),e._v(" "),t("p",[e._v("Clients:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python client"),t("OutboundLink")],1),e._v("; "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/blob/master/examples/notebooks/Compositing.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example notebook"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("R client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Javascript client"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript web editor"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Back-ends")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-grassgis-driver/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GRASS GIS driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-wcps-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("WCPS driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-openshift-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenShift driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python GeoPySpark/GeoTrellis driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google Earth Engine back-end"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("R back-end"),t("OutboundLink")],1),e._v(" (developed for testing purposes)")])]),e._v(" "),t("p",[e._v('With all this, you can install your own back-end of choice, install\na client, and start analysing the data! (but do read "Next steps",\nbelow). Alternatively, we show a couple of videos of screen casts\nmade while testing the various clients and back-ends.')]),e._v(" "),t("h2",{attrs:{id:"proof-of-concept-videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#proof-of-concept-videos"}},[e._v("#")]),e._v(" Proof-of-concept videos")]),e._v(" "),t("h3",{attrs:{id:"r-client-and-wcps-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client-and-wcps-back-end-use-case-1"}},[e._v("#")]),e._v(" R client and WCPS back-end, use case 1")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/NoD0nVGM3ww",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"grass-gis-back-end-use-cases-1-2-and-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grass-gis-back-end-use-cases-1-2-and-3"}},[e._v("#")]),e._v(" Grass GIS back-end, use cases 1, 2 and 3")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/NgF1WgCtSiM",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"r-client-and-r-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client-and-r-back-end-use-case-1"}},[e._v("#")]),e._v(" R client and R back-end, use-case 1")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/Yb_QflO-ulE",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"r-client-and-r-back-end-use-case-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client-and-r-back-end-use-case-3"}},[e._v("#")]),e._v(" R client and R back-end, use case 3")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/LYnad6KC_CU",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"openeo-web-editor-js-client-with-three-back-ends-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-web-editor-js-client-with-three-back-ends-use-case-1"}},[e._v("#")]),e._v(" openEO Web Editor (JS client) with three back-ends (use case 1)")]),e._v(" "),t("p",[e._v("Demonstrates use of back-ends Sentinel Hub, WCPS EURAC, and OpenShift EODC")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/zDaQkw0NhpY",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"openeo-web-editor-js-client-with-r-back-end-use-case-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-web-editor-js-client-with-r-back-end-use-case-3"}},[e._v("#")]),e._v(" openEO Web Editor (JS client) with R back-end (use case 3)")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/XsPbKypUuIE",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"python-client-with-geopyspark-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#python-client-with-geopyspark-back-end-use-case-1"}},[e._v("#")]),e._v(" Python client with GeoPySpark back-end (use case 1)")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/qtIp9OC0qHY",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"openeo-web-editor-js-client-with-google-earth-engine-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-web-editor-js-client-with-google-earth-engine-back-end-use-case-1"}},[e._v("#")]),e._v(" openEO Web Editor (JS client) with Google Earth Engine back-end (use case 1)")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/LmUlmsIGJrs",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h2",{attrs:{id:"links-to-documents"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#links-to-documents"}},[e._v("#")]),e._v(" Links to documents")]),e._v(" "),t("p",[e._v("The following four documents (formal project deliverables) describe the proof-of-concept more extensively:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D04_CoreAPIPrototype_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO core API prototype including Proof of Concept"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D06_PrototypeBackEnds_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Two early prototype back-ends"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D07_ProofOfConcept_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Proof of Concept (Python)"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("In addition, a document has been written that describes standards and interfaces used by the various back-ends, and the extent to which they are or will be useful for further developing the openEO API:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D05_BackOfficeStandards_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Overview document about back offices metadata standards and interfaces"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("These deliverables have been submitted, but have not been approved,\nand hence may not be final.")]),e._v(" "),t("h2",{attrs:{id:"next-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[e._v("#")]),e._v(" Next steps")]),e._v(" "),t("p",[e._v("During the proof-of-concept, intentionally a number of difficult issues were not addressed, including")]),e._v(" "),t("ul",[t("li",[e._v("billing (costs) of processes and account management and")]),e._v(" "),t("li",[e._v("authentification\nwhile others were defined rather vaguely, including")]),e._v(" "),t("li",[e._v("the description of data (end point "),t("code",[e._v("/data")]),e._v(")")]),e._v(" "),t("li",[e._v("the description of processes (end point "),t("code",[e._v("/processes")]),e._v(").")])]),e._v(" "),t("p",[e._v("The next steps will include:")]),e._v(" "),t("ul",[t("li",[e._v("discussing of the use-cases in the proof-of-concept")]),e._v(" "),t("li",[e._v("deciding whether to adopt existing standards and interfaces, e.g. for data descriptions")]),e._v(" "),t("li",[e._v("getting users involved outside the openEO consortium to define further requirements and priorities")]),e._v(" "),t("li",[e._v("designing a new iteration of the openEO API.")])]),e._v(" "),t("h2",{attrs:{id:"getting-involved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-involved"}},[e._v("#")]),e._v(" Getting involved")]),e._v(" "),t("p",[e._v("As any API, the openAPI will only become good and useful if it is being used, and it needs testing by a wide audience. We are now at the stage of designing it, but at the point where large chunks are useful already. If you want to contribute to any of this, please do not hesitate and contact us e.g. by")]),e._v(" "),t("ul",[t("li",[e._v("expressing interest")]),e._v(" "),t("li",[e._v("writing GitHub issues wherever you think it is appropriate")]),e._v(" "),t("li",[e._v("sending an "),t("a",{attrs:{href:"mailto:openeo.psc@uni-muenster.de"}},[e._v("email")])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{542:function(e,t,n){"use strict";n.r(t);var a=n(4),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"the-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-problem"}},[e._v("#")]),e._v(" The problem")]),e._v(" "),t("p",[e._v("Earth Observation data are becoming too large to be downloaded\nlocally for analysis. Also, the way they are organised (as tiles,\nor "),t("em",[e._v("granules")]),e._v(": files containing the imagery for a small part of\nthe Earth and a single observation date) makes it unnecessary\ncomplicated to analyse them. The solution to this is to store these\ndata in the cloud, on compute back-ends, process them there, and\nbrowse the results or download resulting figures or numbers. But\nhow do we do that?")]),e._v(" "),t("p",[e._v("The aim of openEO is to develop an open API to connect R, python\nand javascript clients to big Earth observation cloud back-ends in\na simple and unified way.")]),e._v(" "),t("p",[e._v("With such an API,")]),e._v(" "),t("ul",[t("li",[e._v("each client can work with every back-end, and")]),e._v(" "),t("li",[e._v("it becomes possible to compare back-ends in terms of capacity,\ncost, and results (validation, reproducibility)")])]),e._v(" "),t("h2",{attrs:{id:"why-an-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-an-api"}},[e._v("#")]),e._v(" Why an API?")]),e._v(" "),t("p",[e._v("An API is an application programming interface. It "),t("em",[e._v("defines")]),e._v("\na "),t("em",[e._v("language")]),e._v(" that two computers (a client and a server) use to\ncommunicate.")]),e._v(" "),t("p",[e._v("The following figure shows how many interfaces are needed to be able\nto compare back-ends from different clients, without an openEO API:")]),e._v(" "),t("p",[t("img",{attrs:{src:"/images/api.png",alt:"Current situation, without openEO API"}})]),e._v(" "),t("p",[e._v("With an openEO API (dark blue), the situation becomes much easier:")]),e._v(" "),t("p",[t("img",{attrs:{src:"/images/api2.png",alt:"Situation in the future, with openEO API"}})]),e._v(" "),t("p",[e._v("However, existing back-ends need to be taught to work with the new\nAPI, and clients that interact with back-ends need to be developed.")]),e._v(" "),t("p",[e._v("The task of the openEO project is to design, develop, and evaluate\nan API for cloud-based Earth Observation data processing.")]),e._v(" "),t("h2",{attrs:{id:"first-results"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#first-results"}},[e._v("#")]),e._v(" First results")]),e._v(" "),t("p",[e._v("The openEO project started in Oct 2017. Now, within 6 months, we\nfinished the first proof of concept, and demonstrate it. Three use\ncases were selected for this, three clients were developed pretty\nmuch from scratch (Python, R, and JavaScript), and\nseven back-ends were built or interfaced. Full information is available\nfrom the projects "),t("a",{attrs:{href:"https://github.com/Open-EO/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github organisation"),t("OutboundLink")],1),e._v(",\nand we point here to the")]),e._v(" "),t("ul",[t("li",[e._v("swagger-2.0 complient "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api",target:"_blank",rel:"noopener noreferrer"}},[e._v("API"),t("OutboundLink")],1),e._v(" and its "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-api/",target:"_blank",rel:"noopener noreferrer"}},[e._v("documentation"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"the-three-use-cases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-three-use-cases"}},[e._v("#")]),e._v(" The three use cases")]),e._v(" "),t("p",[e._v("The three use cases comprise")]),e._v(" "),t("ol",[t("li",[e._v("Derive minimum NDVI measurements over pixel time series of Sentinel 2 imagery")]),e._v(" "),t("li",[e._v("Create a monthly aggregated Sentinel 1 product from a custom Python script")]),e._v(" "),t("li",[e._v("Compute time series of zonal (regional) statistics of Sentinel 2 imagery over user-uploaded polygons")])]),e._v(" "),t("p",[e._v("The full description, including the consecutive interaction steps of the API, is found on the")]),e._v(" "),t("ul",[t("li",[e._v("proof-of-concept "),t("a",{attrs:{href:"https://open-eo.github.io/openeo-api/poc/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("use cases"),t("OutboundLink")],1),e._v(" site")])]),e._v(" "),t("h2",{attrs:{id:"links-to-the-client-and-back-end-implementations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#links-to-the-client-and-back-end-implementations"}},[e._v("#")]),e._v(" Links to the client and back-end implementations")]),e._v(" "),t("p",[e._v("Clients:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python client"),t("OutboundLink")],1),e._v("; "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client/blob/master/examples/notebooks/Compositing.ipynb",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example notebook"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("R client"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Javascript client"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-web-editor",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript web editor"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Back-ends")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://open-eo.github.io/openeo-grassgis-driver/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GRASS GIS driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-wcps-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("WCPS driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-openshift-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenShift driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-geopyspark-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python GeoPySpark/GeoTrellis driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-sentinelhub-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sentinel Hub driver"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-earthengine-driver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google Earth Engine back-end"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("R back-end"),t("OutboundLink")],1),e._v(" (developed for testing purposes)")])]),e._v(" "),t("p",[e._v('With all this, you can install your own back-end of choice, install\na client, and start analysing the data! (but do read "Next steps",\nbelow). Alternatively, we show a couple of videos of screen casts\nmade while testing the various clients and back-ends.')]),e._v(" "),t("h2",{attrs:{id:"proof-of-concept-videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#proof-of-concept-videos"}},[e._v("#")]),e._v(" Proof-of-concept videos")]),e._v(" "),t("h3",{attrs:{id:"r-client-and-wcps-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client-and-wcps-back-end-use-case-1"}},[e._v("#")]),e._v(" R client and WCPS back-end, use case 1")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/NoD0nVGM3ww",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"grass-gis-back-end-use-cases-1-2-and-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grass-gis-back-end-use-cases-1-2-and-3"}},[e._v("#")]),e._v(" Grass GIS back-end, use cases 1, 2 and 3")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/NgF1WgCtSiM",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"r-client-and-r-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client-and-r-back-end-use-case-1"}},[e._v("#")]),e._v(" R client and R back-end, use-case 1")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/Yb_QflO-ulE",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"r-client-and-r-back-end-use-case-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#r-client-and-r-back-end-use-case-3"}},[e._v("#")]),e._v(" R client and R back-end, use case 3")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/LYnad6KC_CU",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"openeo-web-editor-js-client-with-three-back-ends-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-web-editor-js-client-with-three-back-ends-use-case-1"}},[e._v("#")]),e._v(" openEO Web Editor (JS client) with three back-ends (use case 1)")]),e._v(" "),t("p",[e._v("Demonstrates use of back-ends Sentinel Hub, WCPS EURAC, and OpenShift EODC")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/zDaQkw0NhpY",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"openeo-web-editor-js-client-with-r-back-end-use-case-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-web-editor-js-client-with-r-back-end-use-case-3"}},[e._v("#")]),e._v(" openEO Web Editor (JS client) with R back-end (use case 3)")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/XsPbKypUuIE",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"python-client-with-geopyspark-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#python-client-with-geopyspark-back-end-use-case-1"}},[e._v("#")]),e._v(" Python client with GeoPySpark back-end (use case 1)")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/qtIp9OC0qHY",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h3",{attrs:{id:"openeo-web-editor-js-client-with-google-earth-engine-back-end-use-case-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#openeo-web-editor-js-client-with-google-earth-engine-back-end-use-case-1"}},[e._v("#")]),e._v(" openEO Web Editor (JS client) with Google Earth Engine back-end (use case 1)")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/LmUlmsIGJrs",frameborder:"0",allowfullscreen:""}}),e._v(" "),t("h2",{attrs:{id:"links-to-documents"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#links-to-documents"}},[e._v("#")]),e._v(" Links to documents")]),e._v(" "),t("p",[e._v("The following four documents (formal project deliverables) describe the proof-of-concept more extensively:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D04_CoreAPIPrototype_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO core API prototype including Proof of Concept"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D06_PrototypeBackEnds_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Two early prototype back-ends"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D07_ProofOfConcept_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Proof of Concept (Python)"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("In addition, a document has been written that describes standards and interfaces used by the various back-ends, and the extent to which they are or will be useful for further developing the openEO API:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://pebesma.staff.ifgi.de/openeo_del/openEO_D05_BackOfficeStandards_v1.0.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Overview document about back offices metadata standards and interfaces"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("These deliverables have been submitted, but have not been approved,\nand hence may not be final.")]),e._v(" "),t("h2",{attrs:{id:"next-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[e._v("#")]),e._v(" Next steps")]),e._v(" "),t("p",[e._v("During the proof-of-concept, intentionally a number of difficult issues were not addressed, including")]),e._v(" "),t("ul",[t("li",[e._v("billing (costs) of processes and account management and")]),e._v(" "),t("li",[e._v("authentification\nwhile others were defined rather vaguely, including")]),e._v(" "),t("li",[e._v("the description of data (end point "),t("code",[e._v("/data")]),e._v(")")]),e._v(" "),t("li",[e._v("the description of processes (end point "),t("code",[e._v("/processes")]),e._v(").")])]),e._v(" "),t("p",[e._v("The next steps will include:")]),e._v(" "),t("ul",[t("li",[e._v("discussing of the use-cases in the proof-of-concept")]),e._v(" "),t("li",[e._v("deciding whether to adopt existing standards and interfaces, e.g. for data descriptions")]),e._v(" "),t("li",[e._v("getting users involved outside the openEO consortium to define further requirements and priorities")]),e._v(" "),t("li",[e._v("designing a new iteration of the openEO API.")])]),e._v(" "),t("h2",{attrs:{id:"getting-involved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-involved"}},[e._v("#")]),e._v(" Getting involved")]),e._v(" "),t("p",[e._v("As any API, the openAPI will only become good and useful if it is being used, and it needs testing by a wide audience. We are now at the stage of designing it, but at the point where large chunks are useful already. If you want to contribute to any of this, please do not hesitate and contact us e.g. by")]),e._v(" "),t("ul",[t("li",[e._v("expressing interest")]),e._v(" "),t("li",[e._v("writing GitHub issues wherever you think it is appropriate")]),e._v(" "),t("li",[e._v("sending an "),t("a",{attrs:{href:"mailto:openeo.psc@uni-muenster.de"}},[e._v("email")])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/94.23dcb6a5.js b/assets/js/94.c0bfab8b.js similarity index 95% rename from assets/js/94.23dcb6a5.js rename to assets/js/94.c0bfab8b.js index 272511c21..264b71cac 100644 --- a/assets/js/94.23dcb6a5.js +++ b/assets/js/94.c0bfab8b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{541:function(e,t,r){"use strict";r.r(t);var n=r(4),s=Object(n.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/openEO_UserSurvey",target:"_blank",rel:"noopener noreferrer"}},[this._v("This survey"),e("OutboundLink")],1),this._v(" aims to gather a detailed view of external user needs in relation EO data access and analysis. This will enable the openEO project team to better identify current needs of different users and the potential for openEO to be useful to them and to overcome any barriers they have in their work streams. Ultimately, this will steer the openEO API in a way which meets user needs including being compatible with additional EO service providers and their data infrastructures. Additional processes and use cases will also be added where necessary with the aim of benefiting more potential users.")]),this._v(" "),e("p",[this._v("The survey is open to all, so please fill it in by 18 June 2018, and share within your relevant networks. It should take no longer than 10 minutes to complete.")]),this._v(" "),e("p",[e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/openEO_UserSurvey",target:"_blank",rel:"noopener noreferrer"}},[this._v("https://ec.europa.eu/eusurvey/runner/openEO_UserSurvey"),e("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{544:function(e,t,r){"use strict";r.r(t);var n=r(4),s=Object(n.a)({},(function(){var e=this._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/openEO_UserSurvey",target:"_blank",rel:"noopener noreferrer"}},[this._v("This survey"),e("OutboundLink")],1),this._v(" aims to gather a detailed view of external user needs in relation EO data access and analysis. This will enable the openEO project team to better identify current needs of different users and the potential for openEO to be useful to them and to overcome any barriers they have in their work streams. Ultimately, this will steer the openEO API in a way which meets user needs including being compatible with additional EO service providers and their data infrastructures. Additional processes and use cases will also be added where necessary with the aim of benefiting more potential users.")]),this._v(" "),e("p",[this._v("The survey is open to all, so please fill it in by 18 June 2018, and share within your relevant networks. It should take no longer than 10 minutes to complete.")]),this._v(" "),e("p",[e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/openEO_UserSurvey",target:"_blank",rel:"noopener noreferrer"}},[this._v("https://ec.europa.eu/eusurvey/runner/openEO_UserSurvey"),e("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/95.935641b0.js b/assets/js/95.e58c7ed0.js similarity index 98% rename from assets/js/95.935641b0.js rename to assets/js/95.e58c7ed0.js index b941455dc..c35bc968e 100644 --- a/assets/js/95.935641b0.js +++ b/assets/js/95.e58c7ed0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{542:function(e,t,n){"use strict";n.r(t);var s=n(4),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("The openEO consortium is currently undergoing its first evaluation process by the European Commission. During the first year the partners exceeded the planned progress. During the starting phase the meaning of the different layers was clarified more precisely. openEO represents a set of contracts between two API layers.")]),e._v(" "),t("ol",[t("li",[e._v("Instances of the core API are implemented at back-end drivers within the respective EO service providers. By guaranteeing the same instances at the various back-ends, their interoperability can be guaranteed.")]),e._v(" "),t("li",[e._v("Client APIs – software libraries specific to given programming languages – are enabling users to interact with the back-end's drivers.\nThe communication between clients and service providers is realised via HTTP requests, which's complexity is not visible to the users, but is dealt with by openEO.")])]),e._v(" "),t("p",[e._v("Since the successful development of the Proof of Concept, client APIs are developed for "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("R"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript"),t("OutboundLink")],1),e._v(", enabling the execution of a growing set of functionalities. Being language neutral, new client APIs of e.g. additional programming languages, Quantum GIS interfaces, or GRASS GIS can be added easily. Currently, the core API is establishing access to entry points of "),t("RouterLink",{attrs:{to:"/software.md/#back-ends"}},[e._v("7 European EO service providers")]),e._v(", which are thus able to provide services to the user, reflecting examples from all stages of EO data processing.")],1),e._v(" "),t("p",[e._v("A process catalogue is under development, describing a set of functionalities to be implemented for openEO, their I/O data and their exact workflow. Interested users are encouraged to discuss with the consortium partners via the various provided channels to enable openEO forming widely accepted and used standards with a consistent syntax. The well-defined process catalogue shall also serve 3rd-party processing platforms with a template to become accessible to openEO. In the same manner, a client library development guideline is being prepared momentarily to ensure a standardised implementation of the client APIs.")]),e._v(" "),t("p",[e._v("For using arbitrary code to process EO data with the openEO API, first User-Defined Functions (UDF) are currently implemented and added to openEO-compatible workflows. The UDFs are running in specific dockers at the EO data service providers.")]),e._v(" "),t("p",[e._v("openEO is published in its version "),t("a",{attrs:{href:"https://api.openeo.org/v/0.3.0/",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.3.0"),t("OutboundLink")],1),e._v(", providing a HTTP communication between the users and service providers specified by OpenAPI 3.0 JSON files. The JSON data entails process graphs, sent as a job to the back-ends, which can be executed in three different ways.")]),e._v(" "),t("ol",[t("li",[e._v("A batch job can be submitted, which stays inactive until processing is requested. It will run only once and stores its results after execution.")]),e._v(" "),t("li",[e._v("Secondary web services allow web-based access using different protocols such as OGC WMS, OGC WCS or XYZ tiles. The computation runs on demand to allow users to change e.g. the result's viewing extent or level of detail.")]),e._v(" "),t("li",[e._v("Lightweight process graphs (e.g. small previews) can be executed synchronously. More costly processes have to expect timeouts for long-polling HTTP requests.")])]),e._v(" "),t("p",[e._v("The next steps for the consortium will entail the realisation of the newest openEO version at all back-ends and a definition of the targeted level of UDFs (e.g. simple NDVI calculation vs. machine learning algorithms). The process catalogues will be widened up, entailing at least all needed processes to implement the project's use cases via openEO. As an interested user please contact us, if you have any suggestions.")]),e._v(" "),t("p",[e._v("Finally, we plan to submit our first preliminary stable openEO version in May 2019.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{543:function(e,t,n){"use strict";n.r(t);var s=n(4),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("The openEO consortium is currently undergoing its first evaluation process by the European Commission. During the first year the partners exceeded the planned progress. During the starting phase the meaning of the different layers was clarified more precisely. openEO represents a set of contracts between two API layers.")]),e._v(" "),t("ol",[t("li",[e._v("Instances of the core API are implemented at back-end drivers within the respective EO service providers. By guaranteeing the same instances at the various back-ends, their interoperability can be guaranteed.")]),e._v(" "),t("li",[e._v("Client APIs – software libraries specific to given programming languages – are enabling users to interact with the back-end's drivers.\nThe communication between clients and service providers is realised via HTTP requests, which's complexity is not visible to the users, but is dealt with by openEO.")])]),e._v(" "),t("p",[e._v("Since the successful development of the Proof of Concept, client APIs are developed for "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-python-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("Python"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-r-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("R"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-js-client",target:"_blank",rel:"noopener noreferrer"}},[e._v("JavaScript"),t("OutboundLink")],1),e._v(", enabling the execution of a growing set of functionalities. Being language neutral, new client APIs of e.g. additional programming languages, Quantum GIS interfaces, or GRASS GIS can be added easily. Currently, the core API is establishing access to entry points of "),t("RouterLink",{attrs:{to:"/software.md/#back-ends"}},[e._v("7 European EO service providers")]),e._v(", which are thus able to provide services to the user, reflecting examples from all stages of EO data processing.")],1),e._v(" "),t("p",[e._v("A process catalogue is under development, describing a set of functionalities to be implemented for openEO, their I/O data and their exact workflow. Interested users are encouraged to discuss with the consortium partners via the various provided channels to enable openEO forming widely accepted and used standards with a consistent syntax. The well-defined process catalogue shall also serve 3rd-party processing platforms with a template to become accessible to openEO. In the same manner, a client library development guideline is being prepared momentarily to ensure a standardised implementation of the client APIs.")]),e._v(" "),t("p",[e._v("For using arbitrary code to process EO data with the openEO API, first User-Defined Functions (UDF) are currently implemented and added to openEO-compatible workflows. The UDFs are running in specific dockers at the EO data service providers.")]),e._v(" "),t("p",[e._v("openEO is published in its version "),t("a",{attrs:{href:"https://api.openeo.org/v/0.3.0/",target:"_blank",rel:"noopener noreferrer"}},[e._v("0.3.0"),t("OutboundLink")],1),e._v(", providing a HTTP communication between the users and service providers specified by OpenAPI 3.0 JSON files. The JSON data entails process graphs, sent as a job to the back-ends, which can be executed in three different ways.")]),e._v(" "),t("ol",[t("li",[e._v("A batch job can be submitted, which stays inactive until processing is requested. It will run only once and stores its results after execution.")]),e._v(" "),t("li",[e._v("Secondary web services allow web-based access using different protocols such as OGC WMS, OGC WCS or XYZ tiles. The computation runs on demand to allow users to change e.g. the result's viewing extent or level of detail.")]),e._v(" "),t("li",[e._v("Lightweight process graphs (e.g. small previews) can be executed synchronously. More costly processes have to expect timeouts for long-polling HTTP requests.")])]),e._v(" "),t("p",[e._v("The next steps for the consortium will entail the realisation of the newest openEO version at all back-ends and a definition of the targeted level of UDFs (e.g. simple NDVI calculation vs. machine learning algorithms). The process catalogues will be widened up, entailing at least all needed processes to implement the project's use cases via openEO. As an interested user please contact us, if you have any suggestions.")]),e._v(" "),t("p",[e._v("Finally, we plan to submit our first preliminary stable openEO version in May 2019.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/96.1ca9ff99.js b/assets/js/96.fcae4780.js similarity index 91% rename from assets/js/96.1ca9ff99.js rename to assets/js/96.fcae4780.js index 29b614eb2..f793ba7a2 100644 --- a/assets/js/96.1ca9ff99.js +++ b/assets/js/96.fcae4780.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{544:function(t,e,n){"use strict";n.r(e);var a=n(4),o=Object(a.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("openEO will participate, along with the four other H2020 projects funded under the same call, in the "),t("a",{attrs:{href:"https://ec.europa.eu/info/events/h2020-eo-big-data-hackathon-2019-nov-07_en",target:"_blank",rel:"noopener noreferrer"}},[this._v("H2020 EO Big Data Hackathon"),t("OutboundLink")],1),this._v(", which is open for participation.")]),this._v(" "),t("p",[this._v("The hackaton will take place on Nov 7 and 8, 2019, in Frascati, Italy.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{545:function(t,e,n){"use strict";n.r(e);var a=n(4),o=Object(a.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("openEO will participate, along with the four other H2020 projects funded under the same call, in the "),t("a",{attrs:{href:"https://ec.europa.eu/info/events/h2020-eo-big-data-hackathon-2019-nov-07_en",target:"_blank",rel:"noopener noreferrer"}},[this._v("H2020 EO Big Data Hackathon"),t("OutboundLink")],1),this._v(", which is open for participation.")]),this._v(" "),t("p",[this._v("The hackaton will take place on Nov 7 and 8, 2019, in Frascati, Italy.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/97.01aa903f.js b/assets/js/97.a208f6d6.js similarity index 99% rename from assets/js/97.01aa903f.js rename to assets/js/97.a208f6d6.js index 4be4a44e6..8d27c0512 100644 --- a/assets/js/97.01aa903f.js +++ b/assets/js/97.a208f6d6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[97],{545:function(e,t,o){"use strict";o.r(t);var n=o(4),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("With openEO, we are digging into new grounds regarding the interoperability of big Earth observation clouds. While we could address a lot of problems that came up, some issues remained that we couldn't solve. This article explains "),t("em",[e._v("some")]),e._v(" of the lessons learned and thus also gives an honest overview about current limitations of the openEO API.")]),e._v(" "),t("h2",{attrs:{id:"_1-collection-names"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-collection-names"}},[e._v("#")]),e._v(" 1. Collection Names")]),e._v(" "),t("p",[e._v("The naming of data sets (collections) is different across providers. We thought about recommending to follow lists like the "),t("a",{attrs:{href:"http://database.eohandbook.com/database/missionindex.aspx",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS Mission Index"),t("OutboundLink")],1),e._v(", but then the question is what data does it really refer to? It lists "),t("code",[e._v("Sentinel-2 A")]),e._v(" and "),t("code",[e._v("Sentinel-2 B")]),e._v(", but would that be Level 1C or 2A or something completely different? Therefore, openEO decided to not enforce any naming scheme as data sets throughout the affiliated providers were mostly differently pre-processed anyway. To improve the situation, openEO allows to define process parameters. This allows to define algorithms independently of data set names, which can later be assigned when executing the process. Also, openEO recommends to split processing instructions into two parts: data loading/pre-processing and the actual algorithm.")]),e._v(" "),t("p",[e._v("Some more background information can be found in the corresponding "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/52",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue"),t("OutboundLink")],1),e._v(". In general, many limitations (including the following) concern the data holdings of the providers and may hopefully be solved by initiatives that work on Analysis Ready Data (ARD).")]),e._v(" "),t("h2",{attrs:{id:"_2-other-names"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-other-names"}},[e._v("#")]),e._v(" 2. Other Names")]),e._v(" "),t("p",[e._v("Similarly, the naming of bands (and potentially other dimension labels, too) are inconsistent across providers, we faced names such as "),t("code",[e._v("B2")]),e._v(", "),t("code",[e._v("B02")]),e._v(", "),t("code",[e._v("2")]),e._v(" or "),t("code",[e._v("blue")]),e._v(" for Sentinel-2. openEO doesn't enforce any naming scheme, but has found ways to improve the situation for users. First, process parameters can be used (see above). Second, bands can also be specified using the "),t("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/tree/v0.9.0/extensions/eo#common-band-names",target:"_blank",rel:"noopener noreferrer"}},[e._v("common names as specified by STAC"),t("OutboundLink")],1),e._v(" or wavelength ranges. openEO recommends to use common names whenever available.")]),e._v(" "),t("p",[e._v("For example, to avoid specific naming you could filter for Sentinel-2 (A and B) band 2 as follows:")]),e._v(" "),t("ul",[t("li",[e._v("by common name: "),t("code",[e._v("filter_bands(data = cube, bands = ['blue'])")]),e._v(" (blue maps to the wavelength range 0.45 - 0.50 according to STAC)")]),e._v(" "),t("li",[e._v("by wavelength, specified in μm: "),t("code",[e._v("filter_bands(data = cube, wavelength = [[0.49, 0.50]])")]),e._v(" (wavelength is 0.4966 for Sentinel-2A and 0.4921 for Sentinel-2B)")])]),e._v(" "),t("p",[e._v("In general, metadata is aligned for usage in openEO processes by using the "),t("a",{attrs:{href:"https://www.stacspec.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC specification"),t("OutboundLink")],1),e._v(", which improves interoperability.")]),e._v(" "),t("h2",{attrs:{id:"_3-chunked-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-chunked-collections"}},[e._v("#")]),e._v(" 3. Chunked Collections")]),e._v(" "),t("p",[e._v("Some providers (for example "),t("a",{attrs:{href:"https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google Earth Engine"),t("OutboundLink")],1),e._v(") expose data sets such as Sentinel-2 L2A as one large collection. Other providers expose the data sets split into groups, e.g. chunked by CRS and resolution. EURAC has collections such as "),t("code",[e._v("S2_32632_60m_L2A")]),e._v(" or "),t("code",[e._v("S2_32635_10m_L2A")]),e._v(" for example. There are valid "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/180",target:"_blank",rel:"noopener noreferrer"}},[e._v("reasons"),t("OutboundLink")],1),e._v(" for any of the implementations, but to explain them is too much for this article. Unfortunately, those differences decrease the interoperability and in the end the re-usability of the processes. openEO aims to make algorithms re-usable and thus recommends to split processing instructions into two parts: data loading/pre-processing and the actual algorithm. This allows greater re-usability of the algorithms.")]),e._v(" "),t("h2",{attrs:{id:"_4-what-to-specify"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-what-to-specify"}},[e._v("#")]),e._v(" 4. What to specify?")]),e._v(" "),t("p",[e._v("The API has a focus on Service and Data Discovery, Data Processing and Result Retrieval/Publishing. Some more customer-oriented tasks such as user registration and payments are not handled through the openEO API. These aspects are too different across providers and can be handled more efficiently through external interfaces. Most providers already offer such services independently of the openEO API implementation anyway to offer their pre-openEO services.")]),e._v(" "),t("p",[e._v("Still, the openEO API uses OpenID Connect as main Authentication and Authorization mechanism (see also point 5). "),t("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" has a "),t("a",{attrs:{href:"https://openid.net/specs/openid-connect-prompt-create-1_0.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("User Registration extension draft"),t("OutboundLink")],1),e._v(" that can be used by back-ends and may be adopted in the future. We closely follow upcoming specifications and standards and are happy to adopt anything useful.")]),e._v(" "),t("h3",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File Formats")]),e._v(" "),t("p",[e._v("Similarly, file "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/63",target:"_blank",rel:"noopener noreferrer"}},[e._v("formats"),t("OutboundLink")],1),e._v(" and their "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/32",target:"_blank",rel:"noopener noreferrer"}},[e._v("options"),t("OutboundLink")],1),e._v(' are often very different between processing software. That is why GDAL exists. To improve interoperability, the openEO API just recommends to align them with GDAL, which is used in most relevant software anyway. Unfortunately, this comes with some small inconveniences. For example, most people would probably expect to just specify "GeoTiff" as file format name, but GDAL has named it "GTiff". Another idea was to use '),t("a",{attrs:{href:"https://www.iana.org/assignments/media-types/media-types.xhtml",target:"_blank",rel:"noopener noreferrer"}},[e._v("media types"),t("OutboundLink")],1),e._v(" such as "),t("code",[e._v("application/json")]),e._v(", but then we realized that these are often to broad or not even defined. For example, openEO had to "),t("a",{attrs:{href:"https://github.com/opengeospatial/geotiff/issues/34",target:"_blank",rel:"noopener noreferrer"}},[e._v("push the OGC"),t("OutboundLink")],1),e._v(" to specify an official media type for GeoTiff. But the same issue exists for other file formats, too.")]),e._v(" "),t("h2",{attrs:{id:"_5-authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-authentication"}},[e._v("#")]),e._v(" 5. Authentication")]),e._v(" "),t("p",[e._v("One of the most complex issues we faced during the API development was actually not EO or data processing related. It was the Authentication and Authorization mechanism. We quickly decided to use one of the well-established standards available for security reasons. Unfortunately, most of them don't seem to cater very well for our use case where you have a number of different clients and back-ends communicating with each other. Usually in the Web you have multiple clients communicating with a single back-end ("),t("em",[e._v("1:n")]),e._v("), but in openEO we have a "),t("em",[e._v("n:m")]),e._v(" relation. There are CLI tools, web clients and more that need to authenticate against a growing set of independent providers. Therefore, you can't easily ship clients with security measures like Client IDs (and Client Secrets) as required by "),t("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" (based on "),t("a",{attrs:{href:"https://oauth.net/2/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OAuth 2"),t("OutboundLink")],1),e._v("). Users need to get those information by themselves and provide it to the clients, which is inconvenient and probably confusing to many non-developers. This issue is probably the thing I dislike most in the current API specification and thus would love to hear from you whether there are good solutions out there that we missed.")]),e._v(" "),t("h2",{attrs:{id:"_6-debugging-experience"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-debugging-experience"}},[e._v("#")]),e._v(" 6. Debugging Experience")]),e._v(" "),t("p",[e._v('The logging and debugging experience varies a lot between cloud processing and the "traditional workflow" (you download data and compute locally with your preferred tools). While it\'s "free" on a local machine to just do "trial and error" to check whether something is running, cloud processing usually comes with a cost and you likely don\'t want to work with "trial and error". Also you don\'t directly have access to the hardware and software and thus it is harder to investigate problems. openEO took several measures to mitigate these issues, but it is still a different experience for users. I guess that is a long learning process until it is adopted by users and may need additional effort to implement tools to improve the situation. While many users are getting used to it in situations where a streamlined experience is somewhat possible as only few clients communicate with a single provider (e.g. Google Earth Engine), the issue increases in openEO due to the different infrastructure and software used on back-end side.')]),e._v(" "),t("h2",{attrs:{id:"_7-defining-interoperable-processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_7-defining-interoperable-processes"}},[e._v("#")]),e._v(" 7. Defining interoperable Processes")]),e._v(" "),t("p",[e._v("Defining a common set of pre-defined processes was a very long and challenging task.")]),e._v(" "),t("ol",[t("li",[e._v("First, we had to come up with a useful schema that allowed us to describe processes in JSON. We got inspired by different other standards such as "),t("a",{attrs:{href:"https://www.ogc.org/standards/wps",target:"_blank",rel:"noopener noreferrer"}},[e._v("WPS"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"http://spec.openapis.org/oas/v3.0.3",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Second, we had to find what processes are required and which granularity they should have. That quickly led to over "),t("a",{attrs:{href:"https://processes.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("a hundred processes"),t("OutboundLink")],1),e._v(", mainly for data cube and math operations. And that was only for mostly raster operations. We still have a big hole in the processes regarding vector related operations, but we aim to close that in the next year(s).")]),e._v(" "),t("li",[e._v("Third, we had to figure out what common processing softwares offered and how to come up with process definitions than can be implemented with those softwares.")]),e._v(" "),t("li",[e._v("Last, we had to specify it in a way that is unambiguous and easy to understand by users.")])]),e._v(" "),t("p",[e._v("All of these tasks took much more time than initially expected. For example, one of the partners reported that the granularity of the processes is not really suited for the underlying processing software. While we couldn't really change the granularity, it was at least not an issue to make openEO work for them. Fortunately, the process part of the openEO API is very flexible and allows providers to change the processes according to their needs or define their own processes. Due to the fact that the actual parameters and return values are described in JSON Schema, clients and back-ends can easily re-use existing JSON Schema implementations and adopt to changes in the process specifications. Thus, if a back-end doesn't support parts of a process, it can just be changed/removed and a client can understand that and cater for it.")]),e._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("This was a deep dive into "),t("em",[e._v("some")]),e._v(" of my challenges during the last years. I hope it is useful for others and I'm hoping to get into discussions with developers facing similar issues. Maybe with joint forces we can solve some of these for a better cloud processing experience in the future. If you have anything to say, please contact me via "),t("a",{attrs:{href:"mailto:m.mohr@uni-muenster.de"}},[e._v("e-mail")]),e._v(", GitHub issues ("),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api",target:"_blank",rel:"noopener noreferrer"}},[e._v("API"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes"),t("OutboundLink")],1),e._v(") or "),t("a",{attrs:{href:"https://twitter.com/matthmohr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Twitter"),t("OutboundLink")],1),e._v(". You can also "),t("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact openEO")]),e._v(".")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[97],{548:function(e,t,o){"use strict";o.r(t);var n=o(4),a=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("With openEO, we are digging into new grounds regarding the interoperability of big Earth observation clouds. While we could address a lot of problems that came up, some issues remained that we couldn't solve. This article explains "),t("em",[e._v("some")]),e._v(" of the lessons learned and thus also gives an honest overview about current limitations of the openEO API.")]),e._v(" "),t("h2",{attrs:{id:"_1-collection-names"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-collection-names"}},[e._v("#")]),e._v(" 1. Collection Names")]),e._v(" "),t("p",[e._v("The naming of data sets (collections) is different across providers. We thought about recommending to follow lists like the "),t("a",{attrs:{href:"http://database.eohandbook.com/database/missionindex.aspx",target:"_blank",rel:"noopener noreferrer"}},[e._v("CEOS Mission Index"),t("OutboundLink")],1),e._v(", but then the question is what data does it really refer to? It lists "),t("code",[e._v("Sentinel-2 A")]),e._v(" and "),t("code",[e._v("Sentinel-2 B")]),e._v(", but would that be Level 1C or 2A or something completely different? Therefore, openEO decided to not enforce any naming scheme as data sets throughout the affiliated providers were mostly differently pre-processed anyway. To improve the situation, openEO allows to define process parameters. This allows to define algorithms independently of data set names, which can later be assigned when executing the process. Also, openEO recommends to split processing instructions into two parts: data loading/pre-processing and the actual algorithm.")]),e._v(" "),t("p",[e._v("Some more background information can be found in the corresponding "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/52",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub issue"),t("OutboundLink")],1),e._v(". In general, many limitations (including the following) concern the data holdings of the providers and may hopefully be solved by initiatives that work on Analysis Ready Data (ARD).")]),e._v(" "),t("h2",{attrs:{id:"_2-other-names"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-other-names"}},[e._v("#")]),e._v(" 2. Other Names")]),e._v(" "),t("p",[e._v("Similarly, the naming of bands (and potentially other dimension labels, too) are inconsistent across providers, we faced names such as "),t("code",[e._v("B2")]),e._v(", "),t("code",[e._v("B02")]),e._v(", "),t("code",[e._v("2")]),e._v(" or "),t("code",[e._v("blue")]),e._v(" for Sentinel-2. openEO doesn't enforce any naming scheme, but has found ways to improve the situation for users. First, process parameters can be used (see above). Second, bands can also be specified using the "),t("a",{attrs:{href:"https://github.com/radiantearth/stac-spec/tree/v0.9.0/extensions/eo#common-band-names",target:"_blank",rel:"noopener noreferrer"}},[e._v("common names as specified by STAC"),t("OutboundLink")],1),e._v(" or wavelength ranges. openEO recommends to use common names whenever available.")]),e._v(" "),t("p",[e._v("For example, to avoid specific naming you could filter for Sentinel-2 (A and B) band 2 as follows:")]),e._v(" "),t("ul",[t("li",[e._v("by common name: "),t("code",[e._v("filter_bands(data = cube, bands = ['blue'])")]),e._v(" (blue maps to the wavelength range 0.45 - 0.50 according to STAC)")]),e._v(" "),t("li",[e._v("by wavelength, specified in μm: "),t("code",[e._v("filter_bands(data = cube, wavelength = [[0.49, 0.50]])")]),e._v(" (wavelength is 0.4966 for Sentinel-2A and 0.4921 for Sentinel-2B)")])]),e._v(" "),t("p",[e._v("In general, metadata is aligned for usage in openEO processes by using the "),t("a",{attrs:{href:"https://www.stacspec.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("STAC specification"),t("OutboundLink")],1),e._v(", which improves interoperability.")]),e._v(" "),t("h2",{attrs:{id:"_3-chunked-collections"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-chunked-collections"}},[e._v("#")]),e._v(" 3. Chunked Collections")]),e._v(" "),t("p",[e._v("Some providers (for example "),t("a",{attrs:{href:"https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google Earth Engine"),t("OutboundLink")],1),e._v(") expose data sets such as Sentinel-2 L2A as one large collection. Other providers expose the data sets split into groups, e.g. chunked by CRS and resolution. EURAC has collections such as "),t("code",[e._v("S2_32632_60m_L2A")]),e._v(" or "),t("code",[e._v("S2_32635_10m_L2A")]),e._v(" for example. There are valid "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/180",target:"_blank",rel:"noopener noreferrer"}},[e._v("reasons"),t("OutboundLink")],1),e._v(" for any of the implementations, but to explain them is too much for this article. Unfortunately, those differences decrease the interoperability and in the end the re-usability of the processes. openEO aims to make algorithms re-usable and thus recommends to split processing instructions into two parts: data loading/pre-processing and the actual algorithm. This allows greater re-usability of the algorithms.")]),e._v(" "),t("h2",{attrs:{id:"_4-what-to-specify"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-what-to-specify"}},[e._v("#")]),e._v(" 4. What to specify?")]),e._v(" "),t("p",[e._v("The API has a focus on Service and Data Discovery, Data Processing and Result Retrieval/Publishing. Some more customer-oriented tasks such as user registration and payments are not handled through the openEO API. These aspects are too different across providers and can be handled more efficiently through external interfaces. Most providers already offer such services independently of the openEO API implementation anyway to offer their pre-openEO services.")]),e._v(" "),t("p",[e._v("Still, the openEO API uses OpenID Connect as main Authentication and Authorization mechanism (see also point 5). "),t("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" has a "),t("a",{attrs:{href:"https://openid.net/specs/openid-connect-prompt-create-1_0.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("User Registration extension draft"),t("OutboundLink")],1),e._v(" that can be used by back-ends and may be adopted in the future. We closely follow upcoming specifications and standards and are happy to adopt anything useful.")]),e._v(" "),t("h3",{attrs:{id:"file-formats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#file-formats"}},[e._v("#")]),e._v(" File Formats")]),e._v(" "),t("p",[e._v("Similarly, file "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/63",target:"_blank",rel:"noopener noreferrer"}},[e._v("formats"),t("OutboundLink")],1),e._v(" and their "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/issues/32",target:"_blank",rel:"noopener noreferrer"}},[e._v("options"),t("OutboundLink")],1),e._v(' are often very different between processing software. That is why GDAL exists. To improve interoperability, the openEO API just recommends to align them with GDAL, which is used in most relevant software anyway. Unfortunately, this comes with some small inconveniences. For example, most people would probably expect to just specify "GeoTiff" as file format name, but GDAL has named it "GTiff". Another idea was to use '),t("a",{attrs:{href:"https://www.iana.org/assignments/media-types/media-types.xhtml",target:"_blank",rel:"noopener noreferrer"}},[e._v("media types"),t("OutboundLink")],1),e._v(" such as "),t("code",[e._v("application/json")]),e._v(", but then we realized that these are often to broad or not even defined. For example, openEO had to "),t("a",{attrs:{href:"https://github.com/opengeospatial/geotiff/issues/34",target:"_blank",rel:"noopener noreferrer"}},[e._v("push the OGC"),t("OutboundLink")],1),e._v(" to specify an official media type for GeoTiff. But the same issue exists for other file formats, too.")]),e._v(" "),t("h2",{attrs:{id:"_5-authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-authentication"}},[e._v("#")]),e._v(" 5. Authentication")]),e._v(" "),t("p",[e._v("One of the most complex issues we faced during the API development was actually not EO or data processing related. It was the Authentication and Authorization mechanism. We quickly decided to use one of the well-established standards available for security reasons. Unfortunately, most of them don't seem to cater very well for our use case where you have a number of different clients and back-ends communicating with each other. Usually in the Web you have multiple clients communicating with a single back-end ("),t("em",[e._v("1:n")]),e._v("), but in openEO we have a "),t("em",[e._v("n:m")]),e._v(" relation. There are CLI tools, web clients and more that need to authenticate against a growing set of independent providers. Therefore, you can't easily ship clients with security measures like Client IDs (and Client Secrets) as required by "),t("a",{attrs:{href:"https://openid.net/connect/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenID Connect"),t("OutboundLink")],1),e._v(" (based on "),t("a",{attrs:{href:"https://oauth.net/2/",target:"_blank",rel:"noopener noreferrer"}},[e._v("OAuth 2"),t("OutboundLink")],1),e._v("). Users need to get those information by themselves and provide it to the clients, which is inconvenient and probably confusing to many non-developers. This issue is probably the thing I dislike most in the current API specification and thus would love to hear from you whether there are good solutions out there that we missed.")]),e._v(" "),t("h2",{attrs:{id:"_6-debugging-experience"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-debugging-experience"}},[e._v("#")]),e._v(" 6. Debugging Experience")]),e._v(" "),t("p",[e._v('The logging and debugging experience varies a lot between cloud processing and the "traditional workflow" (you download data and compute locally with your preferred tools). While it\'s "free" on a local machine to just do "trial and error" to check whether something is running, cloud processing usually comes with a cost and you likely don\'t want to work with "trial and error". Also you don\'t directly have access to the hardware and software and thus it is harder to investigate problems. openEO took several measures to mitigate these issues, but it is still a different experience for users. I guess that is a long learning process until it is adopted by users and may need additional effort to implement tools to improve the situation. While many users are getting used to it in situations where a streamlined experience is somewhat possible as only few clients communicate with a single provider (e.g. Google Earth Engine), the issue increases in openEO due to the different infrastructure and software used on back-end side.')]),e._v(" "),t("h2",{attrs:{id:"_7-defining-interoperable-processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_7-defining-interoperable-processes"}},[e._v("#")]),e._v(" 7. Defining interoperable Processes")]),e._v(" "),t("p",[e._v("Defining a common set of pre-defined processes was a very long and challenging task.")]),e._v(" "),t("ol",[t("li",[e._v("First, we had to come up with a useful schema that allowed us to describe processes in JSON. We got inspired by different other standards such as "),t("a",{attrs:{href:"https://www.ogc.org/standards/wps",target:"_blank",rel:"noopener noreferrer"}},[e._v("WPS"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"http://spec.openapis.org/oas/v3.0.3",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenAPI"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Second, we had to find what processes are required and which granularity they should have. That quickly led to over "),t("a",{attrs:{href:"https://processes.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("a hundred processes"),t("OutboundLink")],1),e._v(", mainly for data cube and math operations. And that was only for mostly raster operations. We still have a big hole in the processes regarding vector related operations, but we aim to close that in the next year(s).")]),e._v(" "),t("li",[e._v("Third, we had to figure out what common processing softwares offered and how to come up with process definitions than can be implemented with those softwares.")]),e._v(" "),t("li",[e._v("Last, we had to specify it in a way that is unambiguous and easy to understand by users.")])]),e._v(" "),t("p",[e._v("All of these tasks took much more time than initially expected. For example, one of the partners reported that the granularity of the processes is not really suited for the underlying processing software. While we couldn't really change the granularity, it was at least not an issue to make openEO work for them. Fortunately, the process part of the openEO API is very flexible and allows providers to change the processes according to their needs or define their own processes. Due to the fact that the actual parameters and return values are described in JSON Schema, clients and back-ends can easily re-use existing JSON Schema implementations and adopt to changes in the process specifications. Thus, if a back-end doesn't support parts of a process, it can just be changed/removed and a client can understand that and cater for it.")]),e._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("This was a deep dive into "),t("em",[e._v("some")]),e._v(" of my challenges during the last years. I hope it is useful for others and I'm hoping to get into discussions with developers facing similar issues. Maybe with joint forces we can solve some of these for a better cloud processing experience in the future. If you have anything to say, please contact me via "),t("a",{attrs:{href:"mailto:m.mohr@uni-muenster.de"}},[e._v("e-mail")]),e._v(", GitHub issues ("),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api",target:"_blank",rel:"noopener noreferrer"}},[e._v("API"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Processes"),t("OutboundLink")],1),e._v(") or "),t("a",{attrs:{href:"https://twitter.com/matthmohr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Twitter"),t("OutboundLink")],1),e._v(". You can also "),t("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact openEO")]),e._v(".")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/98.bd12d86f.js b/assets/js/98.5d216eea.js similarity index 99% rename from assets/js/98.bd12d86f.js rename to assets/js/98.5d216eea.js index 8d2b7da8f..fc1f4bbfc 100644 --- a/assets/js/98.bd12d86f.js +++ b/assets/js/98.5d216eea.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[98],{546:function(e,t,s){"use strict";s.r(t);var o=s(4),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("After two release candidates in early 2020, the openEO Consortium released the first stable version of its "),t("a",{attrs:{href:"https://api.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API"),t("OutboundLink")],1),e._v(" and their set of "),t("a",{attrs:{href:"https://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("common processes"),t("OutboundLink")],1),e._v(". This blog post gives an overview of the most notable changes since "),t("RouterLink",{attrs:{to:"/news/2019-03-07-openeo-api-040.html"}},[e._v("version 0.4")]),e._v(" and provides an outlook on the next months' project activity.")],1),e._v(" "),t("p",[t("em",[e._v("For those who are new to openEO, we have developed an open API to connect R, Python, JavaScript and other clients to big Earth observation cloud back-ends in a simple and unified way. The idea is that this will make cloud-based processing of large satellite image collections, or other data cubes such as weather model data easier for data scientists. The entire development process has been open, and all "),t("RouterLink",{attrs:{to:"/software.html"}},[e._v("software")]),e._v(" developed in this project is open source and available on "),t("a",{attrs:{href:"https://github.com/open-eo",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1),e._v(". For more information about openEO, please read "),t("RouterLink",{attrs:{to:"/about.html"}},[e._v("page about the project")]),e._v(" first.")],1)]),e._v(" "),t("h2",{attrs:{id:"processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),t("p",[e._v("The most important change was introduced just recently in openEO API version 1.0.0 RC2. Until then, openEO process graphs allowed users to express processing algorithms and execute them on a back-end using "),t("em",[e._v("pre-defined processes")]),e._v(" exposed by a back-end provider. While this still exists, a user can now also promote a process graph to a full openEO process description, following the same schema as the pre-defined processes: it must include the processing instructions and metadata like an identifier, parameters, return values, examples etc. This allows "),t("em",[e._v("user-defined processes")]),e._v(" to be stored and used like pre-defined processes, enabling users to extend the processing capabilities of a back-end. Users can now encapsulate algorithms in separate user-defined processes and re-use these in other user-defined processes. This also allows the exchange of processes (algorithms) between users and back-ends, and creates the possibility for a repository of user-contributed processes that other users can benefit from. A place for finding and sharing such processes is (planned to be) the "),t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Through user-defined processes (and user defined functions) users may also be able to substitute processes that back-ends have not implemented. In fact, several pre-defined processes are defined with alternative processing instructions that use other openEO pre-defined processes to solve the task. For example, the pre-defined process "),t("code",[e._v("normalized_ difference")]),e._v(" can be emulated with a combination of the processes "),t("code",[e._v("add")]),e._v(", "),t("code",[e._v("subtract")]),e._v(" and "),t("code",[e._v("divide")]),e._v(". So if a back-end is missing the "),t("code",[e._v("normalized_difference")]),e._v(" process, a user can just "),t("a",{attrs:{href:"https://processes.openeo.org/#normalized_difference",target:"_blank",rel:"noopener noreferrer"}},[e._v("download it"),t("OutboundLink")],1),e._v(" and use an openEO client to push it to the back-end where it then acts as drop-in replacement for the missing pre-defined process. In the future we plan to allow just using the URL of the process, so that no download/upload would be required.")]),e._v(" "),t("p",[e._v("As mentioned above, openEO offers a set of "),t("a",{attrs:{href:"https://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("common processes"),t("OutboundLink")],1),e._v(" to improve interoperability and portability between back-ends. This is not a complete list and is expected to be extended by the openEO Consortium. More than that, we would like to see that processes arise from the community and that we can take over and standardize whatever comes up and is useful for the different domains working with openEO. We can then simply use the user-defined processes as they share the same schema as the pre-defined processes.")]),e._v(" "),t("p",[e._v("The pre-defined openEO processes are released separately from the API to ensure a faster release cycle than we plan for the API. We want to be able to quickly adapt to community needs with additional processes. Future version of the processes are valid with any future API version through the specification of the process metadata standard in openEO.")]),e._v(" "),t("p",[e._v("The pre-defined processes itself also got an update just after the API release, but "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/blob/1.0.0/CHANGELOG.md#100---2020-07-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("the changes"),t("OutboundLink")],1),e._v(" are relatively small compared to the API. The focus was to clarify unspecified and ambiguous parts of the specification. Some processes such as "),t("code",[e._v("apply_neighborhood")]),e._v(" and "),t("code",[e._v("constant")]),e._v(" were added for the use cases. In collaboration with "),t("a",{attrs:{href:"https://jwagemann.github.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Julia Wagemann"),t("OutboundLink")],1),e._v(" from the "),t("a",{attrs:{href:"https://www.ecmwf.int/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ECMWF"),t("OutboundLink")],1),e._v(" we started defining processes such as "),t("code",[e._v("aggregate_temporal_frequency")]),e._v(", "),t("code",[e._v("anomaly")]),e._v(" and "),t("code",[e._v("climatological_normal")]),e._v(" for climatology and meteorology use-cases. Unfortunately, this effort could not be finished yet due to the COVID-19 situation. We want to continue to broaden the processes to be useful for more domains apart from core Earth Observation.")]),e._v(" "),t("h2",{attrs:{id:"stac-and-ogc-apis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stac-and-ogc-apis"}},[e._v("#")]),e._v(" STAC and OGC APIs")]),e._v(" "),t("p",[e._v("The openEO API now supports STAC (API) versions 0.9 and 1.x, which implements OGC API - Features. Thus, a potential integration of the openEO API with upcoming OGC API standards should be easy to establish.")]),e._v(" "),t("h2",{attrs:{id:"user-defined-functions-udfs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions-udfs"}},[e._v("#")]),e._v(" User-defined Functions (UDFs)")]),e._v(" "),t("p",[t("em",[e._v("Note: Don't get confused, user-defined processes and user-defined functions describe different things.")])]),e._v(" "),t("p",[e._v("Although already foreseen in API version 0.4.0, the openEO UDF API has evolved and is better integrated in the openEO API. It now allows to run Docker containers or custom scripts in potentially any programming language. The UDF API itself is not part of the openEO API, but is a separate specification to describe the data exchange between a back-end implementing the openEO API and a UDF API instance. The UDF API is in release candidate phase and we'll likely post a separate blog post focussing solely on them. Currently, implementations in R and Python are available. It is foreseen that users could also host their own UDF API instances and call them from remote back-ends.")]),e._v(" "),t("h2",{attrs:{id:"other-improvements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other-improvements"}},[e._v("#")]),e._v(" Other improvements")]),e._v(" "),t("p",[e._v("Other notable changes and additions:")]),e._v(" "),t("ul",[t("li",[e._v("Support for importing user-provided data sets has been added.")]),e._v(" "),t("li",[e._v("Providers can now expose their terms of service and privacy policies.")]),e._v(" "),t("li",[e._v("The WebSocket-based Subscription API for notifications and monitoring introduced in version 0.4 has been replaced by a logging mechanism in the HTTP API. This makes implementing the API easier for clients and back-ends, but doesn't work in real-time any longer.")])]),e._v(" "),t("p",[e._v("The full set of changes can be found in the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/blob/1.0.0/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("API's change log"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"limitations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#limitations"}},[e._v("#")]),e._v(" Limitations")]),e._v(" "),t("p",[e._v("With openEO, we are digging into new grounds regarding the interoperability of big Earth observation clouds. While we could solve a lot of issues that came up, there were some issues that we couldn't solve as part of the API and processes. We want to be honest and give some insights into the lessons learned, so I have posted these as a "),t("RouterLink",{attrs:{to:"/news/2020-07-31-lessons-learned.html"}},[e._v("separate blog post")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"next-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[e._v("#")]),e._v(" Next steps")]),e._v(" "),t("p",[e._v("The API's development went through several iterations and is working well for our broad range of use cases, which we'll report soon. "),t("RouterLink",{attrs:{to:"/software.html"}},[e._v("Implementations")]),e._v(" by several organizations for several API versions provide evidence that the API and the processes are useful for a wide range of use cases. Client and back-end developers will now finish their implementations and we hope to have the first operational services this year. We will follow up with new blog posts once other releases are available. If you are interested in trying out openEO, please "),t("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact us")]),e._v(" to get more information.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[98],{547:function(e,t,s){"use strict";s.r(t);var o=s(4),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("After two release candidates in early 2020, the openEO Consortium released the first stable version of its "),t("a",{attrs:{href:"https://api.openeo.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO API"),t("OutboundLink")],1),e._v(" and their set of "),t("a",{attrs:{href:"https://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("common processes"),t("OutboundLink")],1),e._v(". This blog post gives an overview of the most notable changes since "),t("RouterLink",{attrs:{to:"/news/2019-03-07-openeo-api-040.html"}},[e._v("version 0.4")]),e._v(" and provides an outlook on the next months' project activity.")],1),e._v(" "),t("p",[t("em",[e._v("For those who are new to openEO, we have developed an open API to connect R, Python, JavaScript and other clients to big Earth observation cloud back-ends in a simple and unified way. The idea is that this will make cloud-based processing of large satellite image collections, or other data cubes such as weather model data easier for data scientists. The entire development process has been open, and all "),t("RouterLink",{attrs:{to:"/software.html"}},[e._v("software")]),e._v(" developed in this project is open source and available on "),t("a",{attrs:{href:"https://github.com/open-eo",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1),e._v(". For more information about openEO, please read "),t("RouterLink",{attrs:{to:"/about.html"}},[e._v("page about the project")]),e._v(" first.")],1)]),e._v(" "),t("h2",{attrs:{id:"processes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#processes"}},[e._v("#")]),e._v(" Processes")]),e._v(" "),t("p",[e._v("The most important change was introduced just recently in openEO API version 1.0.0 RC2. Until then, openEO process graphs allowed users to express processing algorithms and execute them on a back-end using "),t("em",[e._v("pre-defined processes")]),e._v(" exposed by a back-end provider. While this still exists, a user can now also promote a process graph to a full openEO process description, following the same schema as the pre-defined processes: it must include the processing instructions and metadata like an identifier, parameters, return values, examples etc. This allows "),t("em",[e._v("user-defined processes")]),e._v(" to be stored and used like pre-defined processes, enabling users to extend the processing capabilities of a back-end. Users can now encapsulate algorithms in separate user-defined processes and re-use these in other user-defined processes. This also allows the exchange of processes (algorithms) between users and back-ends, and creates the possibility for a repository of user-contributed processes that other users can benefit from. A place for finding and sharing such processes is (planned to be) the "),t("a",{attrs:{href:"https://hub.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("openEO Hub"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Through user-defined processes (and user defined functions) users may also be able to substitute processes that back-ends have not implemented. In fact, several pre-defined processes are defined with alternative processing instructions that use other openEO pre-defined processes to solve the task. For example, the pre-defined process "),t("code",[e._v("normalized_ difference")]),e._v(" can be emulated with a combination of the processes "),t("code",[e._v("add")]),e._v(", "),t("code",[e._v("subtract")]),e._v(" and "),t("code",[e._v("divide")]),e._v(". So if a back-end is missing the "),t("code",[e._v("normalized_difference")]),e._v(" process, a user can just "),t("a",{attrs:{href:"https://processes.openeo.org/#normalized_difference",target:"_blank",rel:"noopener noreferrer"}},[e._v("download it"),t("OutboundLink")],1),e._v(" and use an openEO client to push it to the back-end where it then acts as drop-in replacement for the missing pre-defined process. In the future we plan to allow just using the URL of the process, so that no download/upload would be required.")]),e._v(" "),t("p",[e._v("As mentioned above, openEO offers a set of "),t("a",{attrs:{href:"https://processes.openeo.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("common processes"),t("OutboundLink")],1),e._v(" to improve interoperability and portability between back-ends. This is not a complete list and is expected to be extended by the openEO Consortium. More than that, we would like to see that processes arise from the community and that we can take over and standardize whatever comes up and is useful for the different domains working with openEO. We can then simply use the user-defined processes as they share the same schema as the pre-defined processes.")]),e._v(" "),t("p",[e._v("The pre-defined openEO processes are released separately from the API to ensure a faster release cycle than we plan for the API. We want to be able to quickly adapt to community needs with additional processes. Future version of the processes are valid with any future API version through the specification of the process metadata standard in openEO.")]),e._v(" "),t("p",[e._v("The pre-defined processes itself also got an update just after the API release, but "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-processes/blob/1.0.0/CHANGELOG.md#100---2020-07-31",target:"_blank",rel:"noopener noreferrer"}},[e._v("the changes"),t("OutboundLink")],1),e._v(" are relatively small compared to the API. The focus was to clarify unspecified and ambiguous parts of the specification. Some processes such as "),t("code",[e._v("apply_neighborhood")]),e._v(" and "),t("code",[e._v("constant")]),e._v(" were added for the use cases. In collaboration with "),t("a",{attrs:{href:"https://jwagemann.github.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Julia Wagemann"),t("OutboundLink")],1),e._v(" from the "),t("a",{attrs:{href:"https://www.ecmwf.int/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ECMWF"),t("OutboundLink")],1),e._v(" we started defining processes such as "),t("code",[e._v("aggregate_temporal_frequency")]),e._v(", "),t("code",[e._v("anomaly")]),e._v(" and "),t("code",[e._v("climatological_normal")]),e._v(" for climatology and meteorology use-cases. Unfortunately, this effort could not be finished yet due to the COVID-19 situation. We want to continue to broaden the processes to be useful for more domains apart from core Earth Observation.")]),e._v(" "),t("h2",{attrs:{id:"stac-and-ogc-apis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stac-and-ogc-apis"}},[e._v("#")]),e._v(" STAC and OGC APIs")]),e._v(" "),t("p",[e._v("The openEO API now supports STAC (API) versions 0.9 and 1.x, which implements OGC API - Features. Thus, a potential integration of the openEO API with upcoming OGC API standards should be easy to establish.")]),e._v(" "),t("h2",{attrs:{id:"user-defined-functions-udfs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-functions-udfs"}},[e._v("#")]),e._v(" User-defined Functions (UDFs)")]),e._v(" "),t("p",[t("em",[e._v("Note: Don't get confused, user-defined processes and user-defined functions describe different things.")])]),e._v(" "),t("p",[e._v("Although already foreseen in API version 0.4.0, the openEO UDF API has evolved and is better integrated in the openEO API. It now allows to run Docker containers or custom scripts in potentially any programming language. The UDF API itself is not part of the openEO API, but is a separate specification to describe the data exchange between a back-end implementing the openEO API and a UDF API instance. The UDF API is in release candidate phase and we'll likely post a separate blog post focussing solely on them. Currently, implementations in R and Python are available. It is foreseen that users could also host their own UDF API instances and call them from remote back-ends.")]),e._v(" "),t("h2",{attrs:{id:"other-improvements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other-improvements"}},[e._v("#")]),e._v(" Other improvements")]),e._v(" "),t("p",[e._v("Other notable changes and additions:")]),e._v(" "),t("ul",[t("li",[e._v("Support for importing user-provided data sets has been added.")]),e._v(" "),t("li",[e._v("Providers can now expose their terms of service and privacy policies.")]),e._v(" "),t("li",[e._v("The WebSocket-based Subscription API for notifications and monitoring introduced in version 0.4 has been replaced by a logging mechanism in the HTTP API. This makes implementing the API easier for clients and back-ends, but doesn't work in real-time any longer.")])]),e._v(" "),t("p",[e._v("The full set of changes can be found in the "),t("a",{attrs:{href:"https://github.com/Open-EO/openeo-api/blob/1.0.0/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("API's change log"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"limitations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#limitations"}},[e._v("#")]),e._v(" Limitations")]),e._v(" "),t("p",[e._v("With openEO, we are digging into new grounds regarding the interoperability of big Earth observation clouds. While we could solve a lot of issues that came up, there were some issues that we couldn't solve as part of the API and processes. We want to be honest and give some insights into the lessons learned, so I have posted these as a "),t("RouterLink",{attrs:{to:"/news/2020-07-31-lessons-learned.html"}},[e._v("separate blog post")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"next-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[e._v("#")]),e._v(" Next steps")]),e._v(" "),t("p",[e._v("The API's development went through several iterations and is working well for our broad range of use cases, which we'll report soon. "),t("RouterLink",{attrs:{to:"/software.html"}},[e._v("Implementations")]),e._v(" by several organizations for several API versions provide evidence that the API and the processes are useful for a wide range of use cases. Client and back-end developers will now finish their implementations and we hope to have the first operational services this year. We will follow up with new blog posts once other releases are available. If you are interested in trying out openEO, please "),t("RouterLink",{attrs:{to:"/contact.html"}},[e._v("contact us")]),e._v(" to get more information.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/99.d2832f90.js b/assets/js/99.9cd13a05.js similarity index 99% rename from assets/js/99.d2832f90.js rename to assets/js/99.9cd13a05.js index 5f24cf1b6..e3e3e9e84 100644 --- a/assets/js/99.d2832f90.js +++ b/assets/js/99.9cd13a05.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[99],{548:function(t,e,r){"use strict";r.r(e);var s=r(4),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h3",{attrs:{id:"update"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#update"}},[t._v("#")]),t._v(" UPDATE:")]),t._v(" "),e("p",[e("strong",[t._v("Presentations")]),t._v(" and "),e("strong",[t._v("Notebooks")]),t._v(" of the user workshop can be downloaded "),e("a",{attrs:{href:"https://owncloud.tuwien.ac.at/index.php/s/c469i4hvgaR15Ip",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("hr"),t._v(" "),e("p",[t._v("openEO hosts a (virtual) user workshop on "),e("strong",[t._v("19 October 2020")]),t._v(" (10:30 - 16:30 CEST in two parts) and encourages interested parties to register for this event at "),e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/openEOUserWorkshop",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://ec.europa.eu/eusurvey/runner/openEOUserWorkshop"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("Needed preparation:")]),t._v(" Manuals for installing the various client APIs, recommended for testing openEO in guided sessions, can be found in the "),e("em",[t._v("User Documentation")]),t._v(" under "),e("em",[e("RouterLink",{attrs:{to:"/documentation/1.0/"}},[t._v("Getting Started")])],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("User questionnaire:")]),t._v(" Please help us also by spending some minutes for this "),e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/OpenEOFinalUserWorkshop",target:"_blank",rel:"noopener noreferrer"}},[t._v("user questionnaire"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("Access details")]),t._v(": Please click the session topics below to connect to the corresponding sessions in Microsoft Teams.")]),t._v(" "),e("p",[e("strong",[t._v("Agenda:")])]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Part 1")])]),t._v(" "),e("tr",[e("th",[t._v("No.")]),t._v(" "),e("th",[t._v("Start")]),t._v(" "),e("th",[t._v("Duration")]),t._v(" "),e("th",[t._v("Topic")]),t._v(" "),e("th",[t._v("Remark")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("1.1")]),t._v(" "),e("td",[t._v("10:30h")]),t._v(" "),e("td",[t._v("30min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Introduction into openEO + technical overview")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.2")]),t._v(" "),e("td",[t._v("11:00h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Overview backends")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.3")]),t._v(" "),e("td",[t._v("11:20h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Overview processes + documentation")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.4")]),t._v(" "),e("td",[t._v("11:40h")]),t._v(" "),e("td",[t._v("5min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Installation of openEO")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.5")]),t._v(" "),e("td",[t._v("11:45h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Q/A: Backends, Installation, Q/A Chat")])]),t._v(" "),e("td",[t._v("Questionaire")])]),t._v(" "),e("tr",[e("td",{attrs:{colspan:"5"}},[e("i",[t._v("Break for users to install openEO, partners stay available in chat for answering questions on that in bilateral talks")])])]),t._v(" "),e("tr",[e("td",{attrs:{colspan:"5"}})])]),t._v(" "),e("thead",[e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Part 2")])]),t._v(" "),e("tr",[e("th",[t._v("No.")]),t._v(" "),e("th",[t._v("Start")]),t._v(" "),e("th",[t._v("Duration")]),t._v(" "),e("th",[t._v("Topic")]),t._v(" "),e("th",[t._v("Remark")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("2.1")]),t._v(" "),e("td",[t._v("14:00h")]),t._v(" "),e("td",[t._v("5min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Welcome back / Ways for users to approach to openEO")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Live Demontrations, Part 1")])]),t._v(" "),e("tr",[e("td",[t._v("2.2a")]),t._v(" "),e("td",[t._v("14:05h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Python Client")])]),t._v(" "),e("td",{attrs:{rowspan:"2"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.2b")]),t._v(" "),e("td",[t._v("14:05h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("JavaScript Client + mobile application")])])]),t._v(" "),e("tr",[e("td"),t._v(" "),e("td",[e("i",[t._v("14:25h")])]),t._v(" "),e("td",[e("i",[t._v("5min")])]),t._v(" "),e("td",{attrs:{colspan:"2"}},[e("i",[t._v("Short break / Switching sessions")])])]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Live Demontrations, Part 2")])]),t._v(" "),e("tr",[e("td",[t._v("2.3a")]),t._v(" "),e("td",[t._v("14:30h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Web Editor + QGIS")])]),t._v(" "),e("td",{attrs:{rowspan:"2"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.3b")]),t._v(" "),e("td",[t._v("14:30h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("R Client")])])]),t._v(" "),e("tr",[e("td"),t._v(" "),e("td",[e("i",[t._v("14:50h")])]),t._v(" "),e("td",[e("i",[t._v("5min")])]),t._v(" "),e("td",{attrs:{colspan:"2"}},[e("i",[t._v("Short break / Switching sessions")])])]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Guided Sessions and Q/A")])]),t._v(" "),e("tr",[e("td",[t._v("2.4a")]),t._v(" "),e("td",[t._v("14:55h")]),t._v(" "),e("td",[t._v("60min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Guided room for users to test the R Client")])]),t._v(" "),e("td",{attrs:{rowspan:"3"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.4b")]),t._v(" "),e("td",[t._v("14:55h")]),t._v(" "),e("td",[t._v("60min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("Guided room for users to test the Python Client")])])]),t._v(" "),e("tr",[e("td",[t._v("2.4c")]),t._v(" "),e("td",[t._v("14:55h")]),t._v(" "),e("td",[t._v("60min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/31bt2mH",target:"_blank"}},[t._v("Guided room for users to test other clients")])])]),t._v(" "),e("tr",[e("td",[t._v("2.5a")]),t._v(" "),e("td",[t._v("15:55h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Q/A and Discussions: R Client")])]),t._v(" "),e("td",{attrs:{rowspan:"3"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.5b")]),t._v(" "),e("td",[t._v("15:55h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("Q/A and Discussions: Python")])])]),t._v(" "),e("tr",[e("td",[t._v("2.5c")]),t._v(" "),e("td",[t._v("15:55h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/31bt2mH",target:"_blank"}},[t._v("Q/A and Discussions: Other clients")])])]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Wrap up")])]),t._v(" "),e("tr",[e("td",[t._v("2.6")]),t._v(" "),e("td",[t._v("16:10h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Q/A; Discussion on user needs, future work")])]),t._v(" "),e("td")])])]),t._v(" "),e("p",[e("strong",[t._v("Background:")]),t._v(" openEO is a user-driven open source API, which grants a uniform communication between the Earth Observation (EO) data user community and diverse EO cloud service providers. Thus, it aims for a cross-platform interoperability to ease a comparison, the cooperation and the switch between them. The project consortium (H2020 Grant No 776242) released a stable version of the openEO API, covering standardised online processing of all aspects of an EO data life cycle on diverse cloud platforms.")]),t._v(" "),e("p",[t._v("In this User Workshop, the audience is provided with insight into the functionalities of the openEO API. In various live demonstration and training sessions, real demonstration cases will be explained from the user perspective. Possible applications of the openEO API will be presented for different access levels – from the use of programming languages to browser based model builders or mobile applications. Target audience for this event are programmers, decision makers, as well as third-party cloud EO service providers.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[99],{550:function(t,e,r){"use strict";r.r(e);var s=r(4),a=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h3",{attrs:{id:"update"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#update"}},[t._v("#")]),t._v(" UPDATE:")]),t._v(" "),e("p",[e("strong",[t._v("Presentations")]),t._v(" and "),e("strong",[t._v("Notebooks")]),t._v(" of the user workshop can be downloaded "),e("a",{attrs:{href:"https://owncloud.tuwien.ac.at/index.php/s/c469i4hvgaR15Ip",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("hr"),t._v(" "),e("p",[t._v("openEO hosts a (virtual) user workshop on "),e("strong",[t._v("19 October 2020")]),t._v(" (10:30 - 16:30 CEST in two parts) and encourages interested parties to register for this event at "),e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/openEOUserWorkshop",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://ec.europa.eu/eusurvey/runner/openEOUserWorkshop"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("Needed preparation:")]),t._v(" Manuals for installing the various client APIs, recommended for testing openEO in guided sessions, can be found in the "),e("em",[t._v("User Documentation")]),t._v(" under "),e("em",[e("RouterLink",{attrs:{to:"/documentation/1.0/"}},[t._v("Getting Started")])],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("User questionnaire:")]),t._v(" Please help us also by spending some minutes for this "),e("a",{attrs:{href:"https://ec.europa.eu/eusurvey/runner/OpenEOFinalUserWorkshop",target:"_blank",rel:"noopener noreferrer"}},[t._v("user questionnaire"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("Access details")]),t._v(": Please click the session topics below to connect to the corresponding sessions in Microsoft Teams.")]),t._v(" "),e("p",[e("strong",[t._v("Agenda:")])]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Part 1")])]),t._v(" "),e("tr",[e("th",[t._v("No.")]),t._v(" "),e("th",[t._v("Start")]),t._v(" "),e("th",[t._v("Duration")]),t._v(" "),e("th",[t._v("Topic")]),t._v(" "),e("th",[t._v("Remark")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("1.1")]),t._v(" "),e("td",[t._v("10:30h")]),t._v(" "),e("td",[t._v("30min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Introduction into openEO + technical overview")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.2")]),t._v(" "),e("td",[t._v("11:00h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Overview backends")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.3")]),t._v(" "),e("td",[t._v("11:20h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Overview processes + documentation")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.4")]),t._v(" "),e("td",[t._v("11:40h")]),t._v(" "),e("td",[t._v("5min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Installation of openEO")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("td",[t._v("1.5")]),t._v(" "),e("td",[t._v("11:45h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Q/A: Backends, Installation, Q/A Chat")])]),t._v(" "),e("td",[t._v("Questionaire")])]),t._v(" "),e("tr",[e("td",{attrs:{colspan:"5"}},[e("i",[t._v("Break for users to install openEO, partners stay available in chat for answering questions on that in bilateral talks")])])]),t._v(" "),e("tr",[e("td",{attrs:{colspan:"5"}})])]),t._v(" "),e("thead",[e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Part 2")])]),t._v(" "),e("tr",[e("th",[t._v("No.")]),t._v(" "),e("th",[t._v("Start")]),t._v(" "),e("th",[t._v("Duration")]),t._v(" "),e("th",[t._v("Topic")]),t._v(" "),e("th",[t._v("Remark")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("2.1")]),t._v(" "),e("td",[t._v("14:00h")]),t._v(" "),e("td",[t._v("5min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Welcome back / Ways for users to approach to openEO")])]),t._v(" "),e("td")]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Live Demontrations, Part 1")])]),t._v(" "),e("tr",[e("td",[t._v("2.2a")]),t._v(" "),e("td",[t._v("14:05h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Python Client")])]),t._v(" "),e("td",{attrs:{rowspan:"2"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.2b")]),t._v(" "),e("td",[t._v("14:05h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("JavaScript Client + mobile application")])])]),t._v(" "),e("tr",[e("td"),t._v(" "),e("td",[e("i",[t._v("14:25h")])]),t._v(" "),e("td",[e("i",[t._v("5min")])]),t._v(" "),e("td",{attrs:{colspan:"2"}},[e("i",[t._v("Short break / Switching sessions")])])]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Live Demontrations, Part 2")])]),t._v(" "),e("tr",[e("td",[t._v("2.3a")]),t._v(" "),e("td",[t._v("14:30h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Web Editor + QGIS")])]),t._v(" "),e("td",{attrs:{rowspan:"2"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.3b")]),t._v(" "),e("td",[t._v("14:30h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("R Client")])])]),t._v(" "),e("tr",[e("td"),t._v(" "),e("td",[e("i",[t._v("14:50h")])]),t._v(" "),e("td",[e("i",[t._v("5min")])]),t._v(" "),e("td",{attrs:{colspan:"2"}},[e("i",[t._v("Short break / Switching sessions")])])]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Guided Sessions and Q/A")])]),t._v(" "),e("tr",[e("td",[t._v("2.4a")]),t._v(" "),e("td",[t._v("14:55h")]),t._v(" "),e("td",[t._v("60min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Guided room for users to test the R Client")])]),t._v(" "),e("td",{attrs:{rowspan:"3"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.4b")]),t._v(" "),e("td",[t._v("14:55h")]),t._v(" "),e("td",[t._v("60min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("Guided room for users to test the Python Client")])])]),t._v(" "),e("tr",[e("td",[t._v("2.4c")]),t._v(" "),e("td",[t._v("14:55h")]),t._v(" "),e("td",[t._v("60min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/31bt2mH",target:"_blank"}},[t._v("Guided room for users to test other clients")])])]),t._v(" "),e("tr",[e("td",[t._v("2.5a")]),t._v(" "),e("td",[t._v("15:55h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Q/A and Discussions: R Client")])]),t._v(" "),e("td",{attrs:{rowspan:"3"}},[t._v("Parallel session")])]),t._v(" "),e("tr",[e("td",[t._v("2.5b")]),t._v(" "),e("td",[t._v("15:55h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3iWreUB",target:"_blank"}},[t._v("Q/A and Discussions: Python")])])]),t._v(" "),e("tr",[e("td",[t._v("2.5c")]),t._v(" "),e("td",[t._v("15:55h")]),t._v(" "),e("td",[t._v("15min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/31bt2mH",target:"_blank"}},[t._v("Q/A and Discussions: Other clients")])])]),t._v(" "),e("tr",[e("th",{attrs:{colspan:"5"}},[t._v("Wrap up")])]),t._v(" "),e("tr",[e("td",[t._v("2.6")]),t._v(" "),e("td",[t._v("16:10h")]),t._v(" "),e("td",[t._v("20min")]),t._v(" "),e("td",[e("a",{attrs:{href:"https://bit.ly/3lLblSX",target:"_blank"}},[t._v("Q/A; Discussion on user needs, future work")])]),t._v(" "),e("td")])])]),t._v(" "),e("p",[e("strong",[t._v("Background:")]),t._v(" openEO is a user-driven open source API, which grants a uniform communication between the Earth Observation (EO) data user community and diverse EO cloud service providers. Thus, it aims for a cross-platform interoperability to ease a comparison, the cooperation and the switch between them. The project consortium (H2020 Grant No 776242) released a stable version of the openEO API, covering standardised online processing of all aspects of an EO data life cycle on diverse cloud platforms.")]),t._v(" "),e("p",[t._v("In this User Workshop, the audience is provided with insight into the functionalities of the openEO API. In various live demonstration and training sessions, real demonstration cases will be explained from the user perspective. Possible applications of the openEO API will be presented for different access levels – from the use of programming languages to browser based model builders or mobile applications. Target audience for this event are programmers, decision makers, as well as third-party cloud EO service providers.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/app.b89805b9.js b/assets/js/app.3d9b00a6.js similarity index 77% rename from assets/js/app.b89805b9.js rename to assets/js/app.3d9b00a6.js index fdb615df7..cfe4efe86 100644 --- a/assets/js/app.b89805b9.js +++ b/assets/js/app.3d9b00a6.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,i,s=t[0],l=t[1],c=t[2],p=0,d=[];p=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}(a.path||""),d=t&&t.path||"/",f=c.path?k(c.path,d,n||a.append):d,h=function(e,t,n){void 0===t&&(t={});var r,o=n||p;try{r=o(e||"")}catch(e){r={}}for(var a in t){var i=t[a];r[a]=Array.isArray(i)?i.map(u):u(i)}return r}(c.query,a.query,r&&r.options.parseQuery),v=a.hash||c.hash;return v&&"#"!==v.charAt(0)&&(v="#"+v),{_normalized:!0,path:f,query:h,hash:v}}var q,G=function(){},W={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,a=n.resolve(this.to,r,this.append),i=a.location,s=a.route,l=a.href,c={},u=n.options.linkActiveClass,p=n.options.linkExactActiveClass,d=null==u?"router-link-active":u,v=null==p?"router-link-exact-active":p,m=null==this.activeClass?d:this.activeClass,g=null==this.exactActiveClass?v:this.exactActiveClass,y=s.redirectedFrom?h(null,z(s.redirectedFrom),null,n):s;c[g]=b(r,y,this.exactPath),c[m]=this.exact||this.exactPath?c[g]:function(e,t){return 0===e.path.replace(f,"/").indexOf(t.path.replace(f,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,y);var w=c[g]?this.ariaCurrentValue:null,_=function(e){H(e)&&(t.replace?n.replace(i,G):n.push(i,G))},x={click:H};Array.isArray(this.event)?this.event.forEach((function(e){x[e]=_})):x[this.event]=_;var P={class:c},k=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:l,route:s,navigate:_,isActive:c[m],isExactActive:c[g]});if(k){if(1===k.length)return k[0];if(k.length>1||!k.length)return 0===k.length?e():e("span",{},k)}if("a"===this.tag)P.on=x,P.attrs={href:l,"aria-current":w};else{var S=function e(t){var n;if(t)for(var r=0;r-1&&(s.params[d]=n.params[d]);return s.path=V(u.path,s.params),l(u,s,i)}if(s.path){s.params={};for(var f=0;f-1}function Se(e,t){return ke(e)&&e._isRouter&&(null==t||e.type===t)}function Oe(e,t,n){var r=function(o){o>=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}function Ce(e){return function(t,n,r){var o=!1,a=0,i=null;Ee(e,(function(e,t,n,s){if("function"==typeof e&&void 0===e.cid){o=!0,a++;var l,c=Te((function(t){var o;((o=t).__esModule||$e&&"Module"===o[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:q.extend(t),n.components[s]=t,--a<=0&&r()})),u=Te((function(e){var t="Failed to resolve async component "+s+": "+e;i||(i=ke(e)?e:new Error(t),r(i))}));try{l=e(c,u)}catch(e){u(e)}if(l)if("function"==typeof l.then)l.then(c,u);else{var p=l.component;p&&"function"==typeof p.then&&p.then(c,u)}}})),o||r()}}function Ee(e,t){return je(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function je(e){return Array.prototype.concat.apply([],e)}var $e="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Te(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var Ae=function(e,t){this.router=e,this.base=function(e){if(!e)if(Z){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=m,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Re(e,t,n,r){var o=Ee(e,(function(e,r,o,a){var i=function(e,t){"function"!=typeof e&&(e=q.extend(e));return e.options[t]}(e,t);if(i)return Array.isArray(i)?i.map((function(e){return n(e,r,o,a)})):n(i,r,o,a)}));return je(r?o.reverse():o)}function Ue(e,t){if(t)return function(){return e.apply(t,arguments)}}Ae.prototype.listen=function(e){this.cb=e},Ae.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ae.prototype.onError=function(e){this.errorCbs.push(e)},Ae.prototype.transitionTo=function(e,t,n){var r,o=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var a=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),t&&t(r),o.ensureURL(),o.router.afterHooks.forEach((function(e){e&&e(r,a)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!o.ready&&(Se(e,be.redirected)&&a===m||(o.ready=!0,o.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ae.prototype.confirmTransition=function(e,t,n){var r=this,o=this.current;this.pending=e;var a,i,s=function(e){!Se(e)&&ke(e)&&(r.errorCbs.length?r.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},l=e.matched.length-1,c=o.matched.length-1;if(b(e,o)&&l===c&&e.matched[l]===o.matched[c])return this.ensureURL(),e.hash&&se(this.router,o,e,!1),s(((i=xe(a=o,e,be.duplicated,'Avoided redundant navigation to current location: "'+a.fullPath+'".')).name="NavigationDuplicated",i));var u=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=me&&n;r&&this.listeners.push(ie());var o=function(){var n=e.current,o=Le(e.base);e.current===m&&o===e._startLocation||e.transitionTo(o,(function(e){r&&se(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ge(S(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ye(S(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Le(this.base)!==this.current.fullPath){var t=S(this.base+this.current.fullPath);e?ge(t):ye(t)}},t.prototype.getCurrentLocation=function(){return Le(this.base)},t}(Ae);function Le(e){var t=window.location.pathname,n=t.toLowerCase(),r=e.toLowerCase();return!e||n!==r&&0!==n.indexOf(S(r+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Ie=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=Le(e);if(!/^\/#/.test(t))return window.location.replace(S(e+"/#"+t)),!0}(this.base)||De()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=me&&t;n&&this.listeners.push(ie());var r=function(){var t=e.current;De()&&e.transitionTo(Ne(),(function(r){n&&se(e.router,r,t,!0),me||Be(r.fullPath)}))},o=me?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Je(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Ne()!==t&&(e?Je(t):Be(t))},t.prototype.getCurrentLocation=function(){return Ne()},t}(Ae);function De(){var e=Ne();return"/"===e.charAt(0)||(Be("/"+e),!1)}function Ne(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Fe(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Je(e){me?ge(Fe(e)):window.location.hash=e}function Be(e){me?ye(Fe(e)):window.location.replace(Fe(e))}var Ve=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){Se(e,be.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ae),ze=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Q(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!me&&!1!==e.fallback,this.fallback&&(t="hash"),Z||(t="abstract"),this.mode=t,t){case"history":this.history=new Me(this,e.base);break;case"hash":this.history=new Ie(this,e.base,this.fallback);break;case"abstract":this.history=new Ve(this,e.base);break;default:0}},qe={currentRoute:{configurable:!0}};ze.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},qe.currentRoute.get=function(){return this.history&&this.history.current},ze.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof Me||n instanceof Ie){var r=function(e){n.setupListeners(),function(e){var r=n.current,o=t.options.scrollBehavior;me&&o&&"fullPath"in e&&se(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},ze.prototype.beforeEach=function(e){return We(this.beforeHooks,e)},ze.prototype.beforeResolve=function(e){return We(this.resolveHooks,e)},ze.prototype.afterEach=function(e){return We(this.afterHooks,e)},ze.prototype.onReady=function(e,t){this.history.onReady(e,t)},ze.prototype.onError=function(e){this.history.onError(e)},ze.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},ze.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},ze.prototype.go=function(e){this.history.go(e)},ze.prototype.back=function(){this.go(-1)},ze.prototype.forward=function(){this.go(1)},ze.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},ze.prototype.resolve=function(e,t,n){var r=z(e,t=t||this.history.current,n,this),o=this.match(r,t),a=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(e,t,n){var r="hash"===n?"#"+t:t;return e?S(e+"/"+r):r}(this.history.base,a,this.mode),normalizedTo:r,resolved:o}},ze.prototype.getRoutes=function(){return this.matcher.getRoutes()},ze.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},ze.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(ze.prototype,qe);var Ge=ze;function We(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}ze.install=function e(t){if(!e.installed||q!==t){e.installed=!0,q=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",x),t.component("RouterLink",W);var o=t.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},ze.version="3.6.5",ze.isNavigationFailure=Se,ze.NavigationFailureType=be,ze.START_LOCATION=m,Z&&window.Vue&&window.Vue.use(ze);var He={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(28)]).then(n.bind(null,289)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,180)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(29)]).then(n.bind(null,160)),"components/Home":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,290)),"components/NavLink":()=>n.e(37).then(n.bind(null,159)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,200)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,463)),"components/Page":()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,291)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,205)),"components/PageNav":()=>Promise.all([n.e(0),n.e(21)]).then(n.bind(null,206)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,292)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(30)]).then(n.bind(null,295)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,201)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,181)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,176)),"components/VersionChooser":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,293)),"components/VersioningMixin":()=>n.e(52).then(n.bind(null,164)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,488)),"layouts/404":()=>n.e(7).then(n.bind(null,475)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,476)),NotFound:()=>n.e(7).then(n.bind(null,475)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,476))},Ze={"v-3ec20de4":()=>n.e(54).then(n.bind(null,489)),"v-26232766":()=>n.e(56).then(n.bind(null,490)),"v-5e94256a":()=>n.e(57).then(n.bind(null,491)),"v-31596d2d":()=>n.e(55).then(n.bind(null,492)),"v-5e0de9fe":()=>n.e(59).then(n.bind(null,493)),"v-4155eb1e":()=>n.e(58).then(n.bind(null,494)),"v-63a2d53d":()=>n.e(61).then(n.bind(null,495)),"v-6bf62e0d":()=>n.e(41).then(n.bind(null,496)),"v-418e1b4d":()=>n.e(60).then(n.bind(null,497)),"v-d80ea866":()=>n.e(62).then(n.bind(null,498)),"v-4899abd1":()=>n.e(63).then(n.bind(null,499)),"v-4081eb72":()=>n.e(64).then(n.bind(null,500)),"v-5e5c94cd":()=>n.e(65).then(n.bind(null,501)),"v-25dd3de6":()=>n.e(67).then(n.bind(null,502)),"v-6993aee6":()=>n.e(68).then(n.bind(null,503)),"v-0059cb2a":()=>n.e(66).then(n.bind(null,504)),"v-3359623e":()=>n.e(42).then(n.bind(null,505)),"v-cfac61a6":()=>n.e(69).then(n.bind(null,506)),"v-6aca4be5":()=>n.e(70).then(n.bind(null,507)),"v-37dbaaa0":()=>n.e(71).then(n.bind(null,508)),"v-7758ae27":()=>n.e(72).then(n.bind(null,509)),"v-9f635184":()=>n.e(18).then(n.bind(null,510)),"v-5fd8f1ad":()=>n.e(13).then(n.bind(null,511)),"v-f5de2fb4":()=>n.e(73).then(n.bind(null,512)),"v-8d587926":()=>n.e(76).then(n.bind(null,513)),"v-43de507e":()=>n.e(74).then(n.bind(null,514)),"v-dc734f12":()=>n.e(77).then(n.bind(null,515)),"v-654015de":()=>n.e(75).then(n.bind(null,516)),"v-75018026":()=>n.e(43).then(n.bind(null,517)),"v-1772ad2d":()=>n.e(78).then(n.bind(null,518)),"v-2840d4fe":()=>n.e(80).then(n.bind(null,519)),"v-253cefad":()=>n.e(79).then(n.bind(null,520)),"v-1b45967e":()=>n.e(81).then(n.bind(null,521)),"v-021062ed":()=>n.e(82).then(n.bind(null,522)),"v-97aa86e6":()=>n.e(44).then(n.bind(null,523)),"v-04d2236d":()=>n.e(45).then(n.bind(null,524)),"v-e35c5e24":()=>n.e(83).then(n.bind(null,525)),"v-4af2bfca":()=>n.e(84).then(n.bind(null,526)),"v-00153acd":()=>n.e(85).then(n.bind(null,527)),"v-9a2a2626":()=>n.e(86).then(n.bind(null,528)),"v-1a823cb0":()=>n.e(46).then(n.bind(null,529)),"v-560d08d2":()=>n.e(47).then(n.bind(null,530)),"v-ef2073ec":()=>n.e(15).then(n.bind(null,531)),"v-592eaa86":()=>n.e(48).then(n.bind(null,532)),"v-ffc79ec2":()=>n.e(87).then(n.bind(null,533)),"v-c71b5aa6":()=>n.e(88).then(n.bind(null,534)),"v-1005bb66":()=>n.e(89).then(n.bind(null,535)),"v-186cd6ed":()=>n.e(90).then(n.bind(null,536)),"v-0ee3f026":()=>n.e(91).then(n.bind(null,537)),"v-2997b752":()=>n.e(92).then(n.bind(null,538)),"v-4fe4e126":()=>n.e(93).then(n.bind(null,539)),"v-24966ce6":()=>n.e(49).then(n.bind(null,540)),"v-f9778ae6":()=>n.e(94).then(n.bind(null,541)),"v-d2a018a6":()=>n.e(95).then(n.bind(null,542)),"v-45d803ab":()=>n.e(50).then(n.bind(null,543)),"v-9ddae032":()=>n.e(96).then(n.bind(null,544)),"v-3f85032d":()=>n.e(97).then(n.bind(null,545)),"v-2fcee9ad":()=>n.e(98).then(n.bind(null,546)),"v-0e5e57cd":()=>n.e(100).then(n.bind(null,547)),"v-525dec3e":()=>n.e(99).then(n.bind(null,548)),"v-6e6b7e2d":()=>n.e(101).then(n.bind(null,549)),"v-06e0a8ca":()=>n.e(102).then(n.bind(null,550)),"v-1227575e":()=>n.e(103).then(n.bind(null,551)),"v-59d340ad":()=>n.e(51).then(n.bind(null,552)),"v-00d62ee6":()=>n.e(104).then(n.bind(null,553)),"v-3eeef04a":()=>n.e(106).then(n.bind(null,554)),"v-221bfb8d":()=>n.e(105).then(n.bind(null,555)),"v-857a96a6":()=>n.e(107).then(n.bind(null,556)),"v-10d9ffb7":()=>n.e(108).then(n.bind(null,557)),"v-d5007282":()=>n.e(109).then(n.bind(null,558)),"v-64c18f4d":()=>n.e(111).then(n.bind(null,559)),"v-9adb302a":()=>n.e(112).then(n.bind(null,560)),"v-8850e2c4":()=>n.e(110).then(n.bind(null,561))};function Ke(e){const t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}const Xe=/-(\w)/g,Qe=Ke(e=>e.replace(Xe,(e,t)=>t?t.toUpperCase():"")),Ye=/\B([A-Z])/g,et=Ke(e=>e.replace(Ye,"-$1").toLowerCase()),tt=Ke(e=>e.charAt(0).toUpperCase()+e.slice(1));function nt(e,t){if(!t)return;if(e(t))return e(t);return t.includes("-")?e(tt(Qe(t))):e(tt(t))||e(et(t))}const rt=Object.assign({},He,Ze),ot=e=>rt[e],at=e=>Ze[e],it=e=>He[e],st=e=>r.a.component(e);function lt(e){return nt(at,e)}function ct(e){return nt(it,e)}function ut(e){return nt(ot,e)}function pt(e){return nt(st,e)}function dt(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!pt(e)&&ut(e)){const t=await ut(e)();r.a.component(e,t.default)}}))}function ft(e,t){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[e]=t)}var ht=n(47),vt=n.n(ht),mt=n(48),gt=n.n(mt),yt={created(){if(this.siteMeta=this.$site.headTags.filter(([e])=>"meta"===e).map(([e,t])=>t),this.$ssrContext){const t=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(e=t)?e.map(e=>{let t="{t+=` ${n}="${gt()(e[n])}"`}),t+">"}).join("\n "):"",this.$ssrContext.canonicalLink=wt(this.$canonicalUrl)}var e},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.getMergedMetaTags();this.currentMetaTags=_t(e,this.currentMetaTags)},getMergedMetaTags(){const e=this.$page.frontmatter.meta||[];return vt()([{name:"description",content:this.$description}],e,this.siteMeta,xt)},updateCanonicalLink(){bt(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",wt(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){_t(null,this.currentMetaTags),bt()}};function bt(){const e=document.querySelector("link[rel='canonical']");e&&e.remove()}function wt(e=""){return e?``:""}function _t(e,t){if(t&&[...t].filter(e=>e.parentNode===document.head).forEach(e=>document.head.removeChild(e)),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(n=>{t.setAttribute(n,e[n])}),document.head.appendChild(t),t})}function xt(e){for(const t of["name","property","itemprop"])if(e.hasOwnProperty(t))return e[t]+t;return JSON.stringify(e)}var Pt=n(13),kt=n.n(Pt),St={mounted(){kt.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,n)=>{e.path===t.path||r.a.component(e.name)||kt.a.start(),n()}),this.$router.afterEach(()=>{kt.a.done(),this.isSidebarOpen=!1})}},Ot=n(49),Ct={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(Ot)()((function(){this.setActiveHash()}),300),setActiveHash(){const e=[].slice.call(document.querySelectorAll(".sidebar-link")),t=[].slice.call(document.querySelectorAll(".header-anchor")).filter(t=>e.some(e=>e.hash===t.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let e=0;e=a.parentElement.offsetTop+10&&(!i||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Et={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let e={};return e[this.options.align]="7.5px",e},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null},copyToClipboard(e){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let e=document.createElement("textarea");document.body.appendChild(e),e.value=this.code,e.select(),document.execCommand("Copy"),e.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let e=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${e.r}, ${e.g}, ${e.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},jt=(n(146),n(4)),$t=Object(jt.a)(Et,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-copy"},[t("svg",{class:e.iconClass,style:e.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:e.copyToClipboard}},[t("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),e._v(" "),t("path",{attrs:{fill:e.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),e._v(" "),t("span",{class:e.success?"success":"",style:e.alignStyle},[e._v("\n "+e._s(e.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Tt=(n(147),[yt,St,Ct,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(e=>{if(e.classList.contains("code-copy-added"))return;let t=new(r.a.extend($t));t.options={align:"bottom",color:"#27b1ff",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!1},t.code=e.innerText,t.parent=e,t.$mount(),e.classList.add("code-copy-added"),e.appendChild(t.$el)})},100)}}}]),At={name:"GlobalLayout",computed:{layout(){const e=this.getLayout();return ft("layout",e),r.a.component(e)}},methods:{getLayout(){if(this.$page.path){const e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},Rt=Object(jt.a)(At,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,n){switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],n);break;case"mixins":e[t]||(e[t]=[]),e[t].push(...n);break;default:throw new Error("Unknown option name.")}}(Rt,"mixins",Tt);const Ut=[{name:"v-3ec20de4",path:"/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3ec20de4").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-26232766",path:"/contact.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-26232766").then(n)}},{name:"v-5e94256a",path:"/documentation/0.4/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5e94256a").then(n)}},{path:"/documentation/0.4/index.html",redirect:"/documentation/0.4/"},{name:"v-31596d2d",path:"/about.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-31596d2d").then(n)}},{name:"v-5e0de9fe",path:"/documentation/0.4/developers/api/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5e0de9fe").then(n)}},{path:"/documentation/0.4/developers/api/index.html",redirect:"/documentation/0.4/developers/api/"},{name:"v-4155eb1e",path:"/documentation/0.4/developers/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4155eb1e").then(n)}},{path:"/documentation/0.4/developers/index.html",redirect:"/documentation/0.4/developers/"},{name:"v-63a2d53d",path:"/documentation/0.4/developers/api/reference.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-63a2d53d").then(n)}},{name:"v-6bf62e0d",path:"/documentation/0.4/developers/arch.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6bf62e0d").then(n)}},{name:"v-418e1b4d",path:"/documentation/0.4/developers/api/errors.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-418e1b4d").then(n)}},{name:"v-d80ea866",path:"/documentation/0.4/developers/backends/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-d80ea866").then(n)}},{name:"v-4899abd1",path:"/documentation/0.4/developers/backends/udfs.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4899abd1").then(n)}},{name:"v-4081eb72",path:"/documentation/0.4/developers/clients/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4081eb72").then(n)}},{name:"v-5e5c94cd",path:"/documentation/0.4/developers/clients/library-guidelines.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5e5c94cd").then(n)}},{name:"v-25dd3de6",path:"/documentation/0.4/developers/examples/poc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-25dd3de6").then(n)}},{name:"v-6993aee6",path:"/documentation/0.4/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6993aee6").then(n)}},{name:"v-0059cb2a",path:"/documentation/0.4/developers/examples/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-0059cb2a").then(n)}},{path:"/documentation/0.4/developers/examples/index.html",redirect:"/documentation/0.4/developers/examples/"},{name:"v-3359623e",path:"/documentation/0.4/glossary.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3359623e").then(n)}},{name:"v-cfac61a6",path:"/documentation/0.4/processes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-cfac61a6").then(n)}},{name:"v-6aca4be5",path:"/documentation/0.4/udfs.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6aca4be5").then(n)}},{name:"v-37dbaaa0",path:"/documentation/1.0/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-37dbaaa0").then(n)}},{path:"/documentation/1.0/index.html",redirect:"/documentation/1.0/"},{name:"v-7758ae27",path:"/documentation/1.0/authentication.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-7758ae27").then(n)}},{name:"v-9f635184",path:"/documentation/1.0/cookbook/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9f635184").then(n)}},{path:"/documentation/1.0/cookbook/index.html",redirect:"/documentation/1.0/cookbook/"},{name:"v-5fd8f1ad",path:"/documentation/1.0/datacubes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5fd8f1ad").then(n)}},{name:"v-f5de2fb4",path:"/documentation/1.0/datacubes/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-f5de2fb4").then(n)}},{path:"/documentation/1.0/datacubes/index.html",redirect:"/documentation/1.0/datacubes/"},{name:"v-8d587926",path:"/documentation/1.0/developers/api/errors.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-8d587926").then(n)}},{name:"v-43de507e",path:"/documentation/1.0/developers/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-43de507e").then(n)}},{path:"/documentation/1.0/developers/index.html",redirect:"/documentation/1.0/developers/"},{name:"v-dc734f12",path:"/documentation/1.0/developers/api/reference.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-dc734f12").then(n)}},{name:"v-654015de",path:"/documentation/1.0/developers/api/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-654015de").then(n)}},{path:"/documentation/1.0/developers/api/index.html",redirect:"/documentation/1.0/developers/api/"},{name:"v-75018026",path:"/documentation/1.0/developers/arch.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-75018026").then(n)}},{name:"v-1772ad2d",path:"/documentation/1.0/developers/backends/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1772ad2d").then(n)}},{name:"v-2840d4fe",path:"/documentation/1.0/developers/backends/xarray.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-2840d4fe").then(n)}},{name:"v-253cefad",path:"/documentation/1.0/developers/backends/performance.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-253cefad").then(n)}},{name:"v-1b45967e",path:"/documentation/1.0/developers/clients/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1b45967e").then(n)}},{name:"v-021062ed",path:"/documentation/1.0/developers/clients/library-guidelines.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-021062ed").then(n)}},{name:"v-97aa86e6",path:"/documentation/1.0/developers/profiles/api.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-97aa86e6").then(n)}},{name:"v-04d2236d",path:"/documentation/1.0/developers/profiles/processes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-04d2236d").then(n)}},{name:"v-e35c5e24",path:"/documentation/1.0/developers/profiles/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-e35c5e24").then(n)}},{path:"/documentation/1.0/developers/profiles/index.html",redirect:"/documentation/1.0/developers/profiles/"},{name:"v-4af2bfca",path:"/documentation/1.0/glossary.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4af2bfca").then(n)}},{name:"v-00153acd",path:"/documentation/1.0/processes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-00153acd").then(n)}},{name:"v-9a2a2626",path:"/documentation/1.0/python/client-side-processing.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9a2a2626").then(n)}},{name:"v-1a823cb0",path:"/documentation/1.0/javascript/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1a823cb0").then(n)}},{path:"/documentation/1.0/javascript/index.html",redirect:"/documentation/1.0/javascript/"},{name:"v-560d08d2",path:"/documentation/1.0/python/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-560d08d2").then(n)}},{path:"/documentation/1.0/python/index.html",redirect:"/documentation/1.0/python/"},{name:"v-ef2073ec",path:"/documentation/1.0/qgis/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-ef2073ec").then(n)}},{path:"/documentation/1.0/qgis/index.html",redirect:"/documentation/1.0/qgis/"},{name:"v-592eaa86",path:"/documentation/1.0/r/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-592eaa86").then(n)}},{path:"/documentation/1.0/r/index.html",redirect:"/documentation/1.0/r/"},{name:"v-ffc79ec2",path:"/documentation/1.0/udfs.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-ffc79ec2").then(n)}},{name:"v-c71b5aa6",path:"/documentation/code-of-conduct.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-c71b5aa6").then(n)}},{name:"v-1005bb66",path:"/documentation/software-guidelines.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1005bb66").then(n)}},{name:"v-186cd6ed",path:"/events/igarrs2021.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-186cd6ed").then(n)}},{name:"v-0ee3f026",path:"/news/2017-12-05-welcome.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-0ee3f026").then(n)}},{name:"v-2997b752",path:"/news/2017-12-18-VITO_meeting.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-2997b752").then(n)}},{name:"v-4fe4e126",path:"/news/2018-03-15-poc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4fe4e126").then(n)}},{name:"v-24966ce6",path:"/news/2018-01-31-WWU_meeting.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-24966ce6").then(n)}},{name:"v-f9778ae6",path:"/news/2018-05-23-user-requirements-survey-launched.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-f9778ae6").then(n)}},{name:"v-d2a018a6",path:"/news/2018-10-30-year-one-review-meeting.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-d2a018a6").then(n)}},{name:"v-45d803ab",path:"/news/2019-03-07-openeo-api-040.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-45d803ab").then(n)}},{name:"v-9ddae032",path:"/news/2019-10-07-EO-big-data-hackaton.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9ddae032").then(n)}},{name:"v-3f85032d",path:"/news/2020-07-31-lessons-learned.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3f85032d").then(n)}},{name:"v-2fcee9ad",path:"/news/2020-07-31-openeo-api-released.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-2fcee9ad").then(n)}},{name:"v-0e5e57cd",path:"/news/2020-11-30-openeo-api-101-released.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-0e5e57cd").then(n)}},{name:"v-525dec3e",path:"/news/2020-09-02-openeo-user-workshop.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-525dec3e").then(n)}},{name:"v-6e6b7e2d",path:"/news/2021-05-17-openeo-api-110-released.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6e6b7e2d").then(n)}},{name:"v-06e0a8ca",path:"/news/2021-11-08-r-client-on-cran.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-06e0a8ca").then(n)}},{name:"v-1227575e",path:"/news/2022-04-08-psc-meetings.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1227575e").then(n)}},{name:"v-59d340ad",path:"/news/2022-05-12-r-client-v120.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-59d340ad").then(n)}},{name:"v-00d62ee6",path:"/news/2022-07-07-monthly-dev-calls.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-00d62ee6").then(n)}},{name:"v-3eeef04a",path:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3eeef04a").then(n)}},{path:"/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html",redirect:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html"},{path:"/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html",redirect:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html"},{name:"v-221bfb8d",path:"/news/2022-11-17-r-client-v130.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-221bfb8d").then(n)}},{name:"v-857a96a6",path:"/news/2023-12-06-openeo-submitted-to-ogc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-857a96a6").then(n)}},{name:"v-10d9ffb7",path:"/news/2024-02-06-openeo-ogc-rfc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-10d9ffb7").then(n)}},{name:"v-d5007282",path:"/news/2024-03-22_mooc_cubeandclouds.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-d5007282").then(n)}},{name:"v-64c18f4d",path:"/psc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-64c18f4d").then(n)}},{name:"v-9adb302a",path:"/software.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9adb302a").then(n)}},{name:"v-8850e2c4",path:"/news/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-8850e2c4").then(n)}},{path:"/news/index.html",redirect:"/news/"},{path:"*",component:Rt}],Mt={title:"openEO",description:"openEO develops an open API to connect various clients to big EO cloud back-ends in a simple and unified way.",base:"/",headTags:[],pages:[{title:"Home",frontmatter:{home:!0},regularPath:"/",relativePath:"README.md",key:"v-3ec20de4",path:"/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Contact",frontmatter:{sidebar:!1},regularPath:"/contact.html",relativePath:"contact.md",key:"v-26232766",path:"/contact.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Documentation",frontmatter:{},regularPath:"/documentation/0.4/",relativePath:"documentation/0.4/README.md",key:"v-5e94256a",path:"/documentation/0.4/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"About",frontmatter:{},regularPath:"/about.html",relativePath:"about.md",key:"v-31596d2d",path:"/about.html",headers:[{level:2,title:"openEO?",slug:"openeo"},{level:2,title:"Why an API?",slug:"why-an-api"},{level:2,title:"More information",slug:"more-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{iframe:"https://api.openeo.org/v/0.4.2/"},regularPath:"/documentation/0.4/developers/api/",relativePath:"documentation/0.4/developers/api/README.md",key:"v-5e0de9fe",path:"/documentation/0.4/developers/api/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Introduction",frontmatter:{},regularPath:"/documentation/0.4/developers/",relativePath:"documentation/0.4/developers/README.md",key:"v-4155eb1e",path:"/documentation/0.4/developers/",headers:[{level:2,title:"Additional information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/0.4/developers/api/reference.html",relativePath:"documentation/0.4/developers/api/reference.md",key:"v-63a2d53d",path:"/documentation/0.4/developers/api/reference.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Architecture",frontmatter:{},regularPath:"/documentation/0.4/developers/arch.html",relativePath:"documentation/0.4/developers/arch.md",key:"v-6bf62e0d",path:"/documentation/0.4/developers/arch.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Status and error handling",frontmatter:{},regularPath:"/documentation/0.4/developers/api/errors.html",relativePath:"documentation/0.4/developers/api/errors.md",key:"v-418e1b4d",path:"/documentation/0.4/developers/api/errors.html",headers:[{level:2,title:"JSON error object",slug:"json-error-object"},{level:2,title:"Standardized status codes",slug:"standardized-status-codes"},{level:2,title:"openEO error codes",slug:"openeo-error-codes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for back-end providers",frontmatter:{},regularPath:"/documentation/0.4/developers/backends/getting-started.html",relativePath:"documentation/0.4/developers/backends/getting-started.md",key:"v-d80ea866",path:"/documentation/0.4/developers/backends/getting-started.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User-defined functions",frontmatter:{},regularPath:"/documentation/0.4/developers/backends/udfs.html",relativePath:"documentation/0.4/developers/backends/udfs.md",key:"v-4899abd1",path:"/documentation/0.4/developers/backends/udfs.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for client developers",frontmatter:{},regularPath:"/documentation/0.4/developers/clients/getting-started.html",relativePath:"documentation/0.4/developers/clients/getting-started.md",key:"v-4081eb72",path:"/documentation/0.4/developers/clients/getting-started.html",headers:[{level:2,title:"Client library developers",slug:"client-library-developers"},{level:2,title:"Applications and Software plugins",slug:"applications-and-software-plugins"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Client library development guidelines",frontmatter:{},regularPath:"/documentation/0.4/developers/clients/library-guidelines.html",relativePath:"documentation/0.4/developers/clients/library-guidelines.md",key:"v-5e5c94cd",path:"/documentation/0.4/developers/clients/library-guidelines.html",headers:[{level:2,title:"Conventions",slug:"conventions"},{level:3,title:"Casing",slug:"casing"},{level:3,title:"Scopes",slug:"scopes"},{level:3,title:"Scope categories",slug:"scope-categories"},{level:3,title:"Parameters",slug:"parameters"},{level:2,title:"Method mappings",slug:"method-mappings"},{level:3,title:"Scope: openEO (root category)",slug:"scope-openeo-root-category"},{level:4,title:"Parameters",slug:"parameters-2"},{level:3,title:"Scope: Connection (API category)",slug:"scope-connection-api-category"},{level:4,title:"Parameters",slug:"parameters-3"},{level:3,title:"Scope Capabilities (Content category)",slug:"scope-capabilities-content-category"},{level:4,title:"Parameters",slug:"parameters-4"},{level:3,title:"Scope: File (API category)",slug:"scope-file-api-category"},{level:4,title:"Parameters",slug:"parameters-5"},{level:3,title:"Scope: Job (API category)",slug:"scope-job-api-category"},{level:4,title:"Parameters",slug:"parameters-6"},{level:3,title:"Scope: ProcessGraph (API category)",slug:"scope-processgraph-api-category"},{level:3,title:"Scope: Service (API category)",slug:"scope-service-api-category"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"Workflow example",slug:"workflow-example"},{level:3,title:"R (functional style)",slug:"r-functional-style"},{level:3,title:"Python (mixed style)",slug:"python-mixed-style"},{level:3,title:"Java (object oriented style)",slug:"java-object-oriented-style"},{level:3,title:"PHP (procedural style)",slug:"php-procedural-style"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Examples (proof of concept)",frontmatter:{},regularPath:"/documentation/0.4/developers/examples/poc.html",relativePath:"documentation/0.4/developers/examples/poc.md",key:"v-25dd3de6",path:"/documentation/0.4/developers/examples/poc.html",headers:[{level:2,title:"Use Case 1",slug:"use-case-1"},{level:2,title:"Use Case 2",slug:"use-case-2"},{level:2,title:"Use Case 3",slug:"use-case-3"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for users",frontmatter:{},regularPath:"/documentation/0.4/getting-started.html",relativePath:"documentation/0.4/getting-started.md",key:"v-6993aee6",path:"/documentation/0.4/getting-started.html",headers:[{level:2,title:"Contribute",slug:"contribute"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Examples",frontmatter:{},regularPath:"/documentation/0.4/developers/examples/",relativePath:"documentation/0.4/developers/examples/README.md",key:"v-0059cb2a",path:"/documentation/0.4/developers/examples/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Glossary",frontmatter:{},regularPath:"/documentation/0.4/glossary.html",relativePath:"documentation/0.4/glossary.md",key:"v-3359623e",path:"/documentation/0.4/glossary.html",headers:[{level:2,title:"General terms",slug:"general-terms"},{level:2,title:"Processes and process graphs",slug:"processes-and-process-graphs"},{level:2,title:"EO data (Collections)",slug:"eo-data-collections"},{level:2,title:"Spatial data cubes",slug:"spatial-data-cubes"},{level:3,title:"apply: processes that do not change dimensions",slug:"apply-processes-that-do-not-change-dimensions"},{level:3,title:"filter: subsetting dimensions by dimension value selection",slug:"filter-subsetting-dimensions-by-dimension-value-selection"},{level:3,title:"reduce: removing dimensions entirely by computation",slug:"reduce-removing-dimensions-entirely-by-computation"},{level:3,title:"aggregate: reducing resolution",slug:"aggregate-reducing-resolution"},{level:3,title:"resample: changing data cube geometry",slug:"resample-changing-data-cube-geometry"},{level:2,title:"User-defined function (UDF)",slug:"user-defined-function-udf"},{level:2,title:"Data Processing modes",slug:"data-processing-modes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/0.4/processes.html",relativePath:"documentation/0.4/processes.md",key:"v-cfac61a6",path:"/documentation/0.4/processes.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User-defined functions",frontmatter:{},regularPath:"/documentation/0.4/udfs.html",relativePath:"documentation/0.4/udfs.md",key:"v-6aca4be5",path:"/documentation/0.4/udfs.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Introduction",frontmatter:{},regularPath:"/documentation/1.0/",relativePath:"documentation/1.0/README.md",key:"v-37dbaaa0",path:"/documentation/1.0/",headers:[{level:2,title:"Contribute",slug:"contribute"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Authentication",frontmatter:{},regularPath:"/documentation/1.0/authentication.html",relativePath:"documentation/1.0/authentication.md",key:"v-7758ae27",path:"/documentation/1.0/authentication.html",headers:[{level:2,title:"HTTP Basic",slug:"http-basic"},{level:2,title:"OpenID Connect",slug:"openid-connect"},{level:3,title:"Authorization Code Flow",slug:"authorization-code-flow"},{level:3,title:"Device Flow",slug:"device-flow"},{level:3,title:"Client Credentials Flow",slug:"client-credentials-flow"},{level:3,title:"Resource Owner Password flow",slug:"resource-owner-password-flow"},{level:3,title:"Refresh Token Flow",slug:"refresh-token-flow"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Cookbook",frontmatter:{sidebarDepth:3},regularPath:"/documentation/1.0/cookbook/",relativePath:"documentation/1.0/cookbook/README.md",key:"v-9f635184",path:"/documentation/1.0/cookbook/",headers:[{level:2,title:"Chapter 1",slug:"chapter-1"},{level:3,title:"Connecting to a back-end",slug:"connecting-to-a-back-end"},{level:3,title:"Input: load_collection",slug:"input-load-collection"},{level:3,title:"Filter Bands: filter_bands",slug:"filter-bands-filter-bands"},{level:3,title:"Temporal Mean: reduce_dimension",slug:"temporal-mean-reduce-dimension"},{level:3,title:"Scale All Pixels Linearly: apply, linear_scale_range",slug:"scale-all-pixels-linearly-apply-linear-scale-range"},{level:3,title:"Spatial Aggregation: aggregate_spatial",slug:"spatial-aggregation-aggregate-spatial"},{level:3,title:"Output: save_result",slug:"output-save-result"},{level:4,title:"Raster Formats: GTiff, NetCDF",slug:"raster-formats-gtiff-netcdf"},{level:4,title:"Raster Formats: PNG",slug:"raster-formats-png"},{level:4,title:"Text Formats: JSON, CSV",slug:"text-formats-json-csv"},{level:3,title:"Output: Process as JSON",slug:"output-process-as-json"},{level:2,title:"Chapter 2",slug:"chapter-2"},{level:3,title:"Bandmath",slug:"bandmath"},{level:4,title:"Example 1: NDVI",slug:"example-1-ndvi"},{level:4,title:"Example 2: EVI",slug:"example-2-evi"},{level:3,title:"Masks: mask",slug:"masks-mask"},{level:4,title:"Mask Out Specific Values",slug:"mask-out-specific-values"},{level:4,title:"Thresholds",slug:"thresholds"},{level:3,title:"Pixel Operations: apply",slug:"pixel-operations-apply"},{level:3,title:"Image Kernels: apply_kernel",slug:"image-kernels-apply-kernel"},{level:2,title:"Endnote",slug:"endnote"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Datacubes",frontmatter:{},regularPath:"/documentation/1.0/datacubes.html",relativePath:"documentation/1.0/datacubes.md",key:"v-5fd8f1ad",path:"/documentation/1.0/datacubes.html",headers:[{level:2,title:"What are Datacubes?",slug:"what-are-datacubes"},{level:2,title:"Dimensions",slug:"dimensions"},{level:3,title:"Applying Processes on Dimensions",slug:"applying-processes-on-dimensions"},{level:3,title:"Resolution",slug:"resolution"},{level:3,title:"Coordinate Reference System as a Dimension",slug:"coordinate-reference-system-as-a-dimension"},{level:2,title:"Values in a datacube",slug:"values-in-a-datacube"},{level:2,title:"Processes on Datacubes",slug:"processes-on-datacubes"},{level:3,title:"Filter",slug:"filter"},{level:3,title:"Apply",slug:"apply"},{level:3,title:"Resample",slug:"resample"},{level:3,title:"Reduce",slug:"reduce"},{level:3,title:"Aggregate",slug:"aggregate"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Datacube Documentation",frontmatter:{},regularPath:"/documentation/1.0/datacubes/",relativePath:"documentation/1.0/datacubes/README.md",key:"v-f5de2fb4",path:"/documentation/1.0/datacubes/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO error codes",frontmatter:{},regularPath:"/documentation/1.0/developers/api/errors.html",relativePath:"documentation/1.0/developers/api/errors.md",key:"v-8d587926",path:"/documentation/1.0/developers/api/errors.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Introduction",frontmatter:{},regularPath:"/documentation/1.0/developers/",relativePath:"documentation/1.0/developers/README.md",key:"v-43de507e",path:"/documentation/1.0/developers/",headers:[{level:2,title:"Additional information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/1.0/developers/api/reference.html",relativePath:"documentation/1.0/developers/api/reference.md",key:"v-dc734f12",path:"/documentation/1.0/developers/api/reference.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{},regularPath:"/documentation/1.0/developers/api/",relativePath:"documentation/1.0/developers/api/README.md",key:"v-654015de",path:"/documentation/1.0/developers/api/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Architecture",frontmatter:{},regularPath:"/documentation/1.0/developers/arch.html",relativePath:"documentation/1.0/developers/arch.md",key:"v-75018026",path:"/documentation/1.0/developers/arch.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for service (back-end) providers",frontmatter:{},regularPath:"/documentation/1.0/developers/backends/getting-started.html",relativePath:"documentation/1.0/developers/backends/getting-started.md",key:"v-1772ad2d",path:"/documentation/1.0/developers/backends/getting-started.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started with openEO and Xarray and Dask",frontmatter:{},regularPath:"/documentation/1.0/developers/backends/xarray.html",relativePath:"documentation/1.0/developers/backends/xarray.md",key:"v-2840d4fe",path:"/documentation/1.0/developers/backends/xarray.html",headers:[{level:2,title:"Process Graph Parser for Python",slug:"process-graph-parser-for-python"},{level:2,title:"Python Processes for openEO",slug:"python-processes-for-openeo"},{level:2,title:"The loadcollection and saveresult process",slug:"the-load-collection-and-save-result-process"},{level:3,title:"Connection to ODC and STAC",slug:"connection-to-odc-and-stac"},{level:2,title:"openEO Client Side Processing",slug:"openeo-client-side-processing"},{level:2,title:"Adding a new process",slug:"adding-a-new-process"},{level:3,title:"Add the process spec",slug:"add-the-process-spec"},{level:3,title:"Add the process implementation",slug:"add-the-process-implementation"},{level:2,title:"HTTP REST Interface",slug:"http-rest-interface"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Performance guide for openEO backends",frontmatter:{},regularPath:"/documentation/1.0/developers/backends/performance.html",relativePath:"documentation/1.0/developers/backends/performance.md",key:"v-253cefad",path:"/documentation/1.0/developers/backends/performance.html",headers:[{level:2,title:"openEO API vision on performance & scalability",slug:"openeo-api-vision-on-performance-scalability"},{level:3,title:"Bringing the processing to the data",slug:"bringing-the-processing-to-the-data"},{level:3,title:"Datacube processing",slug:"datacube-processing"},{level:2,title:"Process graph execution",slug:"process-graph-execution"},{level:2,title:"Performance FAQ",slug:"performance-faq"},{level:3,title:"I have a highly optimized workflow, can openEO expose it?",slug:"i-have-a-highly-optimized-workflow-can-openeo-expose-it"},{level:3,title:"Can openEO be as fast as a hand-written workflow?",slug:"can-openeo-be-as-fast-as-a-hand-written-workflow"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for client developers",frontmatter:{},regularPath:"/documentation/1.0/developers/clients/getting-started.html",relativePath:"documentation/1.0/developers/clients/getting-started.md",key:"v-1b45967e",path:"/documentation/1.0/developers/clients/getting-started.html",headers:[{level:2,title:"Client library developers",slug:"client-library-developers"},{level:2,title:"Applications and Software plugins",slug:"applications-and-software-plugins"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Client library development guidelines",frontmatter:{},regularPath:"/documentation/1.0/developers/clients/library-guidelines.html",relativePath:"documentation/1.0/developers/clients/library-guidelines.md",key:"v-021062ed",path:"/documentation/1.0/developers/clients/library-guidelines.html",headers:[{level:2,title:"Conventions",slug:"conventions"},{level:3,title:"Casing",slug:"casing"},{level:3,title:"Scopes",slug:"scopes"},{level:3,title:"Scope categories",slug:"scope-categories"},{level:3,title:"Parameters",slug:"parameters"},{level:2,title:"Method mappings",slug:"method-mappings"},{level:3,title:"Scope: openEO (root category)",slug:"scope-openeo-root-category"},{level:4,title:"Parameters",slug:"parameters-2"},{level:3,title:"Scope: Connection (API category)",slug:"scope-connection-api-category"},{level:4,title:"Parameters",slug:"parameters-3"},{level:3,title:"Scope Capabilities (Content category)",slug:"scope-capabilities-content-category"},{level:4,title:"Parameters",slug:"parameters-4"},{level:3,title:"Scope: File (API category)",slug:"scope-file-api-category"},{level:4,title:"Parameters",slug:"parameters-5"},{level:3,title:"Scope: Job (API category)",slug:"scope-job-api-category"},{level:4,title:"Parameters",slug:"parameters-6"},{level:3,title:"Scope: UserProcess (API category)",slug:"scope-userprocess-api-category"},{level:3,title:"Scope: Service (API category)",slug:"scope-service-api-category"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"Workflow example",slug:"workflow-example"},{level:3,title:"R (functional style)",slug:"r-functional-style"},{level:3,title:"Python (mixed style)",slug:"python-mixed-style"},{level:3,title:"Java (object oriented style)",slug:"java-object-oriented-style"},{level:3,title:"PHP (procedural style)",slug:"php-procedural-style"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"API Profiles",frontmatter:{},regularPath:"/documentation/1.0/developers/profiles/api.html",relativePath:"documentation/1.0/developers/profiles/api.md",key:"v-97aa86e6",path:"/documentation/1.0/developers/profiles/api.html",headers:[{level:2,title:"Requirements per Profile",slug:"requirements-per-profile"},{level:3,title:"L1: Minimal",slug:"l1-minimal"},{level:4,title:"API fundamentals",slug:"api-fundamentals"},{level:4,title:"Well-known Discovery",slug:"well-known-discovery"},{level:4,title:"Capabilities",slug:"capabilities"},{level:4,title:"File Formats",slug:"file-formats"},{level:4,title:"Authentication",slug:"authentication"},{level:4,title:"Pre-defined Processes",slug:"pre-defined-processes"},{level:4,title:"Collections",slug:"collections"},{level:4,title:"Data Processing",slug:"data-processing"},{level:3,title:"L1A: Minimal - Synchronous Processing",slug:"l1a-minimal-synchronous-processing"},{level:4,title:"Synchronous Processing",slug:"synchronous-processing"},{level:3,title:"L1B: Minimal - Batch Jobs",slug:"l1b-minimal-batch-jobs"},{level:4,title:"Batch Jobs",slug:"batch-jobs"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results"},{level:3,title:"L1C: Minimal - Secondary Web Services",slug:"l1c-minimal-secondary-web-services"},{level:4,title:"Secondary Web Service Discovery",slug:"secondary-web-service-discovery"},{level:4,title:"Secondary Web Services",slug:"secondary-web-services"},{level:3,title:"L2: Recommended",slug:"l2-recommended"},{level:4,title:"API fundamentals",slug:"api-fundamentals-2"},{level:4,title:"Well-known Discovery",slug:"well-known-discovery-2"},{level:4,title:"Capabilities",slug:"capabilities-2"},{level:4,title:"File Formats",slug:"file-formats-2"},{level:4,title:"Authentication",slug:"authentication-2"},{level:4,title:"User Account",slug:"user-account"},{level:4,title:"Pre-defined Processes",slug:"pre-defined-processes-2"},{level:4,title:"Collections",slug:"collections-2"},{level:4,title:"User-defined processes",slug:"user-defined-processes"},{level:4,title:"Data Processing",slug:"data-processing-2"},{level:4,title:"Batch Jobs",slug:"batch-jobs-2"},{level:4,title:"Batch Jobs > Logs",slug:"batch-jobs-logs"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results-2"},{level:4,title:"Synchronous Processing",slug:"synchronous-processing-2"},{level:3,title:"L3: Advanced",slug:"l3-advanced"},{level:4,title:"API fundamentals",slug:"api-fundamentals-3"},{level:4,title:"Well-known Discovery",slug:"well-known-discovery-3"},{level:4,title:"Conformance Classes",slug:"conformance-classes"},{level:4,title:"Authentication",slug:"authentication-3"},{level:4,title:"Pre-defined Processes",slug:"pre-defined-processes-3"},{level:4,title:"Collections",slug:"collections-3"},{level:4,title:"User-defined processes",slug:"user-defined-processes-2"},{level:4,title:"Validation",slug:"validation"},{level:4,title:"Batch Jobs",slug:"batch-jobs-3"},{level:4,title:"Batch Jobs > Logs",slug:"batch-jobs-logs-2"},{level:4,title:"Batch Jobs > Estimates",slug:"batch-jobs-estimates"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results-3"},{level:4,title:"Synchronous Processing",slug:"synchronous-processing-3"},{level:3,title:"L3-UDF: UDF",slug:"l3-udf-udf"},{level:4,title:"UDF Runtimes",slug:"udf-runtimes"},{level:3,title:"L3-FS: File Storage",slug:"l3-fs-file-storage"},{level:4,title:"File Storage",slug:"file-storage"},{level:3,title:"L3-SWS: Secondary Web Services",slug:"l3-sws-secondary-web-services"},{level:4,title:"Secondary Web Service Discovery",slug:"secondary-web-service-discovery-2"},{level:4,title:"Secondary Web Services",slug:"secondary-web-services-2"},{level:3,title:"L4: Above and Beyond",slug:"l4-above-and-beyond"},{level:4,title:"Secondary Web Services",slug:"secondary-web-services-3"},{level:4,title:"Secondary Web Services > Logs",slug:"secondary-web-services-logs"},{level:4,title:"Batch Jobs",slug:"batch-jobs-4"},{level:4,title:"Batch Jobs > Estimates",slug:"batch-jobs-estimates-2"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results-4"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Process Profiles",frontmatter:{},regularPath:"/documentation/1.0/developers/profiles/processes.html",relativePath:"documentation/1.0/developers/profiles/processes.md",key:"v-04d2236d",path:"/documentation/1.0/developers/profiles/processes.html",headers:[{level:2,title:"Requirements per Profile",slug:"requirements-per-profile"},{level:3,title:"L1: Minimal",slug:"l1-minimal"},{level:3,title:"L2: Recommended",slug:"l2-recommended"},{level:3,title:"L2A: Recommended Raster",slug:"l2a-recommended-raster"},{level:3,title:"L2B: Recommended Vector",slug:"l2b-recommended-vector"},{level:3,title:"L2-Date: Date & Time manipulation",slug:"l2-date-date-time-manipulation"},{level:3,title:"L2-Text: Text manipulation",slug:"l2-text-text-manipulation"},{level:3,title:"L3: Advanced",slug:"l3-advanced"},{level:3,title:"L3-ML: Machine Learning",slug:"l3-ml-machine-learning"},{level:3,title:"L3-UDF: User-Defined Functions",slug:"l3-udf-user-defined-functions"},{level:3,title:"L3-Clim: Cimatology",slug:"l3-clim-cimatology"},{level:3,title:"L3-ARD: Analysis-Ready Data",slug:"l3-ard-analysis-ready-data"},{level:3,title:"L4: Above and Beyond",slug:"l4-above-and-beyond"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Profiles",frontmatter:{},regularPath:"/documentation/1.0/developers/profiles/",relativePath:"documentation/1.0/developers/profiles/README.md",key:"v-e35c5e24",path:"/documentation/1.0/developers/profiles/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Glossary",frontmatter:{},regularPath:"/documentation/1.0/glossary.html",relativePath:"documentation/1.0/glossary.md",key:"v-4af2bfca",path:"/documentation/1.0/glossary.html",headers:[{level:2,title:"General terms",slug:"general-terms"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"EO data (Collections)",slug:"eo-data-collections"},{level:2,title:"Spatial datacubes",slug:"spatial-datacubes"},{level:2,title:"Vector data",slug:"vector-data"},{level:2,title:"User-defined function (UDF)",slug:"user-defined-function-udf"},{level:2,title:"Data Processing modes",slug:"data-processing-modes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/1.0/processes.html",relativePath:"documentation/1.0/processes.md",key:"v-00153acd",path:"/documentation/1.0/processes.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Get started with the openEO Python Client Client Side Processing",frontmatter:{},regularPath:"/documentation/1.0/python/client-side-processing.html",relativePath:"documentation/1.0/python/client-side-processing.md",key:"v-9a2a2626",path:"/documentation/1.0/python/client-side-processing.html",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Usage",slug:"usage"},{level:3,title:"STAC Collections and Items",slug:"stac-collections-and-items"},{level:3,title:"Local Collections",slug:"local-collections"},{level:3,title:"Local Processing",slug:"local-processing"},{level:2,title:"Client-Side Processing Example Notebooks",slug:"client-side-processing-example-notebooks"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"JavaScript Client",frontmatter:{},regularPath:"/documentation/1.0/javascript/",relativePath:"documentation/1.0/javascript/index.md",key:"v-1a823cb0",path:"/documentation/1.0/javascript/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Exploring a back-end",slug:"exploring-a-back-end"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:3,title:"Basic Authentication",slug:"basic-authentication"},{level:3,title:"OpenID Connect Authentication",slug:"openid-connect-authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"},{level:2,title:"Full Example",slug:"full-example"},{level:2,title:"User Defined Functions",slug:"user-defined-functions"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Python Client",frontmatter:{},regularPath:"/documentation/1.0/python/",relativePath:"documentation/1.0/python/index.md",key:"v-560d08d2",path:"/documentation/1.0/python/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Exploring a back-end",slug:"exploring-a-back-end"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:3,title:"Basic Authentication",slug:"basic-authentication"},{level:3,title:"OpenID Connect Authentication",slug:"openid-connect-authentication"},{level:2,title:"Working with Datacube",slug:"working-with-datacube"},{level:3,title:"Creating a Datacube",slug:"creating-a-datacube"},{level:3,title:"Applying processes",slug:"applying-processes"},{level:3,title:"Defining output format",slug:"defining-output-format"},{level:2,title:"Execution",slug:"execution"},{level:3,title:"Batch job execution",slug:"batch-job-execution"},{level:2,title:"Full Example",slug:"full-example"},{level:2,title:"User Defined Functions",slug:"user-defined-functions"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"QGIS Plugin",frontmatter:{},regularPath:"/documentation/1.0/qgis/",relativePath:"documentation/1.0/qgis/index.md",key:"v-ef2073ec",path:"/documentation/1.0/qgis/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connecting",slug:"connecting"},{level:2,title:"Exploring a backend",slug:"exploring-a-backend"},{level:2,title:"Job Management",slug:"job-management"},{level:3,title:"Creating new Jobs",slug:"creating-new-jobs"},{level:3,title:"Adapting existing Jobs",slug:"adapting-existing-jobs"},{level:4,title:"Process Argument Helper",slug:"process-argument-helper"},{level:2,title:"Service Management",slug:"service-management"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client",frontmatter:{},regularPath:"/documentation/1.0/r/",relativePath:"documentation/1.0/r/index.md",key:"v-592eaa86",path:"/documentation/1.0/r/",headers:[{level:2,title:"Useful links",slug:"useful-links"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Exploring a back-end",slug:"exploring-a-back-end"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:3,title:"Basic Authentication",slug:"basic-authentication"},{level:3,title:"OpenID Connect Authentication",slug:"openid-connect-authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"},{level:2,title:"Full Example",slug:"full-example"},{level:2,title:"User Defined Functions",slug:"user-defined-functions"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User-defined functions",frontmatter:{},regularPath:"/documentation/1.0/udfs.html",relativePath:"documentation/1.0/udfs.md",key:"v-ffc79ec2",path:"/documentation/1.0/udfs.html",headers:[{level:2,title:"Users",slug:"users"},{level:3,title:"JavaScript",slug:"javascript"},{level:3,title:"Python",slug:"python"},{level:3,title:"QGIS",slug:"qgis"},{level:3,title:"R",slug:"r"},{level:3,title:"Web Editor",slug:"web-editor"},{level:2,title:"Back-ends",slug:"back-ends"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Contributor Code of Conduct",frontmatter:{},regularPath:"/documentation/code-of-conduct.html",relativePath:"documentation/code-of-conduct.md",key:"v-c71b5aa6",path:"/documentation/code-of-conduct.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Software Development Guidelines",frontmatter:{},regularPath:"/documentation/software-guidelines.html",relativePath:"documentation/software-guidelines.md",key:"v-1005bb66",path:"/documentation/software-guidelines.html",headers:[{level:2,title:"Software quality guidelines",slug:"software-quality-guidelines"},{level:2,title:"Software documentation guidelines",slug:"software-documentation-guidelines"},{level:2,title:"Software review",slug:"software-review"},{level:2,title:"Test-driven development",slug:"test-driven-development"},{level:2,title:"Continuous integration",slug:"continuous-integration"},{level:2,title:"Additional guidelines",slug:"additional-guidelines"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"IEEE IGARRS 2021 HD-3: Hands-on openEO: access cloud platforms using your preferred programming language",frontmatter:{},regularPath:"/events/igarrs2021.html",relativePath:"events/igarrs2021.md",key:"v-186cd6ed",path:"/events/igarrs2021.html",headers:[{level:2,title:"Agenda",slug:"agenda"},{level:2,title:"Python client",slug:"python-client"},{level:3,title:"Logging in",slug:"logging-in"},{level:3,title:"openEO in Python intro",slug:"openeo-in-python-intro"},{level:2,title:"R client",slug:"r-client"},{level:2,title:"openEO user interfaces",slug:"openeo-user-interfaces"},{level:2,title:"Use cases",slug:"use-cases"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Welcome to openEO!",frontmatter:{news:!0,title:"Welcome to openEO!",date:"2017-12-05T00:00:00.000Z",author:"Edzer Pebesma"},regularPath:"/news/2017-12-05-welcome.html",relativePath:"news/2017-12-05-welcome.md",key:"v-0ee3f026",path:"/news/2017-12-05-welcome.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"First week of intensive collaboration: Dec 4-6, 2017",frontmatter:{news:!0,title:"First week of intensive collaboration: Dec 4-6, 2017",date:"2017-12-18T00:00:00.000Z",author:"Edzer Pebesma"},regularPath:"/news/2017-12-18-VITO_meeting.html",relativePath:"news/2017-12-18-VITO_meeting.md",key:"v-2997b752",path:"/news/2017-12-18-VITO_meeting.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO proves its concept",frontmatter:{news:!0,title:"openEO proves its concept",date:"2018-03-17T00:00:00.000Z",author:"Edzer Pebesma, the openEO consortium"},regularPath:"/news/2018-03-15-poc.html",relativePath:"news/2018-03-15-poc.md",key:"v-4fe4e126",path:"/news/2018-03-15-poc.html",headers:[{level:2,title:"The problem",slug:"the-problem"},{level:2,title:"Why an API?",slug:"why-an-api"},{level:2,title:"First results",slug:"first-results"},{level:2,title:"The three use cases",slug:"the-three-use-cases"},{level:2,title:"Links to the client and back-end implementations",slug:"links-to-the-client-and-back-end-implementations"},{level:2,title:"Proof-of-concept videos",slug:"proof-of-concept-videos"},{level:3,title:"R client and WCPS back-end, use case 1",slug:"r-client-and-wcps-back-end-use-case-1"},{level:3,title:"Grass GIS back-end, use cases 1, 2 and 3",slug:"grass-gis-back-end-use-cases-1-2-and-3"},{level:3,title:"R client and R back-end, use-case 1",slug:"r-client-and-r-back-end-use-case-1"},{level:3,title:"R client and R back-end, use case 3",slug:"r-client-and-r-back-end-use-case-3"},{level:3,title:"openEO Web Editor (JS client) with three back-ends (use case 1)",slug:"openeo-web-editor-js-client-with-three-back-ends-use-case-1"},{level:3,title:"openEO Web Editor (JS client) with R back-end (use case 3)",slug:"openeo-web-editor-js-client-with-r-back-end-use-case-3"},{level:3,title:"Python client with GeoPySpark back-end (use case 1)",slug:"python-client-with-geopyspark-back-end-use-case-1"},{level:3,title:"openEO Web Editor (JS client) with Google Earth Engine back-end (use case 1)",slug:"openeo-web-editor-js-client-with-google-earth-engine-back-end-use-case-1"},{level:2,title:"Links to documents",slug:"links-to-documents"},{level:2,title:"Next steps",slug:"next-steps"},{level:2,title:"Getting involved",slug:"getting-involved"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Second week of intensive collaboration: Jan 22-24, 2018",frontmatter:{news:!0,title:"Second week of intensive collaboration: Jan 22-24, 2018",date:"2018-01-31T00:00:00.000Z",author:"Marius Appel"},regularPath:"/news/2018-01-31-WWU_meeting.html",relativePath:"news/2018-01-31-WWU_meeting.md",key:"v-24966ce6",path:"/news/2018-01-31-WWU_meeting.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User Requirements Survey for openEO launched",frontmatter:{news:!0,title:"User Requirements Survey for openEO launched",date:"2018-05-23T00:00:00.000Z",author:"Sarah Carter"},regularPath:"/news/2018-05-23-user-requirements-survey-launched.html",relativePath:"news/2018-05-23-user-requirements-survey-launched.md",key:"v-f9778ae6",path:"/news/2018-05-23-user-requirements-survey-launched.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO year one review meeting",frontmatter:{news:!0,title:"openEO year one review meeting",date:"2018-10-30T00:00:00.000Z",author:"Matthias Schramm"},regularPath:"/news/2018-10-30-year-one-review-meeting.html",relativePath:"news/2018-10-30-year-one-review-meeting.md",key:"v-d2a018a6",path:"/news/2018-10-30-year-one-review-meeting.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO API v0.4.0 released",frontmatter:{news:!0,title:"openEO API v0.4.0 released",date:"2019-03-07T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2019-03-07-openeo-api-040.html",relativePath:"news/2019-03-07-openeo-api-040.md",key:"v-45d803ab",path:"/news/2019-03-07-openeo-api-040.html",headers:[{level:2,title:"New process catalogue and process graph changes",slug:"new-process-catalogue-and-process-graph-changes"},{level:2,title:"Other improvements",slug:"other-improvements"},{level:2,title:"Next steps",slug:"next-steps"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"H2020 EO Big Data Hackathon Nov 7-8",frontmatter:{news:!0,title:"H2020 EO Big Data Hackathon Nov 7-8",date:"2019-10-07T00:00:00.000Z",author:"Edzer Pebesma"},regularPath:"/news/2019-10-07-EO-big-data-hackaton.html",relativePath:"news/2019-10-07-EO-big-data-hackaton.md",key:"v-9ddae032",path:"/news/2019-10-07-EO-big-data-hackaton.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Lessons learned while developing the openEO API",frontmatter:{news:!0,title:"Lessons learned while developing the openEO API",date:"2020-07-31T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2020-07-31-lessons-learned.html",relativePath:"news/2020-07-31-lessons-learned.md",key:"v-3f85032d",path:"/news/2020-07-31-lessons-learned.html",headers:[{level:2,title:"1. Collection Names",slug:"_1-collection-names"},{level:2,title:"2. Other Names",slug:"_2-other-names"},{level:2,title:"3. Chunked Collections",slug:"_3-chunked-collections"},{level:2,title:"4. What to specify?",slug:"_4-what-to-specify"},{level:3,title:"File Formats",slug:"file-formats"},{level:2,title:"5. Authentication",slug:"_5-authentication"},{level:2,title:"6. Debugging Experience",slug:"_6-debugging-experience"},{level:2,title:"7. Defining interoperable Processes",slug:"_7-defining-interoperable-processes"},{level:2,title:"Conclusion",slug:"conclusion"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Stable release of the openEO API and Processes (v1.0.0)",frontmatter:{news:!0,title:"Stable release of the openEO API and Processes (v1.0.0)",date:"2020-07-31T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2020-07-31-openeo-api-released.html",relativePath:"news/2020-07-31-openeo-api-released.md",key:"v-2fcee9ad",path:"/news/2020-07-31-openeo-api-released.html",headers:[{level:2,title:"Processes",slug:"processes"},{level:2,title:"STAC and OGC APIs",slug:"stac-and-ogc-apis"},{level:2,title:"User-defined Functions (UDFs)",slug:"user-defined-functions-udfs"},{level:2,title:"Other improvements",slug:"other-improvements"},{level:2,title:"Limitations",slug:"limitations"},{level:2,title:"Next steps",slug:"next-steps"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO API v1.0.1 released",frontmatter:{news:!0,title:"openEO API v1.0.1 released",date:"2020-11-30T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2020-11-30-openeo-api-101-released.html",relativePath:"news/2020-11-30-openeo-api-101-released.md",key:"v-0e5e57cd",path:"/news/2020-11-30-openeo-api-101-released.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Virtual User Workshop",frontmatter:{news:!0,title:"openEO Virtual User Workshop",date:"2020-09-02T00:00:00.000Z",author:"Matthias Schramm"},regularPath:"/news/2020-09-02-openeo-user-workshop.html",relativePath:"news/2020-09-02-openeo-user-workshop.md",key:"v-525dec3e",path:"/news/2020-09-02-openeo-user-workshop.html",headers:[{level:3,title:"UPDATE:",slug:"update"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO API v1.1.0 released",frontmatter:{news:!0,title:"openEO API v1.1.0 released",date:"2021-05-17T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2021-05-17-openeo-api-110-released.html",relativePath:"news/2021-05-17-openeo-api-110-released.md",key:"v-6e6b7e2d",path:"/news/2021-05-17-openeo-api-110-released.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client on CRAN",frontmatter:{news:!0,title:"R Client on CRAN",date:"2021-11-08T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2021-11-08-r-client-on-cran.html",relativePath:"news/2021-11-08-r-client-on-cran.md",key:"v-06e0a8ca",path:"/news/2021-11-08-r-client-on-cran.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO PSC meetings",frontmatter:{news:!0,title:"openEO PSC meetings",date:"2022-04-08T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2022-04-08-psc-meetings.html",relativePath:"news/2022-04-08-psc-meetings.md",key:"v-1227575e",path:"/news/2022-04-08-psc-meetings.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client v1.2.0 has been released",frontmatter:{news:!0,title:"R Client v1.2.0 has been released",date:"2022-05-12T00:00:00.000Z",author:"Matthias Mohr, Florian Lahn"},regularPath:"/news/2022-05-12-r-client-v120.html",relativePath:"news/2022-05-12-r-client-v120.md",key:"v-59d340ad",path:"/news/2022-05-12-r-client-v120.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Monthly openEO community meeting",frontmatter:{news:!0,title:"Monthly openEO community meeting",date:"2022-07-07T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2022-07-07-monthly-dev-calls.html",relativePath:"news/2022-07-07-monthly-dev-calls.md",key:"v-00d62ee6",path:"/news/2022-07-07-monthly-dev-calls.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"New releases for openEO API and openEO Processes, focus on vector data",frontmatter:{news:!0,title:"New releases for openEO API and openEO Processes, focus on vector data",date:"2023-05-25T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html",relativePath:"news/2023-05-25-new-openeo-versions-120-200rc1 copy.md",key:"v-3eeef04a",path:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html",headers:[{level:2,title:"openEO API v1.2.0",slug:"openeo-api-v1-2-0"},{level:2,title:"openEO Processes v2.0.0-rc.1",slug:"openeo-processes-v2-0-0-rc-1"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client v1.3.0 has been released",frontmatter:{news:!0,title:"R Client v1.3.0 has been released",date:"2022-11-17T00:00:00.000Z",author:"Matthias Mohr, Peter J. Zellner, Florian Lahn"},regularPath:"/news/2022-11-17-r-client-v130.html",relativePath:"news/2022-11-17-r-client-v130.md",key:"v-221bfb8d",path:"/news/2022-11-17-r-client-v130.html",headers:[{level:2,title:"Better support for sf",slug:"better-support-for-sf"},{level:2,title:"New Vignettes",slug:"new-vignettes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO submitted to OGC for consideration as an OGC community standard",frontmatter:{news:!0,title:"openEO submitted to OGC for consideration as an OGC community standard",date:"2023-12-06T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2023-12-06-openeo-submitted-to-ogc.html",relativePath:"news/2023-12-06-openeo-submitted-to-ogc.md",key:"v-857a96a6",path:"/news/2023-12-06-openeo-submitted-to-ogc.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"OGC seeks public comment on the adoption of openEO as a Community Standard",frontmatter:{news:!0,title:"OGC seeks public comment on the adoption of openEO as a Community Standard",date:"2024-02-06T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2024-02-06-openeo-ogc-rfc.html",relativePath:"news/2024-02-06-openeo-ogc-rfc.md",key:"v-10d9ffb7",path:"/news/2024-02-06-openeo-ogc-rfc.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"MOOC Cubes and Clouds - open for registration",frontmatter:{news:!0,title:"MOOC Cubes and Clouds - open for registration",date:"2024-03-22T00:00:00.000Z",author:"Peter Zellner"},regularPath:"/news/2024-03-22_mooc_cubeandclouds.html",relativePath:"news/2024-03-22_mooc_cubeandclouds.md",key:"v-d5007282",path:"/news/2024-03-22_mooc_cubeandclouds.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Project Steering Committee",frontmatter:{},regularPath:"/psc.html",relativePath:"psc.md",key:"v-64c18f4d",path:"/psc.html",headers:[{level:2,title:"Members",slug:"members"},{level:2,title:"Detailed Process",slug:"detailed-process"},{level:3,title:"When is Vote Required?",slug:"when-is-vote-required"},{level:3,title:"Final remarks",slug:"final-remarks"},{level:2,title:"Committee Membership",slug:"committee-membership"},{level:3,title:"Adding Members",slug:"adding-members"},{level:3,title:"Stepping Down",slug:"stepping-down"},{level:2,title:"History",slug:"history"}],codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Software",frontmatter:{},regularPath:"/software.html",relativePath:"software.md",key:"v-9adb302a",path:"/software.html",headers:[{level:2,title:"Clients",slug:"clients"},{level:2,title:"Back-ends",slug:"back-ends"},{level:2,title:"Specification",slug:"specification"},{level:2,title:"Ecosystem",slug:"ecosystem"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"News",frontmatter:{sidebar:!1},regularPath:"/news/",relativePath:"news/README.md",key:"v-8850e2c4",path:"/news/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}}],themeConfig:{apiVersion:"1.2.0",versions:[{folder:"1.0",path:"/documentation/1.0/",title:"1.x",apiTag:"1.2.0",processesTag:"2.0.0-rc.1",apiVersions:["1.0.0","1.0.1","1.1.0","1.2.0"],userNav:[{text:"Introduction",link:"index.html"},{text:"Glossary",link:"glossary.html"},{text:"Datacubes",link:"datacubes.html"},{text:"Getting Started",items:[{text:"JavaScript",link:"javascript/index.html"},{text:"Python",link:"python/index.html"},{text:"QGIS",link:"qgis/index.html"},{text:"R",link:"r/index.html"},{text:"Client-Side Processing (Python)",link:"python/client-side-processing.html"}]},{text:"Processes",link:"processes.html"},{text:"Cookbook",link:"cookbook/index.html"},{text:"Authentication",link:"authentication.html"},{text:"UDFs",link:"udfs.html"}],devNav:[{text:"Introduction",link:"developers/index.html"},{text:"Glossary",link:"glossary.html"},{text:"Architecture",link:"developers/arch.html"},{text:"Service Providers",items:[{text:"Getting Started",link:"developers/backends/getting-started.html"},{text:"Performance Guide",link:"developers/backends/performance.html"},{text:"Xarray / Dask Guide",link:"developers/backends/xarray.html"},{text:"Profiles",link:"developers/profiles/index.html"}]},{text:"Client Developers",items:[{text:"Getting Started",link:"developers/clients/getting-started.html"},{text:"Library Guidelines",link:"developers/clients/library-guidelines.html"}]},{text:"API",items:[{text:"Reference",link:"developers/api/reference.html"},{text:"Profiles",link:"developers/profiles/api.html"}]},{text:"Processes",items:[{text:"Reference",link:"processes.html"},{text:"Profiles",link:"developers/profiles/processes.html"}]},{text:"Error Codes",link:"developers/api/errors.html"},{text:"Authentication",link:"authentication.html"},{text:"UDFs",link:"udfs.html"}]},{folder:"0.4",path:"/documentation/0.4/",title:"0.4",apiTag:"0.4.2",apiFormat:"json",processesTag:"0.4.2",apiVersions:["0.4.0","0.4.1","0.4.2"],userNav:[{text:"Getting Started",link:"getting-started.html"},{text:"Glossary",link:"glossary.html"},{text:"Processes",link:"processes.html"},{text:"UDFs",link:"udfs.html"}],devNav:[{text:"Introduction",link:"developers/index.html"},{text:"Glossary",link:"glossary.html"},{text:"Architecture",link:"developers/arch.html"},{text:"Service Providers",items:[{text:"Getting Started",link:"developers/backends/getting-started.html"},{text:"UDFs",link:"developers/backends/udfs.html"}]},{text:"Client Developers",items:[{text:"Getting Started",link:"developers/clients/getting-started.html"},{text:"Library Guidelines",link:"developers/clients/library-guidelines.html"}]},{text:"API",items:[{text:"Specification",link:"developers/api/reference.html"},{text:"Further documentation",link:"developers/api/index.html"}]},{text:"Processes",link:"processes.html"},{text:"Error Codes",link:"developers/api/errors.html"},{text:"Examples",link:"developers/examples/"}]}],defaultVersion:0,docPath:"/documentation/1.0/",logo:"/images/openeo_navbar_logo.png",editLinks:!0,docsRepo:"Open-EO/openeo.org",algolia:{appId:"3J2STFK847",apiKey:"b12d6cb143c2ddadfa8989c962d1a049",indexName:"openeo"},nav:[{text:"Home",link:"/"},{text:"About",link:"/about.html"},{text:"News",link:"/news/"},{text:"Software",link:"/software.html"},{text:"Services / Hub",link:"https://hub.openeo.org"},{text:"User Documentation",userNav:!0,items:[]},{text:"Developers",devNav:!0,items:[]},{text:"PSC",link:"/psc.html"},{text:"Contact",link:"/contact.html"}],sidebar:"auto"}},Lt=n(148),It=Lt.themeConfig.versions[Lt.themeConfig.defaultVersion];"undefined"!=typeof window&&(window.global=window);n(149);r.a.component("ApiSpec",()=>n.e(38).then(n.bind(null,477))),r.a.component("Channels",()=>Promise.all([n.e(0),n.e(26)]).then(n.bind(null,478))),r.a.component("ErrorCodes",()=>n.e(19).then(n.bind(null,479))),r.a.component("InlineFrame",()=>Promise.all([n.e(0),n.e(27)]).then(n.bind(null,480))),r.a.component("News",()=>n.e(39).then(n.bind(null,481))),r.a.component("ProcessesSpec",()=>n.e(40).then(n.bind(null,482))),r.a.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,488)));n(150),n(151);r.a.component("CodeSwitcher",()=>n.e(53).then(n.bind(null,483)));var Dt=[({router:e,Vue:t})=>{t.config.ignoredElements=["redoc"],e.addRoutes([{path:"/documentation",redirect:It.path},{path:"/about",redirect:"about.html"},{path:"/software",redirect:"software.html"},{path:"/contact",redirect:"contact.html"},{path:"/glossary",redirect:It.path+"glossary.html"},{path:"/documentation/1.0/developers/backends/opendatacube.html",redirect:"/documentation/1.0/developers/backends/xarray.html"}])},{},({Vue:e})=>{e.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},{},{},{},({Vue:e})=>{e.component("CodeCopy",$t)}],Nt=[];class Ft extends class{constructor(){this.store=new r.a({data:{state:{}}})}$get(e){return this.store.state[e]}$set(e,t){r.a.set(this.store.state,e,t)}$emit(...e){this.store.$emit(...e)}$on(...e){this.store.$on(...e)}}{}Object.assign(Ft.prototype,{getPageAsyncComponent:lt,getLayoutAsyncComponent:ct,getAsyncComponent:ut,getVueComponent:pt});var Jt={install(e){const t=new Ft;e.$vuepress=t,e.prototype.$vuepress=t}};function Bt(e,t){const n=t.toLowerCase();return e.options.routes.some(e=>e.path.toLowerCase()===n)}var Vt={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(e){const t=this.pageKey||this.$parent.$page.key;return ft("pageKey",t),r.a.component(t)||r.a.component(t,lt(t)),r.a.component(t)?e(t):e("")}},zt={functional:!0,props:{slotKey:String,required:!0},render:(e,{props:t,slots:n})=>e("div",{class:["content__"+t.slotKey]},n()[t.slotKey])},qt={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},Gt=(n(152),n(153),Object(jt.a)(qt,(function(){var e=this._self._c;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Wt={functional:!0,render(e,{parent:t,children:n}){if(t._isMounted)return n;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};r.a.config.productionTip=!1,r.a.use(Ge),r.a.use(Jt),r.a.mixin(function(e,t,n=r.a){!function(e){e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(t),n.$vuepress.$set("siteData",t);const o=new(e(n.$vuepress.$get("siteData"))),a=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(o)),i={};return Object.keys(a).reduce((e,t)=>(t.startsWith("$")&&(e[t]=a[t].get),e),i),{computed:i}}(e=>class{setPage(e){this.__page=e}get $site(){return e}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:e={}}=this.$site;let t,n;for(const r in e)"/"===r?n=e[r]:0===this.$page.path.indexOf(r)&&(t=e[r]);return t||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:e}=this.$page.frontmatter;return"string"==typeof e&&e}get $title(){const e=this.$page,{metaTitle:t}=this.$page.frontmatter;if("string"==typeof t)return t;const n=this.$siteTitle,r=e.frontmatter.home?null:e.frontmatter.title||e.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const e=function(e){if(e){const t=e.filter(e=>"description"===e.name)[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(e,t){for(let n=0;nn||(e.hash?!r.a.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(e.hash)}:{x:0,y:0})});!function(e){e.beforeEach((t,n,r)=>{if(Bt(e,t.path))r();else if(/(\/|\.html)$/.test(t.path))if(/\/$/.test(t.path)){const n=t.path.replace(/\/$/,"")+".html";Bt(e,n)?r(n):r()}else r();else{const n=t.path+"/",o=t.path+".html";Bt(e,o)?r(o):Bt(e,n)?r(n):r()}})}(n);const o={};try{await Promise.all(Dt.filter(e=>"function"==typeof e).map(t=>t({Vue:r.a,options:o,router:n,siteData:Mt,isServer:e})))}catch(e){console.error(e)}return{app:new r.a(Object.assign(o,{router:n,render:e=>e("div",{attrs:{id:"app"}},[e("RouterView",{ref:"layout"}),e("div",{class:"global-ui"},Nt.map(t=>e(t)))])})),router:n}}(!1).then(({app:e,router:t})=>{t.onReady(()=>{e.$mount("#app")})})}]); \ No newline at end of file + */function o(e,t){for(var n in t)e[n]=t[n];return e}var a=/[!'()*]/g,i=function(e){return"%"+e.charCodeAt(0).toString(16)},s=/%2C/g,l=function(e){return encodeURIComponent(e).replace(a,i).replace(s,",")};function c(e){try{return decodeURIComponent(e)}catch(e){0}return e}var u=function(e){return null==e||"object"==typeof e?e:String(e)};function p(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var n=e.replace(/\+/g," ").split("="),r=c(n.shift()),o=n.length>0?c(n.join("=")):null;void 0===t[r]?t[r]=o:Array.isArray(t[r])?t[r].push(o):t[r]=[t[r],o]})),t):t}function d(e){var t=e?Object.keys(e).map((function(t){var n=e[t];if(void 0===n)return"";if(null===n)return l(t);if(Array.isArray(n)){var r=[];return n.forEach((function(e){void 0!==e&&(null===e?r.push(l(t)):r.push(l(t)+"="+l(e)))})),r.join("&")}return l(t)+"="+l(n)})).filter((function(e){return e.length>0})).join("&"):null;return t?"?"+t:""}var f=/\/?$/;function h(e,t,n,r){var o=r&&r.options.stringifyQuery,a=t.query||{};try{a=v(a)}catch(e){}var i={name:t.name||e&&e.name,meta:e&&e.meta||{},path:t.path||"/",hash:t.hash||"",query:a,params:t.params||{},fullPath:y(t,o),matched:e?g(e):[]};return n&&(i.redirectedFrom=y(n,o)),Object.freeze(i)}function v(e){if(Array.isArray(e))return e.map(v);if(e&&"object"==typeof e){var t={};for(var n in e)t[n]=v(e[n]);return t}return e}var m=h(null,{path:"/"});function g(e){for(var t=[];e;)t.unshift(e),e=e.parent;return t}function y(e,t){var n=e.path,r=e.query;void 0===r&&(r={});var o=e.hash;return void 0===o&&(o=""),(n||"/")+(t||d)(r)+o}function b(e,t,n){return t===m?e===t:!!t&&(e.path&&t.path?e.path.replace(f,"")===t.path.replace(f,"")&&(n||e.hash===t.hash&&w(e.query,t.query)):!(!e.name||!t.name)&&(e.name===t.name&&(n||e.hash===t.hash&&w(e.query,t.query)&&w(e.params,t.params))))}function w(e,t){if(void 0===e&&(e={}),void 0===t&&(t={}),!e||!t)return e===t;var n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((function(n,o){var a=e[n];if(r[o]!==n)return!1;var i=t[n];return null==a||null==i?a===i:"object"==typeof a&&"object"==typeof i?w(a,i):String(a)===String(i)}))}function _(e){for(var t=0;t=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}(a.path||""),d=t&&t.path||"/",f=c.path?k(c.path,d,n||a.append):d,h=function(e,t,n){void 0===t&&(t={});var r,o=n||p;try{r=o(e||"")}catch(e){r={}}for(var a in t){var i=t[a];r[a]=Array.isArray(i)?i.map(u):u(i)}return r}(c.query,a.query,r&&r.options.parseQuery),v=a.hash||c.hash;return v&&"#"!==v.charAt(0)&&(v="#"+v),{_normalized:!0,path:f,query:h,hash:v}}var q,G=function(){},W={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,a=n.resolve(this.to,r,this.append),i=a.location,s=a.route,l=a.href,c={},u=n.options.linkActiveClass,p=n.options.linkExactActiveClass,d=null==u?"router-link-active":u,v=null==p?"router-link-exact-active":p,m=null==this.activeClass?d:this.activeClass,g=null==this.exactActiveClass?v:this.exactActiveClass,y=s.redirectedFrom?h(null,z(s.redirectedFrom),null,n):s;c[g]=b(r,y,this.exactPath),c[m]=this.exact||this.exactPath?c[g]:function(e,t){return 0===e.path.replace(f,"/").indexOf(t.path.replace(f,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,y);var w=c[g]?this.ariaCurrentValue:null,_=function(e){H(e)&&(t.replace?n.replace(i,G):n.push(i,G))},x={click:H};Array.isArray(this.event)?this.event.forEach((function(e){x[e]=_})):x[this.event]=_;var P={class:c},k=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:l,route:s,navigate:_,isActive:c[m],isExactActive:c[g]});if(k){if(1===k.length)return k[0];if(k.length>1||!k.length)return 0===k.length?e():e("span",{},k)}if("a"===this.tag)P.on=x,P.attrs={href:l,"aria-current":w};else{var S=function e(t){var n;if(t)for(var r=0;r-1&&(s.params[d]=n.params[d]);return s.path=V(u.path,s.params),l(u,s,i)}if(s.path){s.params={};for(var f=0;f-1}function Se(e,t){return ke(e)&&e._isRouter&&(null==t||e.type===t)}function Oe(e,t,n){var r=function(o){o>=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}function Ce(e){return function(t,n,r){var o=!1,a=0,i=null;Ee(e,(function(e,t,n,s){if("function"==typeof e&&void 0===e.cid){o=!0,a++;var l,c=Te((function(t){var o;((o=t).__esModule||$e&&"Module"===o[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:q.extend(t),n.components[s]=t,--a<=0&&r()})),u=Te((function(e){var t="Failed to resolve async component "+s+": "+e;i||(i=ke(e)?e:new Error(t),r(i))}));try{l=e(c,u)}catch(e){u(e)}if(l)if("function"==typeof l.then)l.then(c,u);else{var p=l.component;p&&"function"==typeof p.then&&p.then(c,u)}}})),o||r()}}function Ee(e,t){return je(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function je(e){return Array.prototype.concat.apply([],e)}var $e="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Te(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var Ae=function(e,t){this.router=e,this.base=function(e){if(!e)if(Z){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=m,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Re(e,t,n,r){var o=Ee(e,(function(e,r,o,a){var i=function(e,t){"function"!=typeof e&&(e=q.extend(e));return e.options[t]}(e,t);if(i)return Array.isArray(i)?i.map((function(e){return n(e,r,o,a)})):n(i,r,o,a)}));return je(r?o.reverse():o)}function Ue(e,t){if(t)return function(){return e.apply(t,arguments)}}Ae.prototype.listen=function(e){this.cb=e},Ae.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ae.prototype.onError=function(e){this.errorCbs.push(e)},Ae.prototype.transitionTo=function(e,t,n){var r,o=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var a=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),t&&t(r),o.ensureURL(),o.router.afterHooks.forEach((function(e){e&&e(r,a)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!o.ready&&(Se(e,be.redirected)&&a===m||(o.ready=!0,o.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ae.prototype.confirmTransition=function(e,t,n){var r=this,o=this.current;this.pending=e;var a,i,s=function(e){!Se(e)&&ke(e)&&(r.errorCbs.length?r.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},l=e.matched.length-1,c=o.matched.length-1;if(b(e,o)&&l===c&&e.matched[l]===o.matched[c])return this.ensureURL(),e.hash&&se(this.router,o,e,!1),s(((i=xe(a=o,e,be.duplicated,'Avoided redundant navigation to current location: "'+a.fullPath+'".')).name="NavigationDuplicated",i));var u=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=me&&n;r&&this.listeners.push(ie());var o=function(){var n=e.current,o=Le(e.base);e.current===m&&o===e._startLocation||e.transitionTo(o,(function(e){r&&se(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ge(S(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ye(S(r.base+e.fullPath)),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Le(this.base)!==this.current.fullPath){var t=S(this.base+this.current.fullPath);e?ge(t):ye(t)}},t.prototype.getCurrentLocation=function(){return Le(this.base)},t}(Ae);function Le(e){var t=window.location.pathname,n=t.toLowerCase(),r=e.toLowerCase();return!e||n!==r&&0!==n.indexOf(S(r+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Ie=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=Le(e);if(!/^\/#/.test(t))return window.location.replace(S(e+"/#"+t)),!0}(this.base)||De()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=me&&t;n&&this.listeners.push(ie());var r=function(){var t=e.current;De()&&e.transitionTo(Ne(),(function(r){n&&se(e.router,r,t,!0),me||Be(r.fullPath)}))},o=me?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Je(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Be(e.fullPath),se(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Ne()!==t&&(e?Je(t):Be(t))},t.prototype.getCurrentLocation=function(){return Ne()},t}(Ae);function De(){var e=Ne();return"/"===e.charAt(0)||(Be("/"+e),!1)}function Ne(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Fe(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Je(e){me?ge(Fe(e)):window.location.hash=e}function Be(e){me?ye(Fe(e)):window.location.replace(Fe(e))}var Ve=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){Se(e,be.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ae),ze=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Q(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!me&&!1!==e.fallback,this.fallback&&(t="hash"),Z||(t="abstract"),this.mode=t,t){case"history":this.history=new Me(this,e.base);break;case"hash":this.history=new Ie(this,e.base,this.fallback);break;case"abstract":this.history=new Ve(this,e.base);break;default:0}},qe={currentRoute:{configurable:!0}};ze.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},qe.currentRoute.get=function(){return this.history&&this.history.current},ze.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof Me||n instanceof Ie){var r=function(e){n.setupListeners(),function(e){var r=n.current,o=t.options.scrollBehavior;me&&o&&"fullPath"in e&&se(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},ze.prototype.beforeEach=function(e){return We(this.beforeHooks,e)},ze.prototype.beforeResolve=function(e){return We(this.resolveHooks,e)},ze.prototype.afterEach=function(e){return We(this.afterHooks,e)},ze.prototype.onReady=function(e,t){this.history.onReady(e,t)},ze.prototype.onError=function(e){this.history.onError(e)},ze.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},ze.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},ze.prototype.go=function(e){this.history.go(e)},ze.prototype.back=function(){this.go(-1)},ze.prototype.forward=function(){this.go(1)},ze.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},ze.prototype.resolve=function(e,t,n){var r=z(e,t=t||this.history.current,n,this),o=this.match(r,t),a=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(e,t,n){var r="hash"===n?"#"+t:t;return e?S(e+"/"+r):r}(this.history.base,a,this.mode),normalizedTo:r,resolved:o}},ze.prototype.getRoutes=function(){return this.matcher.getRoutes()},ze.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},ze.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(ze.prototype,qe);var Ge=ze;function We(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}ze.install=function e(t){if(!e.installed||q!==t){e.installed=!0,q=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",x),t.component("RouterLink",W);var o=t.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},ze.version="3.6.5",ze.isNavigationFailure=Se,ze.NavigationFailureType=be,ze.START_LOCATION=m,Z&&window.Vue&&window.Vue.use(ze);var He={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(29)]).then(n.bind(null,290)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,180)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(30)]).then(n.bind(null,160)),"components/Home":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,291)),"components/NavLink":()=>n.e(38).then(n.bind(null,159)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,200)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,465)),"components/Page":()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,292)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,205)),"components/PageNav":()=>Promise.all([n.e(0),n.e(21)]).then(n.bind(null,206)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,293)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(31)]).then(n.bind(null,296)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,201)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,181)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,176)),"components/VersionChooser":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,294)),"components/VersioningMixin":()=>n.e(52).then(n.bind(null,164)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,490)),"layouts/404":()=>n.e(7).then(n.bind(null,477)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,478)),NotFound:()=>n.e(7).then(n.bind(null,477)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,478))},Ze={"v-3ec20de4":()=>n.e(54).then(n.bind(null,491)),"v-31596d2d":()=>n.e(55).then(n.bind(null,492)),"v-5e94256a":()=>n.e(57).then(n.bind(null,493)),"v-4155eb1e":()=>n.e(58).then(n.bind(null,494)),"v-26232766":()=>n.e(56).then(n.bind(null,495)),"v-5e0de9fe":()=>n.e(59).then(n.bind(null,496)),"v-418e1b4d":()=>n.e(60).then(n.bind(null,497)),"v-63a2d53d":()=>n.e(61).then(n.bind(null,498)),"v-6bf62e0d":()=>n.e(41).then(n.bind(null,499)),"v-d80ea866":()=>n.e(62).then(n.bind(null,500)),"v-4081eb72":()=>n.e(64).then(n.bind(null,501)),"v-4899abd1":()=>n.e(63).then(n.bind(null,502)),"v-0059cb2a":()=>n.e(66).then(n.bind(null,503)),"v-5e5c94cd":()=>n.e(65).then(n.bind(null,504)),"v-25dd3de6":()=>n.e(67).then(n.bind(null,505)),"v-6993aee6":()=>n.e(68).then(n.bind(null,506)),"v-3359623e":()=>n.e(42).then(n.bind(null,507)),"v-37dbaaa0":()=>n.e(71).then(n.bind(null,508)),"v-6aca4be5":()=>n.e(70).then(n.bind(null,509)),"v-cfac61a6":()=>n.e(69).then(n.bind(null,510)),"v-7758ae27":()=>n.e(72).then(n.bind(null,511)),"v-5fd8f1ad":()=>n.e(13).then(n.bind(null,512)),"v-f5de2fb4":()=>n.e(73).then(n.bind(null,513)),"v-654015de":()=>n.e(75).then(n.bind(null,514)),"v-9f635184":()=>n.e(18).then(n.bind(null,515)),"v-8d587926":()=>n.e(76).then(n.bind(null,516)),"v-dc734f12":()=>n.e(77).then(n.bind(null,517)),"v-75018026":()=>n.e(43).then(n.bind(null,518)),"v-43de507e":()=>n.e(74).then(n.bind(null,519)),"v-253cefad":()=>n.e(79).then(n.bind(null,520)),"v-1772ad2d":()=>n.e(78).then(n.bind(null,521)),"v-2840d4fe":()=>n.e(80).then(n.bind(null,522)),"v-1b45967e":()=>n.e(81).then(n.bind(null,523)),"v-021062ed":()=>n.e(82).then(n.bind(null,524)),"v-97aa86e6":()=>n.e(44).then(n.bind(null,525)),"v-e35c5e24":()=>n.e(83).then(n.bind(null,526)),"v-4af2bfca":()=>n.e(84).then(n.bind(null,527)),"v-1a823cb0":()=>n.e(46).then(n.bind(null,528)),"v-04d2236d":()=>n.e(45).then(n.bind(null,529)),"v-00153acd":()=>n.e(85).then(n.bind(null,530)),"v-9a2a2626":()=>n.e(86).then(n.bind(null,531)),"v-560d08d2":()=>n.e(47).then(n.bind(null,532)),"v-ef2073ec":()=>n.e(15).then(n.bind(null,533)),"v-592eaa86":()=>n.e(48).then(n.bind(null,534)),"v-ffc79ec2":()=>n.e(87).then(n.bind(null,535)),"v-c71b5aa6":()=>n.e(88).then(n.bind(null,536)),"v-1005bb66":()=>n.e(89).then(n.bind(null,537)),"v-186cd6ed":()=>n.e(90).then(n.bind(null,538)),"v-0ee3f026":()=>n.e(91).then(n.bind(null,539)),"v-2997b752":()=>n.e(92).then(n.bind(null,540)),"v-24966ce6":()=>n.e(49).then(n.bind(null,541)),"v-4fe4e126":()=>n.e(93).then(n.bind(null,542)),"v-d2a018a6":()=>n.e(95).then(n.bind(null,543)),"v-f9778ae6":()=>n.e(94).then(n.bind(null,544)),"v-9ddae032":()=>n.e(96).then(n.bind(null,545)),"v-45d803ab":()=>n.e(50).then(n.bind(null,546)),"v-2fcee9ad":()=>n.e(98).then(n.bind(null,547)),"v-3f85032d":()=>n.e(97).then(n.bind(null,548)),"v-0e5e57cd":()=>n.e(100).then(n.bind(null,549)),"v-525dec3e":()=>n.e(99).then(n.bind(null,550)),"v-06e0a8ca":()=>n.e(102).then(n.bind(null,551)),"v-6e6b7e2d":()=>n.e(101).then(n.bind(null,552)),"v-1227575e":()=>n.e(103).then(n.bind(null,553)),"v-59d340ad":()=>n.e(51).then(n.bind(null,554)),"v-00d62ee6":()=>n.e(104).then(n.bind(null,555)),"v-221bfb8d":()=>n.e(105).then(n.bind(null,556)),"v-3eeef04a":()=>n.e(106).then(n.bind(null,557)),"v-d5007282":()=>n.e(109).then(n.bind(null,558)),"v-857a96a6":()=>n.e(107).then(n.bind(null,559)),"v-10d9ffb7":()=>n.e(108).then(n.bind(null,560)),"v-8850e2c4":()=>n.e(110).then(n.bind(null,561)),"v-64c18f4d":()=>n.e(111).then(n.bind(null,562)),"v-9adb302a":()=>n.e(112).then(n.bind(null,563))};function Ke(e){const t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}const Xe=/-(\w)/g,Qe=Ke(e=>e.replace(Xe,(e,t)=>t?t.toUpperCase():"")),Ye=/\B([A-Z])/g,et=Ke(e=>e.replace(Ye,"-$1").toLowerCase()),tt=Ke(e=>e.charAt(0).toUpperCase()+e.slice(1));function nt(e,t){if(!t)return;if(e(t))return e(t);return t.includes("-")?e(tt(Qe(t))):e(tt(t))||e(et(t))}const rt=Object.assign({},He,Ze),ot=e=>rt[e],at=e=>Ze[e],it=e=>He[e],st=e=>r.a.component(e);function lt(e){return nt(at,e)}function ct(e){return nt(it,e)}function ut(e){return nt(ot,e)}function pt(e){return nt(st,e)}function dt(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!pt(e)&&ut(e)){const t=await ut(e)();r.a.component(e,t.default)}}))}function ft(e,t){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[e]=t)}var ht=n(47),vt=n.n(ht),mt=n(48),gt=n.n(mt),yt={created(){if(this.siteMeta=this.$site.headTags.filter(([e])=>"meta"===e).map(([e,t])=>t),this.$ssrContext){const t=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(e=t)?e.map(e=>{let t="{t+=` ${n}="${gt()(e[n])}"`}),t+">"}).join("\n "):"",this.$ssrContext.canonicalLink=wt(this.$canonicalUrl)}var e},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.getMergedMetaTags();this.currentMetaTags=_t(e,this.currentMetaTags)},getMergedMetaTags(){const e=this.$page.frontmatter.meta||[];return vt()([{name:"description",content:this.$description}],e,this.siteMeta,xt)},updateCanonicalLink(){bt(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",wt(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){_t(null,this.currentMetaTags),bt()}};function bt(){const e=document.querySelector("link[rel='canonical']");e&&e.remove()}function wt(e=""){return e?``:""}function _t(e,t){if(t&&[...t].filter(e=>e.parentNode===document.head).forEach(e=>document.head.removeChild(e)),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(n=>{t.setAttribute(n,e[n])}),document.head.appendChild(t),t})}function xt(e){for(const t of["name","property","itemprop"])if(e.hasOwnProperty(t))return e[t]+t;return JSON.stringify(e)}var Pt=n(13),kt=n.n(Pt),St={mounted(){kt.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,n)=>{e.path===t.path||r.a.component(e.name)||kt.a.start(),n()}),this.$router.afterEach(()=>{kt.a.done(),this.isSidebarOpen=!1})}},Ot=n(49),Ct={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(Ot)()((function(){this.setActiveHash()}),300),setActiveHash(){const e=[].slice.call(document.querySelectorAll(".sidebar-link")),t=[].slice.call(document.querySelectorAll(".header-anchor")).filter(t=>e.some(e=>e.hash===t.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let e=0;e=a.parentElement.offsetTop+10&&(!i||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Et={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let e={};return e[this.options.align]="7.5px",e},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null},copyToClipboard(e){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let e=document.createElement("textarea");document.body.appendChild(e),e.value=this.code,e.select(),document.execCommand("Copy"),e.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let e=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${e.r}, ${e.g}, ${e.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},jt=(n(146),n(4)),$t=Object(jt.a)(Et,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"code-copy"},[t("svg",{class:e.iconClass,style:e.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:e.copyToClipboard}},[t("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),e._v(" "),t("path",{attrs:{fill:e.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),e._v(" "),t("span",{class:e.success?"success":"",style:e.alignStyle},[e._v("\n "+e._s(e.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Tt=(n(147),[yt,St,Ct,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(e=>{if(e.classList.contains("code-copy-added"))return;let t=new(r.a.extend($t));t.options={align:"bottom",color:"#27b1ff",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!1},t.code=e.innerText,t.parent=e,t.$mount(),e.classList.add("code-copy-added"),e.appendChild(t.$el)})},100)}}}]),At={name:"GlobalLayout",computed:{layout(){const e=this.getLayout();return ft("layout",e),r.a.component(e)}},methods:{getLayout(){if(this.$page.path){const e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},Rt=Object(jt.a)(At,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,n){switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],n);break;case"mixins":e[t]||(e[t]=[]),e[t].push(...n);break;default:throw new Error("Unknown option name.")}}(Rt,"mixins",Tt);const Ut=[{name:"v-3ec20de4",path:"/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3ec20de4").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-31596d2d",path:"/about.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-31596d2d").then(n)}},{name:"v-5e94256a",path:"/documentation/0.4/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5e94256a").then(n)}},{path:"/documentation/0.4/index.html",redirect:"/documentation/0.4/"},{name:"v-4155eb1e",path:"/documentation/0.4/developers/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4155eb1e").then(n)}},{path:"/documentation/0.4/developers/index.html",redirect:"/documentation/0.4/developers/"},{name:"v-26232766",path:"/contact.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-26232766").then(n)}},{name:"v-5e0de9fe",path:"/documentation/0.4/developers/api/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5e0de9fe").then(n)}},{path:"/documentation/0.4/developers/api/index.html",redirect:"/documentation/0.4/developers/api/"},{name:"v-418e1b4d",path:"/documentation/0.4/developers/api/errors.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-418e1b4d").then(n)}},{name:"v-63a2d53d",path:"/documentation/0.4/developers/api/reference.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-63a2d53d").then(n)}},{name:"v-6bf62e0d",path:"/documentation/0.4/developers/arch.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6bf62e0d").then(n)}},{name:"v-d80ea866",path:"/documentation/0.4/developers/backends/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-d80ea866").then(n)}},{name:"v-4081eb72",path:"/documentation/0.4/developers/clients/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4081eb72").then(n)}},{name:"v-4899abd1",path:"/documentation/0.4/developers/backends/udfs.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4899abd1").then(n)}},{name:"v-0059cb2a",path:"/documentation/0.4/developers/examples/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-0059cb2a").then(n)}},{path:"/documentation/0.4/developers/examples/index.html",redirect:"/documentation/0.4/developers/examples/"},{name:"v-5e5c94cd",path:"/documentation/0.4/developers/clients/library-guidelines.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5e5c94cd").then(n)}},{name:"v-25dd3de6",path:"/documentation/0.4/developers/examples/poc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-25dd3de6").then(n)}},{name:"v-6993aee6",path:"/documentation/0.4/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6993aee6").then(n)}},{name:"v-3359623e",path:"/documentation/0.4/glossary.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3359623e").then(n)}},{name:"v-37dbaaa0",path:"/documentation/1.0/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-37dbaaa0").then(n)}},{path:"/documentation/1.0/index.html",redirect:"/documentation/1.0/"},{name:"v-6aca4be5",path:"/documentation/0.4/udfs.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6aca4be5").then(n)}},{name:"v-cfac61a6",path:"/documentation/0.4/processes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-cfac61a6").then(n)}},{name:"v-7758ae27",path:"/documentation/1.0/authentication.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-7758ae27").then(n)}},{name:"v-5fd8f1ad",path:"/documentation/1.0/datacubes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-5fd8f1ad").then(n)}},{name:"v-f5de2fb4",path:"/documentation/1.0/datacubes/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-f5de2fb4").then(n)}},{path:"/documentation/1.0/datacubes/index.html",redirect:"/documentation/1.0/datacubes/"},{name:"v-654015de",path:"/documentation/1.0/developers/api/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-654015de").then(n)}},{path:"/documentation/1.0/developers/api/index.html",redirect:"/documentation/1.0/developers/api/"},{name:"v-9f635184",path:"/documentation/1.0/cookbook/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9f635184").then(n)}},{path:"/documentation/1.0/cookbook/index.html",redirect:"/documentation/1.0/cookbook/"},{name:"v-8d587926",path:"/documentation/1.0/developers/api/errors.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-8d587926").then(n)}},{name:"v-dc734f12",path:"/documentation/1.0/developers/api/reference.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-dc734f12").then(n)}},{name:"v-75018026",path:"/documentation/1.0/developers/arch.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-75018026").then(n)}},{name:"v-43de507e",path:"/documentation/1.0/developers/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-43de507e").then(n)}},{path:"/documentation/1.0/developers/index.html",redirect:"/documentation/1.0/developers/"},{name:"v-253cefad",path:"/documentation/1.0/developers/backends/performance.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-253cefad").then(n)}},{name:"v-1772ad2d",path:"/documentation/1.0/developers/backends/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1772ad2d").then(n)}},{name:"v-2840d4fe",path:"/documentation/1.0/developers/backends/xarray.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-2840d4fe").then(n)}},{name:"v-1b45967e",path:"/documentation/1.0/developers/clients/getting-started.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1b45967e").then(n)}},{name:"v-021062ed",path:"/documentation/1.0/developers/clients/library-guidelines.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-021062ed").then(n)}},{name:"v-97aa86e6",path:"/documentation/1.0/developers/profiles/api.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-97aa86e6").then(n)}},{name:"v-e35c5e24",path:"/documentation/1.0/developers/profiles/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-e35c5e24").then(n)}},{path:"/documentation/1.0/developers/profiles/index.html",redirect:"/documentation/1.0/developers/profiles/"},{name:"v-4af2bfca",path:"/documentation/1.0/glossary.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4af2bfca").then(n)}},{name:"v-1a823cb0",path:"/documentation/1.0/javascript/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1a823cb0").then(n)}},{path:"/documentation/1.0/javascript/index.html",redirect:"/documentation/1.0/javascript/"},{name:"v-04d2236d",path:"/documentation/1.0/developers/profiles/processes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-04d2236d").then(n)}},{name:"v-00153acd",path:"/documentation/1.0/processes.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-00153acd").then(n)}},{name:"v-9a2a2626",path:"/documentation/1.0/python/client-side-processing.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9a2a2626").then(n)}},{name:"v-560d08d2",path:"/documentation/1.0/python/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-560d08d2").then(n)}},{path:"/documentation/1.0/python/index.html",redirect:"/documentation/1.0/python/"},{name:"v-ef2073ec",path:"/documentation/1.0/qgis/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-ef2073ec").then(n)}},{path:"/documentation/1.0/qgis/index.html",redirect:"/documentation/1.0/qgis/"},{name:"v-592eaa86",path:"/documentation/1.0/r/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-592eaa86").then(n)}},{path:"/documentation/1.0/r/index.html",redirect:"/documentation/1.0/r/"},{name:"v-ffc79ec2",path:"/documentation/1.0/udfs.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-ffc79ec2").then(n)}},{name:"v-c71b5aa6",path:"/documentation/code-of-conduct.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-c71b5aa6").then(n)}},{name:"v-1005bb66",path:"/documentation/software-guidelines.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1005bb66").then(n)}},{name:"v-186cd6ed",path:"/events/igarrs2021.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-186cd6ed").then(n)}},{name:"v-0ee3f026",path:"/news/2017-12-05-welcome.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-0ee3f026").then(n)}},{name:"v-2997b752",path:"/news/2017-12-18-VITO_meeting.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-2997b752").then(n)}},{name:"v-24966ce6",path:"/news/2018-01-31-WWU_meeting.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-24966ce6").then(n)}},{name:"v-4fe4e126",path:"/news/2018-03-15-poc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-4fe4e126").then(n)}},{name:"v-d2a018a6",path:"/news/2018-10-30-year-one-review-meeting.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-d2a018a6").then(n)}},{name:"v-f9778ae6",path:"/news/2018-05-23-user-requirements-survey-launched.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-f9778ae6").then(n)}},{name:"v-9ddae032",path:"/news/2019-10-07-EO-big-data-hackaton.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9ddae032").then(n)}},{name:"v-45d803ab",path:"/news/2019-03-07-openeo-api-040.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-45d803ab").then(n)}},{name:"v-2fcee9ad",path:"/news/2020-07-31-openeo-api-released.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-2fcee9ad").then(n)}},{name:"v-3f85032d",path:"/news/2020-07-31-lessons-learned.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3f85032d").then(n)}},{name:"v-0e5e57cd",path:"/news/2020-11-30-openeo-api-101-released.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-0e5e57cd").then(n)}},{name:"v-525dec3e",path:"/news/2020-09-02-openeo-user-workshop.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-525dec3e").then(n)}},{name:"v-06e0a8ca",path:"/news/2021-11-08-r-client-on-cran.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-06e0a8ca").then(n)}},{name:"v-6e6b7e2d",path:"/news/2021-05-17-openeo-api-110-released.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-6e6b7e2d").then(n)}},{name:"v-1227575e",path:"/news/2022-04-08-psc-meetings.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-1227575e").then(n)}},{name:"v-59d340ad",path:"/news/2022-05-12-r-client-v120.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-59d340ad").then(n)}},{name:"v-00d62ee6",path:"/news/2022-07-07-monthly-dev-calls.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-00d62ee6").then(n)}},{name:"v-221bfb8d",path:"/news/2022-11-17-r-client-v130.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-221bfb8d").then(n)}},{name:"v-3eeef04a",path:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-3eeef04a").then(n)}},{path:"/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html",redirect:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html"},{path:"/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html",redirect:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html"},{name:"v-d5007282",path:"/news/2024-03-22_mooc_cubeandclouds.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-d5007282").then(n)}},{name:"v-857a96a6",path:"/news/2023-12-06-openeo-submitted-to-ogc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-857a96a6").then(n)}},{name:"v-10d9ffb7",path:"/news/2024-02-06-openeo-ogc-rfc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-10d9ffb7").then(n)}},{name:"v-8850e2c4",path:"/news/",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-8850e2c4").then(n)}},{path:"/news/index.html",redirect:"/news/"},{name:"v-64c18f4d",path:"/psc.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-64c18f4d").then(n)}},{name:"v-9adb302a",path:"/software.html",component:Rt,beforeEnter:(e,t,n)=>{dt("Layout","v-9adb302a").then(n)}},{path:"*",component:Rt}],Mt={title:"openEO",description:"openEO develops an open API to connect various clients to big EO cloud back-ends in a simple and unified way.",base:"/",headTags:[],pages:[{title:"Home",frontmatter:{home:!0},regularPath:"/",relativePath:"README.md",key:"v-3ec20de4",path:"/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"About",frontmatter:{},regularPath:"/about.html",relativePath:"about.md",key:"v-31596d2d",path:"/about.html",headers:[{level:2,title:"openEO?",slug:"openeo"},{level:2,title:"Why an API?",slug:"why-an-api"},{level:2,title:"More information",slug:"more-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Documentation",frontmatter:{},regularPath:"/documentation/0.4/",relativePath:"documentation/0.4/README.md",key:"v-5e94256a",path:"/documentation/0.4/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Introduction",frontmatter:{},regularPath:"/documentation/0.4/developers/",relativePath:"documentation/0.4/developers/README.md",key:"v-4155eb1e",path:"/documentation/0.4/developers/",headers:[{level:2,title:"Additional information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Contact",frontmatter:{sidebar:!1},regularPath:"/contact.html",relativePath:"contact.md",key:"v-26232766",path:"/contact.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{iframe:"https://api.openeo.org/v/0.4.2/"},regularPath:"/documentation/0.4/developers/api/",relativePath:"documentation/0.4/developers/api/README.md",key:"v-5e0de9fe",path:"/documentation/0.4/developers/api/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Status and error handling",frontmatter:{},regularPath:"/documentation/0.4/developers/api/errors.html",relativePath:"documentation/0.4/developers/api/errors.md",key:"v-418e1b4d",path:"/documentation/0.4/developers/api/errors.html",headers:[{level:2,title:"JSON error object",slug:"json-error-object"},{level:2,title:"Standardized status codes",slug:"standardized-status-codes"},{level:2,title:"openEO error codes",slug:"openeo-error-codes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/0.4/developers/api/reference.html",relativePath:"documentation/0.4/developers/api/reference.md",key:"v-63a2d53d",path:"/documentation/0.4/developers/api/reference.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Architecture",frontmatter:{},regularPath:"/documentation/0.4/developers/arch.html",relativePath:"documentation/0.4/developers/arch.md",key:"v-6bf62e0d",path:"/documentation/0.4/developers/arch.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for back-end providers",frontmatter:{},regularPath:"/documentation/0.4/developers/backends/getting-started.html",relativePath:"documentation/0.4/developers/backends/getting-started.md",key:"v-d80ea866",path:"/documentation/0.4/developers/backends/getting-started.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for client developers",frontmatter:{},regularPath:"/documentation/0.4/developers/clients/getting-started.html",relativePath:"documentation/0.4/developers/clients/getting-started.md",key:"v-4081eb72",path:"/documentation/0.4/developers/clients/getting-started.html",headers:[{level:2,title:"Client library developers",slug:"client-library-developers"},{level:2,title:"Applications and Software plugins",slug:"applications-and-software-plugins"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User-defined functions",frontmatter:{},regularPath:"/documentation/0.4/developers/backends/udfs.html",relativePath:"documentation/0.4/developers/backends/udfs.md",key:"v-4899abd1",path:"/documentation/0.4/developers/backends/udfs.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Examples",frontmatter:{},regularPath:"/documentation/0.4/developers/examples/",relativePath:"documentation/0.4/developers/examples/README.md",key:"v-0059cb2a",path:"/documentation/0.4/developers/examples/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Client library development guidelines",frontmatter:{},regularPath:"/documentation/0.4/developers/clients/library-guidelines.html",relativePath:"documentation/0.4/developers/clients/library-guidelines.md",key:"v-5e5c94cd",path:"/documentation/0.4/developers/clients/library-guidelines.html",headers:[{level:2,title:"Conventions",slug:"conventions"},{level:3,title:"Casing",slug:"casing"},{level:3,title:"Scopes",slug:"scopes"},{level:3,title:"Scope categories",slug:"scope-categories"},{level:3,title:"Parameters",slug:"parameters"},{level:2,title:"Method mappings",slug:"method-mappings"},{level:3,title:"Scope: openEO (root category)",slug:"scope-openeo-root-category"},{level:4,title:"Parameters",slug:"parameters-2"},{level:3,title:"Scope: Connection (API category)",slug:"scope-connection-api-category"},{level:4,title:"Parameters",slug:"parameters-3"},{level:3,title:"Scope Capabilities (Content category)",slug:"scope-capabilities-content-category"},{level:4,title:"Parameters",slug:"parameters-4"},{level:3,title:"Scope: File (API category)",slug:"scope-file-api-category"},{level:4,title:"Parameters",slug:"parameters-5"},{level:3,title:"Scope: Job (API category)",slug:"scope-job-api-category"},{level:4,title:"Parameters",slug:"parameters-6"},{level:3,title:"Scope: ProcessGraph (API category)",slug:"scope-processgraph-api-category"},{level:3,title:"Scope: Service (API category)",slug:"scope-service-api-category"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"Workflow example",slug:"workflow-example"},{level:3,title:"R (functional style)",slug:"r-functional-style"},{level:3,title:"Python (mixed style)",slug:"python-mixed-style"},{level:3,title:"Java (object oriented style)",slug:"java-object-oriented-style"},{level:3,title:"PHP (procedural style)",slug:"php-procedural-style"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Examples (proof of concept)",frontmatter:{},regularPath:"/documentation/0.4/developers/examples/poc.html",relativePath:"documentation/0.4/developers/examples/poc.md",key:"v-25dd3de6",path:"/documentation/0.4/developers/examples/poc.html",headers:[{level:2,title:"Use Case 1",slug:"use-case-1"},{level:2,title:"Use Case 2",slug:"use-case-2"},{level:2,title:"Use Case 3",slug:"use-case-3"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for users",frontmatter:{},regularPath:"/documentation/0.4/getting-started.html",relativePath:"documentation/0.4/getting-started.md",key:"v-6993aee6",path:"/documentation/0.4/getting-started.html",headers:[{level:2,title:"Contribute",slug:"contribute"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Glossary",frontmatter:{},regularPath:"/documentation/0.4/glossary.html",relativePath:"documentation/0.4/glossary.md",key:"v-3359623e",path:"/documentation/0.4/glossary.html",headers:[{level:2,title:"General terms",slug:"general-terms"},{level:2,title:"Processes and process graphs",slug:"processes-and-process-graphs"},{level:2,title:"EO data (Collections)",slug:"eo-data-collections"},{level:2,title:"Spatial data cubes",slug:"spatial-data-cubes"},{level:3,title:"apply: processes that do not change dimensions",slug:"apply-processes-that-do-not-change-dimensions"},{level:3,title:"filter: subsetting dimensions by dimension value selection",slug:"filter-subsetting-dimensions-by-dimension-value-selection"},{level:3,title:"reduce: removing dimensions entirely by computation",slug:"reduce-removing-dimensions-entirely-by-computation"},{level:3,title:"aggregate: reducing resolution",slug:"aggregate-reducing-resolution"},{level:3,title:"resample: changing data cube geometry",slug:"resample-changing-data-cube-geometry"},{level:2,title:"User-defined function (UDF)",slug:"user-defined-function-udf"},{level:2,title:"Data Processing modes",slug:"data-processing-modes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Introduction",frontmatter:{},regularPath:"/documentation/1.0/",relativePath:"documentation/1.0/README.md",key:"v-37dbaaa0",path:"/documentation/1.0/",headers:[{level:2,title:"Contribute",slug:"contribute"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User-defined functions",frontmatter:{},regularPath:"/documentation/0.4/udfs.html",relativePath:"documentation/0.4/udfs.md",key:"v-6aca4be5",path:"/documentation/0.4/udfs.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/0.4/processes.html",relativePath:"documentation/0.4/processes.md",key:"v-cfac61a6",path:"/documentation/0.4/processes.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Authentication",frontmatter:{},regularPath:"/documentation/1.0/authentication.html",relativePath:"documentation/1.0/authentication.md",key:"v-7758ae27",path:"/documentation/1.0/authentication.html",headers:[{level:2,title:"HTTP Basic",slug:"http-basic"},{level:2,title:"OpenID Connect",slug:"openid-connect"},{level:3,title:"Authorization Code Flow",slug:"authorization-code-flow"},{level:3,title:"Device Flow",slug:"device-flow"},{level:3,title:"Client Credentials Flow",slug:"client-credentials-flow"},{level:3,title:"Resource Owner Password flow",slug:"resource-owner-password-flow"},{level:3,title:"Refresh Token Flow",slug:"refresh-token-flow"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Datacubes",frontmatter:{},regularPath:"/documentation/1.0/datacubes.html",relativePath:"documentation/1.0/datacubes.md",key:"v-5fd8f1ad",path:"/documentation/1.0/datacubes.html",headers:[{level:2,title:"What are Datacubes?",slug:"what-are-datacubes"},{level:2,title:"Dimensions",slug:"dimensions"},{level:3,title:"Applying Processes on Dimensions",slug:"applying-processes-on-dimensions"},{level:3,title:"Resolution",slug:"resolution"},{level:3,title:"Coordinate Reference System as a Dimension",slug:"coordinate-reference-system-as-a-dimension"},{level:2,title:"Values in a datacube",slug:"values-in-a-datacube"},{level:2,title:"Processes on Datacubes",slug:"processes-on-datacubes"},{level:3,title:"Filter",slug:"filter"},{level:3,title:"Apply",slug:"apply"},{level:3,title:"Resample",slug:"resample"},{level:3,title:"Reduce",slug:"reduce"},{level:3,title:"Aggregate",slug:"aggregate"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Datacube Documentation",frontmatter:{},regularPath:"/documentation/1.0/datacubes/",relativePath:"documentation/1.0/datacubes/README.md",key:"v-f5de2fb4",path:"/documentation/1.0/datacubes/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{},regularPath:"/documentation/1.0/developers/api/",relativePath:"documentation/1.0/developers/api/README.md",key:"v-654015de",path:"/documentation/1.0/developers/api/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Cookbook",frontmatter:{sidebarDepth:3},regularPath:"/documentation/1.0/cookbook/",relativePath:"documentation/1.0/cookbook/README.md",key:"v-9f635184",path:"/documentation/1.0/cookbook/",headers:[{level:2,title:"Chapter 1",slug:"chapter-1"},{level:3,title:"Connecting to a back-end",slug:"connecting-to-a-back-end"},{level:3,title:"Input: load_collection",slug:"input-load-collection"},{level:3,title:"Filter Bands: filter_bands",slug:"filter-bands-filter-bands"},{level:3,title:"Temporal Mean: reduce_dimension",slug:"temporal-mean-reduce-dimension"},{level:3,title:"Scale All Pixels Linearly: apply, linear_scale_range",slug:"scale-all-pixels-linearly-apply-linear-scale-range"},{level:3,title:"Spatial Aggregation: aggregate_spatial",slug:"spatial-aggregation-aggregate-spatial"},{level:3,title:"Output: save_result",slug:"output-save-result"},{level:4,title:"Raster Formats: GTiff, NetCDF",slug:"raster-formats-gtiff-netcdf"},{level:4,title:"Raster Formats: PNG",slug:"raster-formats-png"},{level:4,title:"Text Formats: JSON, CSV",slug:"text-formats-json-csv"},{level:3,title:"Output: Process as JSON",slug:"output-process-as-json"},{level:2,title:"Chapter 2",slug:"chapter-2"},{level:3,title:"Bandmath",slug:"bandmath"},{level:4,title:"Example 1: NDVI",slug:"example-1-ndvi"},{level:4,title:"Example 2: EVI",slug:"example-2-evi"},{level:3,title:"Masks: mask",slug:"masks-mask"},{level:4,title:"Mask Out Specific Values",slug:"mask-out-specific-values"},{level:4,title:"Thresholds",slug:"thresholds"},{level:3,title:"Pixel Operations: apply",slug:"pixel-operations-apply"},{level:3,title:"Image Kernels: apply_kernel",slug:"image-kernels-apply-kernel"},{level:2,title:"Endnote",slug:"endnote"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO error codes",frontmatter:{},regularPath:"/documentation/1.0/developers/api/errors.html",relativePath:"documentation/1.0/developers/api/errors.md",key:"v-8d587926",path:"/documentation/1.0/developers/api/errors.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/1.0/developers/api/reference.html",relativePath:"documentation/1.0/developers/api/reference.md",key:"v-dc734f12",path:"/documentation/1.0/developers/api/reference.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Architecture",frontmatter:{},regularPath:"/documentation/1.0/developers/arch.html",relativePath:"documentation/1.0/developers/arch.md",key:"v-75018026",path:"/documentation/1.0/developers/arch.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Introduction",frontmatter:{},regularPath:"/documentation/1.0/developers/",relativePath:"documentation/1.0/developers/README.md",key:"v-43de507e",path:"/documentation/1.0/developers/",headers:[{level:2,title:"Additional information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Performance guide for openEO backends",frontmatter:{},regularPath:"/documentation/1.0/developers/backends/performance.html",relativePath:"documentation/1.0/developers/backends/performance.md",key:"v-253cefad",path:"/documentation/1.0/developers/backends/performance.html",headers:[{level:2,title:"openEO API vision on performance & scalability",slug:"openeo-api-vision-on-performance-scalability"},{level:3,title:"Bringing the processing to the data",slug:"bringing-the-processing-to-the-data"},{level:3,title:"Datacube processing",slug:"datacube-processing"},{level:2,title:"Process graph execution",slug:"process-graph-execution"},{level:2,title:"Performance FAQ",slug:"performance-faq"},{level:3,title:"I have a highly optimized workflow, can openEO expose it?",slug:"i-have-a-highly-optimized-workflow-can-openeo-expose-it"},{level:3,title:"Can openEO be as fast as a hand-written workflow?",slug:"can-openeo-be-as-fast-as-a-hand-written-workflow"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for service (back-end) providers",frontmatter:{},regularPath:"/documentation/1.0/developers/backends/getting-started.html",relativePath:"documentation/1.0/developers/backends/getting-started.md",key:"v-1772ad2d",path:"/documentation/1.0/developers/backends/getting-started.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started with openEO and Xarray and Dask",frontmatter:{},regularPath:"/documentation/1.0/developers/backends/xarray.html",relativePath:"documentation/1.0/developers/backends/xarray.md",key:"v-2840d4fe",path:"/documentation/1.0/developers/backends/xarray.html",headers:[{level:2,title:"Process Graph Parser for Python",slug:"process-graph-parser-for-python"},{level:2,title:"Python Processes for openEO",slug:"python-processes-for-openeo"},{level:2,title:"The loadcollection and saveresult process",slug:"the-load-collection-and-save-result-process"},{level:3,title:"Connection to ODC and STAC",slug:"connection-to-odc-and-stac"},{level:2,title:"openEO Client Side Processing",slug:"openeo-client-side-processing"},{level:2,title:"Adding a new process",slug:"adding-a-new-process"},{level:3,title:"Add the process spec",slug:"add-the-process-spec"},{level:3,title:"Add the process implementation",slug:"add-the-process-implementation"},{level:2,title:"HTTP REST Interface",slug:"http-rest-interface"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Getting started for client developers",frontmatter:{},regularPath:"/documentation/1.0/developers/clients/getting-started.html",relativePath:"documentation/1.0/developers/clients/getting-started.md",key:"v-1b45967e",path:"/documentation/1.0/developers/clients/getting-started.html",headers:[{level:2,title:"Client library developers",slug:"client-library-developers"},{level:2,title:"Applications and Software plugins",slug:"applications-and-software-plugins"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Client library development guidelines",frontmatter:{},regularPath:"/documentation/1.0/developers/clients/library-guidelines.html",relativePath:"documentation/1.0/developers/clients/library-guidelines.md",key:"v-021062ed",path:"/documentation/1.0/developers/clients/library-guidelines.html",headers:[{level:2,title:"Conventions",slug:"conventions"},{level:3,title:"Casing",slug:"casing"},{level:3,title:"Scopes",slug:"scopes"},{level:3,title:"Scope categories",slug:"scope-categories"},{level:3,title:"Parameters",slug:"parameters"},{level:2,title:"Method mappings",slug:"method-mappings"},{level:3,title:"Scope: openEO (root category)",slug:"scope-openeo-root-category"},{level:4,title:"Parameters",slug:"parameters-2"},{level:3,title:"Scope: Connection (API category)",slug:"scope-connection-api-category"},{level:4,title:"Parameters",slug:"parameters-3"},{level:3,title:"Scope Capabilities (Content category)",slug:"scope-capabilities-content-category"},{level:4,title:"Parameters",slug:"parameters-4"},{level:3,title:"Scope: File (API category)",slug:"scope-file-api-category"},{level:4,title:"Parameters",slug:"parameters-5"},{level:3,title:"Scope: Job (API category)",slug:"scope-job-api-category"},{level:4,title:"Parameters",slug:"parameters-6"},{level:3,title:"Scope: UserProcess (API category)",slug:"scope-userprocess-api-category"},{level:3,title:"Scope: Service (API category)",slug:"scope-service-api-category"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"Workflow example",slug:"workflow-example"},{level:3,title:"R (functional style)",slug:"r-functional-style"},{level:3,title:"Python (mixed style)",slug:"python-mixed-style"},{level:3,title:"Java (object oriented style)",slug:"java-object-oriented-style"},{level:3,title:"PHP (procedural style)",slug:"php-procedural-style"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"API Profiles",frontmatter:{},regularPath:"/documentation/1.0/developers/profiles/api.html",relativePath:"documentation/1.0/developers/profiles/api.md",key:"v-97aa86e6",path:"/documentation/1.0/developers/profiles/api.html",headers:[{level:2,title:"Requirements per Profile",slug:"requirements-per-profile"},{level:3,title:"L1: Minimal",slug:"l1-minimal"},{level:4,title:"API fundamentals",slug:"api-fundamentals"},{level:4,title:"Well-known Discovery",slug:"well-known-discovery"},{level:4,title:"Capabilities",slug:"capabilities"},{level:4,title:"File Formats",slug:"file-formats"},{level:4,title:"Authentication",slug:"authentication"},{level:4,title:"Pre-defined Processes",slug:"pre-defined-processes"},{level:4,title:"Collections",slug:"collections"},{level:4,title:"Data Processing",slug:"data-processing"},{level:3,title:"L1A: Minimal - Synchronous Processing",slug:"l1a-minimal-synchronous-processing"},{level:4,title:"Synchronous Processing",slug:"synchronous-processing"},{level:3,title:"L1B: Minimal - Batch Jobs",slug:"l1b-minimal-batch-jobs"},{level:4,title:"Batch Jobs",slug:"batch-jobs"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results"},{level:3,title:"L1C: Minimal - Secondary Web Services",slug:"l1c-minimal-secondary-web-services"},{level:4,title:"Secondary Web Service Discovery",slug:"secondary-web-service-discovery"},{level:4,title:"Secondary Web Services",slug:"secondary-web-services"},{level:3,title:"L2: Recommended",slug:"l2-recommended"},{level:4,title:"API fundamentals",slug:"api-fundamentals-2"},{level:4,title:"Well-known Discovery",slug:"well-known-discovery-2"},{level:4,title:"Capabilities",slug:"capabilities-2"},{level:4,title:"File Formats",slug:"file-formats-2"},{level:4,title:"Authentication",slug:"authentication-2"},{level:4,title:"User Account",slug:"user-account"},{level:4,title:"Pre-defined Processes",slug:"pre-defined-processes-2"},{level:4,title:"Collections",slug:"collections-2"},{level:4,title:"User-defined processes",slug:"user-defined-processes"},{level:4,title:"Data Processing",slug:"data-processing-2"},{level:4,title:"Batch Jobs",slug:"batch-jobs-2"},{level:4,title:"Batch Jobs > Logs",slug:"batch-jobs-logs"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results-2"},{level:4,title:"Synchronous Processing",slug:"synchronous-processing-2"},{level:3,title:"L3: Advanced",slug:"l3-advanced"},{level:4,title:"API fundamentals",slug:"api-fundamentals-3"},{level:4,title:"Well-known Discovery",slug:"well-known-discovery-3"},{level:4,title:"Conformance Classes",slug:"conformance-classes"},{level:4,title:"Authentication",slug:"authentication-3"},{level:4,title:"Pre-defined Processes",slug:"pre-defined-processes-3"},{level:4,title:"Collections",slug:"collections-3"},{level:4,title:"User-defined processes",slug:"user-defined-processes-2"},{level:4,title:"Validation",slug:"validation"},{level:4,title:"Batch Jobs",slug:"batch-jobs-3"},{level:4,title:"Batch Jobs > Logs",slug:"batch-jobs-logs-2"},{level:4,title:"Batch Jobs > Estimates",slug:"batch-jobs-estimates"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results-3"},{level:4,title:"Synchronous Processing",slug:"synchronous-processing-3"},{level:3,title:"L3-UDF: UDF",slug:"l3-udf-udf"},{level:4,title:"UDF Runtimes",slug:"udf-runtimes"},{level:3,title:"L3-FS: File Storage",slug:"l3-fs-file-storage"},{level:4,title:"File Storage",slug:"file-storage"},{level:3,title:"L3-SWS: Secondary Web Services",slug:"l3-sws-secondary-web-services"},{level:4,title:"Secondary Web Service Discovery",slug:"secondary-web-service-discovery-2"},{level:4,title:"Secondary Web Services",slug:"secondary-web-services-2"},{level:3,title:"L4: Above and Beyond",slug:"l4-above-and-beyond"},{level:4,title:"Secondary Web Services",slug:"secondary-web-services-3"},{level:4,title:"Secondary Web Services > Logs",slug:"secondary-web-services-logs"},{level:4,title:"Batch Jobs",slug:"batch-jobs-4"},{level:4,title:"Batch Jobs > Estimates",slug:"batch-jobs-estimates-2"},{level:4,title:"Batch Jobs > Results",slug:"batch-jobs-results-4"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Profiles",frontmatter:{},regularPath:"/documentation/1.0/developers/profiles/",relativePath:"documentation/1.0/developers/profiles/README.md",key:"v-e35c5e24",path:"/documentation/1.0/developers/profiles/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Glossary",frontmatter:{},regularPath:"/documentation/1.0/glossary.html",relativePath:"documentation/1.0/glossary.md",key:"v-4af2bfca",path:"/documentation/1.0/glossary.html",headers:[{level:2,title:"General terms",slug:"general-terms"},{level:2,title:"Processes",slug:"processes"},{level:2,title:"EO data (Collections)",slug:"eo-data-collections"},{level:2,title:"Spatial datacubes",slug:"spatial-datacubes"},{level:2,title:"Vector data",slug:"vector-data"},{level:2,title:"User-defined function (UDF)",slug:"user-defined-function-udf"},{level:2,title:"Data Processing modes",slug:"data-processing-modes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"JavaScript Client",frontmatter:{},regularPath:"/documentation/1.0/javascript/",relativePath:"documentation/1.0/javascript/index.md",key:"v-1a823cb0",path:"/documentation/1.0/javascript/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Exploring a back-end",slug:"exploring-a-back-end"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:3,title:"Basic Authentication",slug:"basic-authentication"},{level:3,title:"OpenID Connect Authentication",slug:"openid-connect-authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"},{level:2,title:"Full Example",slug:"full-example"},{level:2,title:"User Defined Functions",slug:"user-defined-functions"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Process Profiles",frontmatter:{},regularPath:"/documentation/1.0/developers/profiles/processes.html",relativePath:"documentation/1.0/developers/profiles/processes.md",key:"v-04d2236d",path:"/documentation/1.0/developers/profiles/processes.html",headers:[{level:2,title:"Requirements per Profile",slug:"requirements-per-profile"},{level:3,title:"L1: Minimal",slug:"l1-minimal"},{level:3,title:"L2: Recommended",slug:"l2-recommended"},{level:3,title:"L2A: Recommended Raster",slug:"l2a-recommended-raster"},{level:3,title:"L2B: Recommended Vector",slug:"l2b-recommended-vector"},{level:3,title:"L2-Date: Date & Time manipulation",slug:"l2-date-date-time-manipulation"},{level:3,title:"L2-Text: Text manipulation",slug:"l2-text-text-manipulation"},{level:3,title:"L3: Advanced",slug:"l3-advanced"},{level:3,title:"L3-ML: Machine Learning",slug:"l3-ml-machine-learning"},{level:3,title:"L3-UDF: User-Defined Functions",slug:"l3-udf-user-defined-functions"},{level:3,title:"L3-Clim: Cimatology",slug:"l3-clim-cimatology"},{level:3,title:"L3-ARD: Analysis-Ready Data",slug:"l3-ard-analysis-ready-data"},{level:3,title:"L4: Above and Beyond",slug:"l4-above-and-beyond"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{frontmatter:{fullpage:!0,stripCSS:!0},regularPath:"/documentation/1.0/processes.html",relativePath:"documentation/1.0/processes.md",key:"v-00153acd",path:"/documentation/1.0/processes.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Get started with the openEO Python Client Client Side Processing",frontmatter:{},regularPath:"/documentation/1.0/python/client-side-processing.html",relativePath:"documentation/1.0/python/client-side-processing.md",key:"v-9a2a2626",path:"/documentation/1.0/python/client-side-processing.html",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Usage",slug:"usage"},{level:3,title:"STAC Collections and Items",slug:"stac-collections-and-items"},{level:3,title:"Local Collections",slug:"local-collections"},{level:3,title:"Local Processing",slug:"local-processing"},{level:2,title:"Client-Side Processing Example Notebooks",slug:"client-side-processing-example-notebooks"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Python Client",frontmatter:{},regularPath:"/documentation/1.0/python/",relativePath:"documentation/1.0/python/index.md",key:"v-560d08d2",path:"/documentation/1.0/python/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Exploring a back-end",slug:"exploring-a-back-end"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:3,title:"Basic Authentication",slug:"basic-authentication"},{level:3,title:"OpenID Connect Authentication",slug:"openid-connect-authentication"},{level:2,title:"Working with Datacube",slug:"working-with-datacube"},{level:3,title:"Creating a Datacube",slug:"creating-a-datacube"},{level:3,title:"Applying processes",slug:"applying-processes"},{level:3,title:"Defining output format",slug:"defining-output-format"},{level:2,title:"Execution",slug:"execution"},{level:3,title:"Batch job execution",slug:"batch-job-execution"},{level:2,title:"Full Example",slug:"full-example"},{level:2,title:"User Defined Functions",slug:"user-defined-functions"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"QGIS Plugin",frontmatter:{},regularPath:"/documentation/1.0/qgis/",relativePath:"documentation/1.0/qgis/index.md",key:"v-ef2073ec",path:"/documentation/1.0/qgis/",headers:[{level:2,title:"Installation",slug:"installation"},{level:2,title:"Connecting",slug:"connecting"},{level:2,title:"Exploring a backend",slug:"exploring-a-backend"},{level:2,title:"Job Management",slug:"job-management"},{level:3,title:"Creating new Jobs",slug:"creating-new-jobs"},{level:3,title:"Adapting existing Jobs",slug:"adapting-existing-jobs"},{level:4,title:"Process Argument Helper",slug:"process-argument-helper"},{level:2,title:"Service Management",slug:"service-management"},{level:2,title:"Additional Information",slug:"additional-information"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client",frontmatter:{},regularPath:"/documentation/1.0/r/",relativePath:"documentation/1.0/r/index.md",key:"v-592eaa86",path:"/documentation/1.0/r/",headers:[{level:2,title:"Useful links",slug:"useful-links"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Exploring a back-end",slug:"exploring-a-back-end"},{level:3,title:"Collections",slug:"collections"},{level:3,title:"Processes",slug:"processes"},{level:2,title:"Authentication",slug:"authentication"},{level:3,title:"Basic Authentication",slug:"basic-authentication"},{level:3,title:"OpenID Connect Authentication",slug:"openid-connect-authentication"},{level:2,title:"Creating a (user-defined) process",slug:"creating-a-user-defined-process"},{level:2,title:"Batch Job Management",slug:"batch-job-management"},{level:2,title:"Full Example",slug:"full-example"},{level:2,title:"User Defined Functions",slug:"user-defined-functions"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User-defined functions",frontmatter:{},regularPath:"/documentation/1.0/udfs.html",relativePath:"documentation/1.0/udfs.md",key:"v-ffc79ec2",path:"/documentation/1.0/udfs.html",headers:[{level:2,title:"Users",slug:"users"},{level:3,title:"JavaScript",slug:"javascript"},{level:3,title:"Python",slug:"python"},{level:3,title:"QGIS",slug:"qgis"},{level:3,title:"R",slug:"r"},{level:3,title:"Web Editor",slug:"web-editor"},{level:2,title:"Back-ends",slug:"back-ends"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Contributor Code of Conduct",frontmatter:{},regularPath:"/documentation/code-of-conduct.html",relativePath:"documentation/code-of-conduct.md",key:"v-c71b5aa6",path:"/documentation/code-of-conduct.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Software Development Guidelines",frontmatter:{},regularPath:"/documentation/software-guidelines.html",relativePath:"documentation/software-guidelines.md",key:"v-1005bb66",path:"/documentation/software-guidelines.html",headers:[{level:2,title:"Software quality guidelines",slug:"software-quality-guidelines"},{level:2,title:"Software documentation guidelines",slug:"software-documentation-guidelines"},{level:2,title:"Software review",slug:"software-review"},{level:2,title:"Test-driven development",slug:"test-driven-development"},{level:2,title:"Continuous integration",slug:"continuous-integration"},{level:2,title:"Additional guidelines",slug:"additional-guidelines"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"IEEE IGARRS 2021 HD-3: Hands-on openEO: access cloud platforms using your preferred programming language",frontmatter:{},regularPath:"/events/igarrs2021.html",relativePath:"events/igarrs2021.md",key:"v-186cd6ed",path:"/events/igarrs2021.html",headers:[{level:2,title:"Agenda",slug:"agenda"},{level:2,title:"Python client",slug:"python-client"},{level:3,title:"Logging in",slug:"logging-in"},{level:3,title:"openEO in Python intro",slug:"openeo-in-python-intro"},{level:2,title:"R client",slug:"r-client"},{level:2,title:"openEO user interfaces",slug:"openeo-user-interfaces"},{level:2,title:"Use cases",slug:"use-cases"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Welcome to openEO!",frontmatter:{news:!0,title:"Welcome to openEO!",date:"2017-12-05T00:00:00.000Z",author:"Edzer Pebesma"},regularPath:"/news/2017-12-05-welcome.html",relativePath:"news/2017-12-05-welcome.md",key:"v-0ee3f026",path:"/news/2017-12-05-welcome.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"First week of intensive collaboration: Dec 4-6, 2017",frontmatter:{news:!0,title:"First week of intensive collaboration: Dec 4-6, 2017",date:"2017-12-18T00:00:00.000Z",author:"Edzer Pebesma"},regularPath:"/news/2017-12-18-VITO_meeting.html",relativePath:"news/2017-12-18-VITO_meeting.md",key:"v-2997b752",path:"/news/2017-12-18-VITO_meeting.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Second week of intensive collaboration: Jan 22-24, 2018",frontmatter:{news:!0,title:"Second week of intensive collaboration: Jan 22-24, 2018",date:"2018-01-31T00:00:00.000Z",author:"Marius Appel"},regularPath:"/news/2018-01-31-WWU_meeting.html",relativePath:"news/2018-01-31-WWU_meeting.md",key:"v-24966ce6",path:"/news/2018-01-31-WWU_meeting.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO proves its concept",frontmatter:{news:!0,title:"openEO proves its concept",date:"2018-03-17T00:00:00.000Z",author:"Edzer Pebesma, the openEO consortium"},regularPath:"/news/2018-03-15-poc.html",relativePath:"news/2018-03-15-poc.md",key:"v-4fe4e126",path:"/news/2018-03-15-poc.html",headers:[{level:2,title:"The problem",slug:"the-problem"},{level:2,title:"Why an API?",slug:"why-an-api"},{level:2,title:"First results",slug:"first-results"},{level:2,title:"The three use cases",slug:"the-three-use-cases"},{level:2,title:"Links to the client and back-end implementations",slug:"links-to-the-client-and-back-end-implementations"},{level:2,title:"Proof-of-concept videos",slug:"proof-of-concept-videos"},{level:3,title:"R client and WCPS back-end, use case 1",slug:"r-client-and-wcps-back-end-use-case-1"},{level:3,title:"Grass GIS back-end, use cases 1, 2 and 3",slug:"grass-gis-back-end-use-cases-1-2-and-3"},{level:3,title:"R client and R back-end, use-case 1",slug:"r-client-and-r-back-end-use-case-1"},{level:3,title:"R client and R back-end, use case 3",slug:"r-client-and-r-back-end-use-case-3"},{level:3,title:"openEO Web Editor (JS client) with three back-ends (use case 1)",slug:"openeo-web-editor-js-client-with-three-back-ends-use-case-1"},{level:3,title:"openEO Web Editor (JS client) with R back-end (use case 3)",slug:"openeo-web-editor-js-client-with-r-back-end-use-case-3"},{level:3,title:"Python client with GeoPySpark back-end (use case 1)",slug:"python-client-with-geopyspark-back-end-use-case-1"},{level:3,title:"openEO Web Editor (JS client) with Google Earth Engine back-end (use case 1)",slug:"openeo-web-editor-js-client-with-google-earth-engine-back-end-use-case-1"},{level:2,title:"Links to documents",slug:"links-to-documents"},{level:2,title:"Next steps",slug:"next-steps"},{level:2,title:"Getting involved",slug:"getting-involved"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO year one review meeting",frontmatter:{news:!0,title:"openEO year one review meeting",date:"2018-10-30T00:00:00.000Z",author:"Matthias Schramm"},regularPath:"/news/2018-10-30-year-one-review-meeting.html",relativePath:"news/2018-10-30-year-one-review-meeting.md",key:"v-d2a018a6",path:"/news/2018-10-30-year-one-review-meeting.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"User Requirements Survey for openEO launched",frontmatter:{news:!0,title:"User Requirements Survey for openEO launched",date:"2018-05-23T00:00:00.000Z",author:"Sarah Carter"},regularPath:"/news/2018-05-23-user-requirements-survey-launched.html",relativePath:"news/2018-05-23-user-requirements-survey-launched.md",key:"v-f9778ae6",path:"/news/2018-05-23-user-requirements-survey-launched.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"H2020 EO Big Data Hackathon Nov 7-8",frontmatter:{news:!0,title:"H2020 EO Big Data Hackathon Nov 7-8",date:"2019-10-07T00:00:00.000Z",author:"Edzer Pebesma"},regularPath:"/news/2019-10-07-EO-big-data-hackaton.html",relativePath:"news/2019-10-07-EO-big-data-hackaton.md",key:"v-9ddae032",path:"/news/2019-10-07-EO-big-data-hackaton.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO API v0.4.0 released",frontmatter:{news:!0,title:"openEO API v0.4.0 released",date:"2019-03-07T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2019-03-07-openeo-api-040.html",relativePath:"news/2019-03-07-openeo-api-040.md",key:"v-45d803ab",path:"/news/2019-03-07-openeo-api-040.html",headers:[{level:2,title:"New process catalogue and process graph changes",slug:"new-process-catalogue-and-process-graph-changes"},{level:2,title:"Other improvements",slug:"other-improvements"},{level:2,title:"Next steps",slug:"next-steps"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Stable release of the openEO API and Processes (v1.0.0)",frontmatter:{news:!0,title:"Stable release of the openEO API and Processes (v1.0.0)",date:"2020-07-31T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2020-07-31-openeo-api-released.html",relativePath:"news/2020-07-31-openeo-api-released.md",key:"v-2fcee9ad",path:"/news/2020-07-31-openeo-api-released.html",headers:[{level:2,title:"Processes",slug:"processes"},{level:2,title:"STAC and OGC APIs",slug:"stac-and-ogc-apis"},{level:2,title:"User-defined Functions (UDFs)",slug:"user-defined-functions-udfs"},{level:2,title:"Other improvements",slug:"other-improvements"},{level:2,title:"Limitations",slug:"limitations"},{level:2,title:"Next steps",slug:"next-steps"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Lessons learned while developing the openEO API",frontmatter:{news:!0,title:"Lessons learned while developing the openEO API",date:"2020-07-31T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2020-07-31-lessons-learned.html",relativePath:"news/2020-07-31-lessons-learned.md",key:"v-3f85032d",path:"/news/2020-07-31-lessons-learned.html",headers:[{level:2,title:"1. Collection Names",slug:"_1-collection-names"},{level:2,title:"2. Other Names",slug:"_2-other-names"},{level:2,title:"3. Chunked Collections",slug:"_3-chunked-collections"},{level:2,title:"4. What to specify?",slug:"_4-what-to-specify"},{level:3,title:"File Formats",slug:"file-formats"},{level:2,title:"5. Authentication",slug:"_5-authentication"},{level:2,title:"6. Debugging Experience",slug:"_6-debugging-experience"},{level:2,title:"7. Defining interoperable Processes",slug:"_7-defining-interoperable-processes"},{level:2,title:"Conclusion",slug:"conclusion"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO API v1.0.1 released",frontmatter:{news:!0,title:"openEO API v1.0.1 released",date:"2020-11-30T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2020-11-30-openeo-api-101-released.html",relativePath:"news/2020-11-30-openeo-api-101-released.md",key:"v-0e5e57cd",path:"/news/2020-11-30-openeo-api-101-released.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Virtual User Workshop",frontmatter:{news:!0,title:"openEO Virtual User Workshop",date:"2020-09-02T00:00:00.000Z",author:"Matthias Schramm"},regularPath:"/news/2020-09-02-openeo-user-workshop.html",relativePath:"news/2020-09-02-openeo-user-workshop.md",key:"v-525dec3e",path:"/news/2020-09-02-openeo-user-workshop.html",headers:[{level:3,title:"UPDATE:",slug:"update"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client on CRAN",frontmatter:{news:!0,title:"R Client on CRAN",date:"2021-11-08T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2021-11-08-r-client-on-cran.html",relativePath:"news/2021-11-08-r-client-on-cran.md",key:"v-06e0a8ca",path:"/news/2021-11-08-r-client-on-cran.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO API v1.1.0 released",frontmatter:{news:!0,title:"openEO API v1.1.0 released",date:"2021-05-17T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2021-05-17-openeo-api-110-released.html",relativePath:"news/2021-05-17-openeo-api-110-released.md",key:"v-6e6b7e2d",path:"/news/2021-05-17-openeo-api-110-released.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO PSC meetings",frontmatter:{news:!0,title:"openEO PSC meetings",date:"2022-04-08T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2022-04-08-psc-meetings.html",relativePath:"news/2022-04-08-psc-meetings.md",key:"v-1227575e",path:"/news/2022-04-08-psc-meetings.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client v1.2.0 has been released",frontmatter:{news:!0,title:"R Client v1.2.0 has been released",date:"2022-05-12T00:00:00.000Z",author:"Matthias Mohr, Florian Lahn"},regularPath:"/news/2022-05-12-r-client-v120.html",relativePath:"news/2022-05-12-r-client-v120.md",key:"v-59d340ad",path:"/news/2022-05-12-r-client-v120.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Monthly openEO community meeting",frontmatter:{news:!0,title:"Monthly openEO community meeting",date:"2022-07-07T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2022-07-07-monthly-dev-calls.html",relativePath:"news/2022-07-07-monthly-dev-calls.md",key:"v-00d62ee6",path:"/news/2022-07-07-monthly-dev-calls.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"R Client v1.3.0 has been released",frontmatter:{news:!0,title:"R Client v1.3.0 has been released",date:"2022-11-17T00:00:00.000Z",author:"Matthias Mohr, Peter J. Zellner, Florian Lahn"},regularPath:"/news/2022-11-17-r-client-v130.html",relativePath:"news/2022-11-17-r-client-v130.md",key:"v-221bfb8d",path:"/news/2022-11-17-r-client-v130.html",headers:[{level:2,title:"Better support for sf",slug:"better-support-for-sf"},{level:2,title:"New Vignettes",slug:"new-vignettes"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"New releases for openEO API and openEO Processes, focus on vector data",frontmatter:{news:!0,title:"New releases for openEO API and openEO Processes, focus on vector data",date:"2023-05-25T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html",relativePath:"news/2023-05-25-new-openeo-versions-120-200rc1 copy.md",key:"v-3eeef04a",path:"/news/2023-05-25-new-openeo-versions-120-200rc1%20copy.html",headers:[{level:2,title:"openEO API v1.2.0",slug:"openeo-api-v1-2-0"},{level:2,title:"openEO Processes v2.0.0-rc.1",slug:"openeo-processes-v2-0-0-rc-1"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"MOOC Cubes and Clouds - open for registration",frontmatter:{news:!0,title:"MOOC Cubes and Clouds - open for registration",date:"2024-03-22T00:00:00.000Z",author:"Peter Zellner"},regularPath:"/news/2024-03-22_mooc_cubeandclouds.html",relativePath:"news/2024-03-22_mooc_cubeandclouds.md",key:"v-d5007282",path:"/news/2024-03-22_mooc_cubeandclouds.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO submitted to OGC for consideration as an OGC community standard",frontmatter:{news:!0,title:"openEO submitted to OGC for consideration as an OGC community standard",date:"2023-12-06T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2023-12-06-openeo-submitted-to-ogc.html",relativePath:"news/2023-12-06-openeo-submitted-to-ogc.md",key:"v-857a96a6",path:"/news/2023-12-06-openeo-submitted-to-ogc.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"OGC seeks public comment on the adoption of openEO as a Community Standard",frontmatter:{news:!0,title:"OGC seeks public comment on the adoption of openEO as a Community Standard",date:"2024-02-06T00:00:00.000Z",author:"Matthias Mohr"},regularPath:"/news/2024-02-06-openeo-ogc-rfc.html",relativePath:"news/2024-02-06-openeo-ogc-rfc.md",key:"v-10d9ffb7",path:"/news/2024-02-06-openeo-ogc-rfc.html",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"News",frontmatter:{sidebar:!1},regularPath:"/news/",relativePath:"news/README.md",key:"v-8850e2c4",path:"/news/",lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"openEO Project Steering Committee",frontmatter:{},regularPath:"/psc.html",relativePath:"psc.md",key:"v-64c18f4d",path:"/psc.html",headers:[{level:2,title:"Members",slug:"members"},{level:2,title:"Detailed Process",slug:"detailed-process"},{level:3,title:"When is Vote Required?",slug:"when-is-vote-required"},{level:3,title:"Final remarks",slug:"final-remarks"},{level:2,title:"Committee Membership",slug:"committee-membership"},{level:3,title:"Adding Members",slug:"adding-members"},{level:3,title:"Stepping Down",slug:"stepping-down"},{level:2,title:"History",slug:"history"}],codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}},{title:"Software",frontmatter:{},regularPath:"/software.html",relativePath:"software.md",key:"v-9adb302a",path:"/software.html",headers:[{level:2,title:"Clients",slug:"clients"},{level:2,title:"Back-ends",slug:"back-ends"},{level:2,title:"Specification",slug:"specification"},{level:2,title:"Ecosystem",slug:"ecosystem"}],lastUpdated:"7/26/2024, 6:48:28 PM",lastUpdatedTimestamp:1722019708e3,codeSwitcherOptions:{groups:{default:{py:"Python",r:"R",js:"JavaScript"}}}}],themeConfig:{apiVersion:"1.2.0",versions:[{folder:"1.0",path:"/documentation/1.0/",title:"1.x",apiTag:"1.2.0",processesTag:"2.0.0-rc.1",apiVersions:["1.0.0","1.0.1","1.1.0","1.2.0"],userNav:[{text:"Introduction",link:"index.html"},{text:"Glossary",link:"glossary.html"},{text:"Datacubes",link:"datacubes.html"},{text:"Getting Started",items:[{text:"JavaScript",link:"javascript/index.html"},{text:"Python",link:"python/index.html"},{text:"QGIS",link:"qgis/index.html"},{text:"R",link:"r/index.html"},{text:"Client-Side Processing (Python)",link:"python/client-side-processing.html"}]},{text:"Processes",link:"processes.html"},{text:"Cookbook",link:"cookbook/index.html"},{text:"Authentication",link:"authentication.html"},{text:"UDFs",link:"udfs.html"}],devNav:[{text:"Introduction",link:"developers/index.html"},{text:"Glossary",link:"glossary.html"},{text:"Architecture",link:"developers/arch.html"},{text:"Service Providers",items:[{text:"Getting Started",link:"developers/backends/getting-started.html"},{text:"Performance Guide",link:"developers/backends/performance.html"},{text:"Xarray / Dask Guide",link:"developers/backends/xarray.html"},{text:"Profiles",link:"developers/profiles/index.html"}]},{text:"Client Developers",items:[{text:"Getting Started",link:"developers/clients/getting-started.html"},{text:"Library Guidelines",link:"developers/clients/library-guidelines.html"}]},{text:"API",items:[{text:"Reference",link:"developers/api/reference.html"},{text:"Profiles",link:"developers/profiles/api.html"}]},{text:"Processes",items:[{text:"Reference",link:"processes.html"},{text:"Profiles",link:"developers/profiles/processes.html"}]},{text:"Error Codes",link:"developers/api/errors.html"},{text:"Authentication",link:"authentication.html"},{text:"UDFs",link:"udfs.html"}]},{folder:"0.4",path:"/documentation/0.4/",title:"0.4",apiTag:"0.4.2",apiFormat:"json",processesTag:"0.4.2",apiVersions:["0.4.0","0.4.1","0.4.2"],userNav:[{text:"Getting Started",link:"getting-started.html"},{text:"Glossary",link:"glossary.html"},{text:"Processes",link:"processes.html"},{text:"UDFs",link:"udfs.html"}],devNav:[{text:"Introduction",link:"developers/index.html"},{text:"Glossary",link:"glossary.html"},{text:"Architecture",link:"developers/arch.html"},{text:"Service Providers",items:[{text:"Getting Started",link:"developers/backends/getting-started.html"},{text:"UDFs",link:"developers/backends/udfs.html"}]},{text:"Client Developers",items:[{text:"Getting Started",link:"developers/clients/getting-started.html"},{text:"Library Guidelines",link:"developers/clients/library-guidelines.html"}]},{text:"API",items:[{text:"Specification",link:"developers/api/reference.html"},{text:"Further documentation",link:"developers/api/index.html"}]},{text:"Processes",link:"processes.html"},{text:"Error Codes",link:"developers/api/errors.html"},{text:"Examples",link:"developers/examples/"}]}],defaultVersion:0,docPath:"/documentation/1.0/",logo:"/images/openeo_navbar_logo.png",editLinks:!0,docsRepo:"Open-EO/openeo.org",algolia:{appId:"3J2STFK847",apiKey:"b12d6cb143c2ddadfa8989c962d1a049",indexName:"openeo"},nav:[{text:"Home",link:"/"},{text:"About",link:"/about.html"},{text:"News",link:"/news/"},{text:"Software",link:"/software.html"},{text:"Services / Hub",link:"https://hub.openeo.org"},{text:"User Documentation",userNav:!0,items:[]},{text:"Developers",devNav:!0,items:[]},{text:"PSC",link:"/psc.html"},{text:"Contact",link:"/contact.html"}],sidebar:"auto"}},Lt=n(148),It=Lt.themeConfig.versions[Lt.themeConfig.defaultVersion];"undefined"!=typeof window&&(window.global=window);n(149);r.a.component("ApiSpec",()=>n.e(39).then(n.bind(null,479))),r.a.component("ErrorCodes",()=>n.e(19).then(n.bind(null,480))),r.a.component("Channels",()=>Promise.all([n.e(0),n.e(27)]).then(n.bind(null,481))),r.a.component("InlineFrame",()=>Promise.all([n.e(0),n.e(28)]).then(n.bind(null,482))),r.a.component("News",()=>n.e(40).then(n.bind(null,483))),r.a.component("ProcessesSpec",()=>Promise.all([n.e(0),n.e(26)]).then(n.bind(null,484))),r.a.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,490)));n(150),n(151);r.a.component("CodeSwitcher",()=>n.e(53).then(n.bind(null,485)));var Dt=[({router:e,Vue:t})=>{t.config.ignoredElements=["redoc"],e.addRoutes([{path:"/documentation",redirect:It.path},{path:"/about",redirect:"about.html"},{path:"/software",redirect:"software.html"},{path:"/contact",redirect:"contact.html"},{path:"/glossary",redirect:It.path+"glossary.html"},{path:"/documentation/1.0/developers/backends/opendatacube.html",redirect:"/documentation/1.0/developers/backends/xarray.html"}])},{},({Vue:e})=>{e.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},{},{},{},({Vue:e})=>{e.component("CodeCopy",$t)}],Nt=[];class Ft extends class{constructor(){this.store=new r.a({data:{state:{}}})}$get(e){return this.store.state[e]}$set(e,t){r.a.set(this.store.state,e,t)}$emit(...e){this.store.$emit(...e)}$on(...e){this.store.$on(...e)}}{}Object.assign(Ft.prototype,{getPageAsyncComponent:lt,getLayoutAsyncComponent:ct,getAsyncComponent:ut,getVueComponent:pt});var Jt={install(e){const t=new Ft;e.$vuepress=t,e.prototype.$vuepress=t}};function Bt(e,t){const n=t.toLowerCase();return e.options.routes.some(e=>e.path.toLowerCase()===n)}var Vt={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(e){const t=this.pageKey||this.$parent.$page.key;return ft("pageKey",t),r.a.component(t)||r.a.component(t,lt(t)),r.a.component(t)?e(t):e("")}},zt={functional:!0,props:{slotKey:String,required:!0},render:(e,{props:t,slots:n})=>e("div",{class:["content__"+t.slotKey]},n()[t.slotKey])},qt={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},Gt=(n(152),n(153),Object(jt.a)(qt,(function(){var e=this._self._c;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Wt={functional:!0,render(e,{parent:t,children:n}){if(t._isMounted)return n;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};r.a.config.productionTip=!1,r.a.use(Ge),r.a.use(Jt),r.a.mixin(function(e,t,n=r.a){!function(e){e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(t),n.$vuepress.$set("siteData",t);const o=new(e(n.$vuepress.$get("siteData"))),a=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(o)),i={};return Object.keys(a).reduce((e,t)=>(t.startsWith("$")&&(e[t]=a[t].get),e),i),{computed:i}}(e=>class{setPage(e){this.__page=e}get $site(){return e}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:e={}}=this.$site;let t,n;for(const r in e)"/"===r?n=e[r]:0===this.$page.path.indexOf(r)&&(t=e[r]);return t||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:e}=this.$page.frontmatter;return"string"==typeof e&&e}get $title(){const e=this.$page,{metaTitle:t}=this.$page.frontmatter;if("string"==typeof t)return t;const n=this.$siteTitle,r=e.frontmatter.home?null:e.frontmatter.title||e.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const e=function(e){if(e){const t=e.filter(e=>"description"===e.name)[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(e,t){for(let n=0;nn||(e.hash?!r.a.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(e.hash)}:{x:0,y:0})});!function(e){e.beforeEach((t,n,r)=>{if(Bt(e,t.path))r();else if(/(\/|\.html)$/.test(t.path))if(/\/$/.test(t.path)){const n=t.path.replace(/\/$/,"")+".html";Bt(e,n)?r(n):r()}else r();else{const n=t.path+"/",o=t.path+".html";Bt(e,o)?r(o):Bt(e,n)?r(n):r()}})}(n);const o={};try{await Promise.all(Dt.filter(e=>"function"==typeof e).map(t=>t({Vue:r.a,options:o,router:n,siteData:Mt,isServer:e})))}catch(e){console.error(e)}return{app:new r.a(Object.assign(o,{router:n,render:e=>e("div",{attrs:{id:"app"}},[e("RouterView",{ref:"layout"}),e("div",{class:"global-ui"},Nt.map(t=>e(t)))])})),router:n}}(!1).then(({app:e,router:t})=>{t.onReady(()=>{e.$mount("#app")})})}]); \ No newline at end of file diff --git a/assets/js/vendors~docsearch.279cf75c.js b/assets/js/vendors~docsearch.acaf3067.js similarity index 99% rename from assets/js/vendors~docsearch.279cf75c.js rename to assets/js/vendors~docsearch.acaf3067.js index 522c0c5d1..6f760a8c7 100644 --- a/assets/js/vendors~docsearch.279cf75c.js +++ b/assets/js/vendors~docsearch.acaf3067.js @@ -1,3 +1,3 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{472:function(t,e,n){ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{474:function(t,e,n){ /*! docsearch 2.6.3 | © Algolia | github.com/algolia/docsearch */ -var r;"undefined"!=typeof self&&self,r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=22)}([function(t,e,n){"use strict";var r,i=n(1);function s(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,r){t&&(n.isArray(t)?e[r]=[].concat(t):n.isObject(t)&&(e[r]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(r,i){n&&(n=e.call(null,r,i,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(r,i){if(e.call(null,r,i,t))return n=!0,!1})),n):n},getUniqueId:(r=0,function(){return r++}),templatify:function(t){if(this.isFunction(t))return t;var e=i.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"";var r=document.createElement("div");r.appendChild(document.createTextNode(e)),n=n||"";var i=document.createElement("div");i.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(t)),o.innerHTML.replace(RegExp(s(r.innerHTML),"g"),e).replace(RegExp(s(i.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var s=t.length;if(s===+s)for(var o=0;o was loaded but did not call our provided callback"),JSONPScriptError:s("JSONPScriptError"," + diff --git a/documentation/0.4/developers/api/errors.html b/documentation/0.4/developers/api/errors.html index 3eb8e33bd..81cfbb6a8 100644 --- a/documentation/0.4/developers/api/errors.html +++ b/documentation/0.4/developers/api/errors.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/api/index.html b/documentation/0.4/developers/api/index.html index cb57546a0..4cfdedbc1 100644 --- a/documentation/0.4/developers/api/index.html +++ b/documentation/0.4/developers/api/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/api/reference.html b/documentation/0.4/developers/api/reference.html index c8be7c777..ed93d098d 100644 --- a/documentation/0.4/developers/api/reference.html +++ b/documentation/0.4/developers/api/reference.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/arch.html b/documentation/0.4/developers/arch.html index 3830c3cd5..909a283ea 100644 --- a/documentation/0.4/developers/arch.html +++ b/documentation/0.4/developers/arch.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/backends/getting-started.html b/documentation/0.4/developers/backends/getting-started.html index b84e370fa..a891aa52c 100644 --- a/documentation/0.4/developers/backends/getting-started.html +++ b/documentation/0.4/developers/backends/getting-started.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/backends/udfs.html b/documentation/0.4/developers/backends/udfs.html index 086a00e7e..a6a98ed64 100644 --- a/documentation/0.4/developers/backends/udfs.html +++ b/documentation/0.4/developers/backends/udfs.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/clients/getting-started.html b/documentation/0.4/developers/clients/getting-started.html index 12e9d2fb0..751ef3b5d 100644 --- a/documentation/0.4/developers/clients/getting-started.html +++ b/documentation/0.4/developers/clients/getting-started.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/clients/library-guidelines.html b/documentation/0.4/developers/clients/library-guidelines.html index 547f0f3c2..679530ff7 100644 --- a/documentation/0.4/developers/clients/library-guidelines.html +++ b/documentation/0.4/developers/clients/library-guidelines.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/examples/index.html b/documentation/0.4/developers/examples/index.html index f21617d45..2975d95ce 100644 --- a/documentation/0.4/developers/examples/index.html +++ b/documentation/0.4/developers/examples/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/examples/poc.html b/documentation/0.4/developers/examples/poc.html index 4547fb7f8..829f10540 100644 --- a/documentation/0.4/developers/examples/poc.html +++ b/documentation/0.4/developers/examples/poc.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/developers/index.html b/documentation/0.4/developers/index.html index 6a66bd9eb..7307a0512 100644 --- a/documentation/0.4/developers/index.html +++ b/documentation/0.4/developers/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/getting-started.html b/documentation/0.4/getting-started.html index 7d1e0332d..99a4b6ba1 100644 --- a/documentation/0.4/getting-started.html +++ b/documentation/0.4/getting-started.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/glossary.html b/documentation/0.4/glossary.html index d216e8e2b..6d666731e 100644 --- a/documentation/0.4/glossary.html +++ b/documentation/0.4/glossary.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/index.html b/documentation/0.4/index.html index c550a6d09..a7d0a18c5 100644 --- a/documentation/0.4/index.html +++ b/documentation/0.4/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/processes.html b/documentation/0.4/processes.html index eed4f8a26..b5730fd3d 100644 --- a/documentation/0.4/processes.html +++ b/documentation/0.4/processes.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/0.4/udfs.html b/documentation/0.4/udfs.html index c90fcccc5..7e1c58906 100644 --- a/documentation/0.4/udfs.html +++ b/documentation/0.4/udfs.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/authentication.html b/documentation/1.0/authentication.html index 454b6382c..1e0108db7 100644 --- a/documentation/1.0/authentication.html +++ b/documentation/1.0/authentication.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/cookbook/index.html b/documentation/1.0/cookbook/index.html index 9f746002b..fca0b8d6b 100644 --- a/documentation/1.0/cookbook/index.html +++ b/documentation/1.0/cookbook/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/datacubes.html b/documentation/1.0/datacubes.html index a6d683725..ab21c49a9 100644 --- a/documentation/1.0/datacubes.html +++ b/documentation/1.0/datacubes.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/datacubes/index.html b/documentation/1.0/datacubes/index.html index b7734bae3..c5577bfe1 100644 --- a/documentation/1.0/datacubes/index.html +++ b/documentation/1.0/datacubes/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/api/errors.html b/documentation/1.0/developers/api/errors.html index 70fd24566..86228f64a 100644 --- a/documentation/1.0/developers/api/errors.html +++ b/documentation/1.0/developers/api/errors.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/api/index.html b/documentation/1.0/developers/api/index.html index eef327643..09ca688e1 100644 --- a/documentation/1.0/developers/api/index.html +++ b/documentation/1.0/developers/api/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/api/reference.html b/documentation/1.0/developers/api/reference.html index cdd7c64c3..b5fbbcf6b 100644 --- a/documentation/1.0/developers/api/reference.html +++ b/documentation/1.0/developers/api/reference.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/arch.html b/documentation/1.0/developers/arch.html index 6844b77c6..7fa3c25ba 100644 --- a/documentation/1.0/developers/arch.html +++ b/documentation/1.0/developers/arch.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/backends/getting-started.html b/documentation/1.0/developers/backends/getting-started.html index 3763172de..3f8ad9bd5 100644 --- a/documentation/1.0/developers/backends/getting-started.html +++ b/documentation/1.0/developers/backends/getting-started.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/backends/performance.html b/documentation/1.0/developers/backends/performance.html index 041f0ea14..162c0896b 100644 --- a/documentation/1.0/developers/backends/performance.html +++ b/documentation/1.0/developers/backends/performance.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/backends/xarray.html b/documentation/1.0/developers/backends/xarray.html index d720602f0..146001449 100644 --- a/documentation/1.0/developers/backends/xarray.html +++ b/documentation/1.0/developers/backends/xarray.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/clients/getting-started.html b/documentation/1.0/developers/clients/getting-started.html index 4fa06cedd..930f0730e 100644 --- a/documentation/1.0/developers/clients/getting-started.html +++ b/documentation/1.0/developers/clients/getting-started.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/clients/library-guidelines.html b/documentation/1.0/developers/clients/library-guidelines.html index e798ee8c2..9c04d3b4f 100644 --- a/documentation/1.0/developers/clients/library-guidelines.html +++ b/documentation/1.0/developers/clients/library-guidelines.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/index.html b/documentation/1.0/developers/index.html index 9fb083c1c..40bf719fd 100644 --- a/documentation/1.0/developers/index.html +++ b/documentation/1.0/developers/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/profiles/api.html b/documentation/1.0/developers/profiles/api.html index eb50cc46e..bfc49268b 100644 --- a/documentation/1.0/developers/profiles/api.html +++ b/documentation/1.0/developers/profiles/api.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/profiles/index.html b/documentation/1.0/developers/profiles/index.html index c5079b193..f4888ba5a 100644 --- a/documentation/1.0/developers/profiles/index.html +++ b/documentation/1.0/developers/profiles/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/developers/profiles/processes.html b/documentation/1.0/developers/profiles/processes.html index 8be5c452b..0cecb4e06 100644 --- a/documentation/1.0/developers/profiles/processes.html +++ b/documentation/1.0/developers/profiles/processes.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/glossary.html b/documentation/1.0/glossary.html index 0e9536b13..5aa7e2953 100644 --- a/documentation/1.0/glossary.html +++ b/documentation/1.0/glossary.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/index.html b/documentation/1.0/index.html index b76d70e08..6a81a9855 100644 --- a/documentation/1.0/index.html +++ b/documentation/1.0/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/javascript/index.html b/documentation/1.0/javascript/index.html index 5024215e6..ed0276c6d 100644 --- a/documentation/1.0/javascript/index.html +++ b/documentation/1.0/javascript/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/processes.html b/documentation/1.0/processes.html index 221285296..db1c564ae 100644 --- a/documentation/1.0/processes.html +++ b/documentation/1.0/processes.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/python/client-side-processing.html b/documentation/1.0/python/client-side-processing.html index cf6b6cd04..f241c5657 100644 --- a/documentation/1.0/python/client-side-processing.html +++ b/documentation/1.0/python/client-side-processing.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/python/index.html b/documentation/1.0/python/index.html index d909f3243..223ce1250 100644 --- a/documentation/1.0/python/index.html +++ b/documentation/1.0/python/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/qgis/index.html b/documentation/1.0/qgis/index.html index 4c565483f..e856a4fc3 100644 --- a/documentation/1.0/qgis/index.html +++ b/documentation/1.0/qgis/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/r/index.html b/documentation/1.0/r/index.html index 4c92a68e8..dfc19c49b 100644 --- a/documentation/1.0/r/index.html +++ b/documentation/1.0/r/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/1.0/udfs.html b/documentation/1.0/udfs.html index e70f3910f..7378f293e 100644 --- a/documentation/1.0/udfs.html +++ b/documentation/1.0/udfs.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/code-of-conduct.html b/documentation/code-of-conduct.html index 62e060054..65b7efa35 100644 --- a/documentation/code-of-conduct.html +++ b/documentation/code-of-conduct.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/documentation/software-guidelines.html b/documentation/software-guidelines.html index c23c7f47f..a6eca7ee2 100644 --- a/documentation/software-guidelines.html +++ b/documentation/software-guidelines.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/events/igarrs2021.html b/events/igarrs2021.html index adcfeb8e2..4b5037b03 100644 --- a/events/igarrs2021.html +++ b/events/igarrs2021.html @@ -8,8 +8,8 @@ - - + + - + diff --git a/news/2017-12-05-welcome.html b/news/2017-12-05-welcome.html index 418fa805e..1c511bba8 100644 --- a/news/2017-12-05-welcome.html +++ b/news/2017-12-05-welcome.html @@ -8,8 +8,8 @@ - - + + - + diff --git a/news/2017-12-18-VITO_meeting.html b/news/2017-12-18-VITO_meeting.html index 47ef40502..7aa8830c2 100644 --- a/news/2017-12-18-VITO_meeting.html +++ b/news/2017-12-18-VITO_meeting.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2018-01-31-WWU_meeting.html b/news/2018-01-31-WWU_meeting.html index 986902d2c..3c411e42a 100644 --- a/news/2018-01-31-WWU_meeting.html +++ b/news/2018-01-31-WWU_meeting.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2018-03-15-poc.html b/news/2018-03-15-poc.html index ba3e98851..a944257a5 100644 --- a/news/2018-03-15-poc.html +++ b/news/2018-03-15-poc.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2018-05-23-user-requirements-survey-launched.html b/news/2018-05-23-user-requirements-survey-launched.html index 2f018c494..5c7550bb5 100644 --- a/news/2018-05-23-user-requirements-survey-launched.html +++ b/news/2018-05-23-user-requirements-survey-launched.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2018-10-30-year-one-review-meeting.html b/news/2018-10-30-year-one-review-meeting.html index 55f8aca26..172de395f 100644 --- a/news/2018-10-30-year-one-review-meeting.html +++ b/news/2018-10-30-year-one-review-meeting.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2019-03-07-openeo-api-040.html b/news/2019-03-07-openeo-api-040.html index ec37dee1c..e2461182d 100644 --- a/news/2019-03-07-openeo-api-040.html +++ b/news/2019-03-07-openeo-api-040.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2019-10-07-EO-big-data-hackaton.html b/news/2019-10-07-EO-big-data-hackaton.html index 50664598d..4b4fe4f94 100644 --- a/news/2019-10-07-EO-big-data-hackaton.html +++ b/news/2019-10-07-EO-big-data-hackaton.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2020-07-31-lessons-learned.html b/news/2020-07-31-lessons-learned.html index dc06ca64e..f4f6ef140 100644 --- a/news/2020-07-31-lessons-learned.html +++ b/news/2020-07-31-lessons-learned.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2020-07-31-openeo-api-released.html b/news/2020-07-31-openeo-api-released.html index 28326f9ec..21d1ef199 100644 --- a/news/2020-07-31-openeo-api-released.html +++ b/news/2020-07-31-openeo-api-released.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2020-09-02-openeo-user-workshop.html b/news/2020-09-02-openeo-user-workshop.html index ea2a73f28..5dd00c8b7 100644 --- a/news/2020-09-02-openeo-user-workshop.html +++ b/news/2020-09-02-openeo-user-workshop.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2020-11-30-openeo-api-101-released.html b/news/2020-11-30-openeo-api-101-released.html index a95ccb2f4..f526a7f69 100644 --- a/news/2020-11-30-openeo-api-101-released.html +++ b/news/2020-11-30-openeo-api-101-released.html @@ -8,8 +8,8 @@ - - + + - + diff --git a/news/2021-05-17-openeo-api-110-released.html b/news/2021-05-17-openeo-api-110-released.html index d9b566cd9..39001091d 100644 --- a/news/2021-05-17-openeo-api-110-released.html +++ b/news/2021-05-17-openeo-api-110-released.html @@ -8,8 +8,8 @@ - - + + - + diff --git a/news/2021-11-08-r-client-on-cran.html b/news/2021-11-08-r-client-on-cran.html index b71bc7b14..94eb8a6f2 100644 --- a/news/2021-11-08-r-client-on-cran.html +++ b/news/2021-11-08-r-client-on-cran.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2022-04-08-psc-meetings.html b/news/2022-04-08-psc-meetings.html index b15b797e8..d97008e54 100644 --- a/news/2022-04-08-psc-meetings.html +++ b/news/2022-04-08-psc-meetings.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2022-05-12-r-client-v120.html b/news/2022-05-12-r-client-v120.html index 7831d2df6..39920be22 100644 --- a/news/2022-05-12-r-client-v120.html +++ b/news/2022-05-12-r-client-v120.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2022-07-07-monthly-dev-calls.html b/news/2022-07-07-monthly-dev-calls.html index 374bb4162..f7a3220d1 100644 --- a/news/2022-07-07-monthly-dev-calls.html +++ b/news/2022-07-07-monthly-dev-calls.html @@ -8,8 +8,8 @@ - - + + - + diff --git a/news/2022-11-17-r-client-v130.html b/news/2022-11-17-r-client-v130.html index f41a4e5ae..8d31b2c8a 100644 --- a/news/2022-11-17-r-client-v130.html +++ b/news/2022-11-17-r-client-v130.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html b/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html index 607455949..ad7928058 100644 --- a/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html +++ b/news/2023-05-25-new-openeo-versions-120-200rc1 copy.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2023-12-06-openeo-submitted-to-ogc.html b/news/2023-12-06-openeo-submitted-to-ogc.html index af01cf55c..92944807b 100644 --- a/news/2023-12-06-openeo-submitted-to-ogc.html +++ b/news/2023-12-06-openeo-submitted-to-ogc.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/2024-02-06-openeo-ogc-rfc.html b/news/2024-02-06-openeo-ogc-rfc.html index 644c7e8f5..8c01d59e6 100644 --- a/news/2024-02-06-openeo-ogc-rfc.html +++ b/news/2024-02-06-openeo-ogc-rfc.html @@ -8,8 +8,8 @@ - - + + - + diff --git a/news/2024-03-22_mooc_cubeandclouds.html b/news/2024-03-22_mooc_cubeandclouds.html index dd0bb0062..c0bbedfca 100644 --- a/news/2024-03-22_mooc_cubeandclouds.html +++ b/news/2024-03-22_mooc_cubeandclouds.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/news/index.html b/news/index.html index ad573a81f..9a9ff8ae2 100644 --- a/news/index.html +++ b/news/index.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/psc.html b/psc.html index 5553537ae..39fca5997 100644 --- a/psc.html +++ b/psc.html @@ -8,8 +8,8 @@ - - + +
- + diff --git a/software.html b/software.html index 9e90bbba4..2dde2c6e5 100644 --- a/software.html +++ b/software.html @@ -8,8 +8,8 @@ - - + +