diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..9daf524 --- /dev/null +++ b/404.html @@ -0,0 +1,1444 @@ + + + + + + + + + + + + + + + + + + + Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/assets/GBL_DOR&DOD.png b/assets/GBL_DOR&DOD.png new file mode 100644 index 0000000..ea8c474 Binary files /dev/null and b/assets/GBL_DOR&DOD.png differ diff --git a/assets/USMComunEventos.jpg b/assets/USMComunEventos.jpg new file mode 100644 index 0000000..6195a5f Binary files /dev/null and b/assets/USMComunEventos.jpg differ diff --git a/assets/USMComunEventos2.jpg b/assets/USMComunEventos2.jpg new file mode 100644 index 0000000..ebcd64c Binary files /dev/null and b/assets/USMComunEventos2.jpg differ diff --git a/assets/VV_crit/crit_1.png b/assets/VV_crit/crit_1.png new file mode 100644 index 0000000..ea70ec2 Binary files /dev/null and b/assets/VV_crit/crit_1.png differ diff --git a/assets/VV_crit/crit_2.png b/assets/VV_crit/crit_2.png new file mode 100644 index 0000000..5cf154c Binary files /dev/null and b/assets/VV_crit/crit_2.png differ diff --git a/assets/VV_crit/crit_3.png b/assets/VV_crit/crit_3.png new file mode 100644 index 0000000..b8ecb4f Binary files /dev/null and b/assets/VV_crit/crit_3.png differ diff --git a/assets/VV_crit/crit_4.png b/assets/VV_crit/crit_4.png new file mode 100644 index 0000000..3f43cd5 Binary files /dev/null and b/assets/VV_crit/crit_4.png differ diff --git a/assets/VV_crit/crit_5.png b/assets/VV_crit/crit_5.png new file mode 100644 index 0000000..4c18521 Binary files /dev/null and b/assets/VV_crit/crit_5.png differ diff --git a/assets/VV_crit/crit_6.png b/assets/VV_crit/crit_6.png new file mode 100644 index 0000000..a483efd Binary files /dev/null and b/assets/VV_crit/crit_6.png differ diff --git a/assets/VV_crit/crit_7.png b/assets/VV_crit/crit_7.png new file mode 100644 index 0000000..b03e478 Binary files /dev/null and b/assets/VV_crit/crit_7.png differ diff --git a/assets/VV_crit/crit_8.png b/assets/VV_crit/crit_8.png new file mode 100644 index 0000000..39310d9 Binary files /dev/null and b/assets/VV_crit/crit_8.png differ diff --git a/assets/VV_crit/crit_9.png b/assets/VV_crit/crit_9.png new file mode 100644 index 0000000..39310d9 Binary files /dev/null and b/assets/VV_crit/crit_9.png differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-01.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-01.jpg" new file mode 100644 index 0000000..a83f814 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-01.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-02.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-02.jpg" new file mode 100644 index 0000000..756569c Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-02.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-03.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-03.jpg" new file mode 100644 index 0000000..48f8447 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-03.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-04.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-04.jpg" new file mode 100644 index 0000000..fb508ba Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-04.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-05.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-05.jpg" new file mode 100644 index 0000000..e34a9d3 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-05.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-06.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-06.jpg" new file mode 100644 index 0000000..6990330 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-06.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-07.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-07.jpg" new file mode 100644 index 0000000..d8a1b77 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-07.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-08.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-08.jpg" new file mode 100644 index 0000000..bb2f6ad Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-08.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-09.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-09.jpg" new file mode 100644 index 0000000..3706d3e Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-09.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-10.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-10.jpg" new file mode 100644 index 0000000..3b410ee Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-10.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-11.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-11.jpg" new file mode 100644 index 0000000..a2c0a32 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-11.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-12.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-12.jpg" new file mode 100644 index 0000000..6f57b80 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-12.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-13.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-13.jpg" new file mode 100644 index 0000000..aab59f9 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-13.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-14.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-14.jpg" new file mode 100644 index 0000000..f73388c Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-14.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-15.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-15.jpg" new file mode 100644 index 0000000..2d9ffd6 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-15.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-16.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-16.jpg" new file mode 100644 index 0000000..9d119f2 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-16.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-17.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-17.jpg" new file mode 100644 index 0000000..7241b79 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-17.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-18.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-18.jpg" new file mode 100644 index 0000000..eaa55bc Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-18.jpg" differ diff --git "a/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-19.jpg" "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-19.jpg" new file mode 100644 index 0000000..e4b8428 Binary files /dev/null and "b/assets/Verifica\303\247\303\243o e Valida\303\247\303\243o - NutriGuide/NutriGuide-1-19.jpg" differ diff --git "a/assets/apresenta\303\247\303\243o da fac\303\247\303\243o/logo.jpeg" "b/assets/apresenta\303\247\303\243o da fac\303\247\303\243o/logo.jpeg" new file mode 100644 index 0000000..e464bb7 Binary files /dev/null and "b/assets/apresenta\303\247\303\243o da fac\303\247\303\243o/logo.jpeg" differ diff --git a/assets/dor_e_dod.png b/assets/dor_e_dod.png new file mode 100644 index 0000000..b87e0ad Binary files /dev/null and b/assets/dor_e_dod.png differ diff --git a/assets/facetas_ER.jpg b/assets/facetas_ER.jpg new file mode 100644 index 0000000..7487fa4 Binary files /dev/null and b/assets/facetas_ER.jpg differ diff --git a/assets/icones/canva.png b/assets/icones/canva.png new file mode 100644 index 0000000..8945537 Binary files /dev/null and b/assets/icones/canva.png differ diff --git a/assets/icones/chrome.svg b/assets/icones/chrome.svg new file mode 100644 index 0000000..3f64451 --- /dev/null +++ b/assets/icones/chrome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icones/discord.svg b/assets/icones/discord.svg new file mode 100644 index 0000000..c03e8e1 --- /dev/null +++ b/assets/icones/discord.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/assets/icones/figma.png b/assets/icones/figma.png new file mode 100644 index 0000000..42b30ba Binary files /dev/null and b/assets/icones/figma.png differ diff --git a/assets/icones/github.svg b/assets/icones/github.svg new file mode 100644 index 0000000..18e9450 --- /dev/null +++ b/assets/icones/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icones/microsoft-teams.svg b/assets/icones/microsoft-teams.svg new file mode 100644 index 0000000..b43c7b1 --- /dev/null +++ b/assets/icones/microsoft-teams.svg @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/assets/icones/mkdocs.svg b/assets/icones/mkdocs.svg new file mode 100644 index 0000000..09ae0e6 --- /dev/null +++ b/assets/icones/mkdocs.svg @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/assets/icones/mural.png b/assets/icones/mural.png new file mode 100644 index 0000000..2eb15e2 Binary files /dev/null and b/assets/icones/mural.png differ diff --git a/assets/icones/visual-studio-code.svg b/assets/icones/visual-studio-code.svg new file mode 100644 index 0000000..67aee17 --- /dev/null +++ b/assets/icones/visual-studio-code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icones/wpp.svg b/assets/icones/wpp.svg new file mode 100644 index 0000000..55298e9 --- /dev/null +++ b/assets/icones/wpp.svg @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/assets/icones/youtube.svg b/assets/icones/youtube.svg new file mode 100644 index 0000000..dbedef6 --- /dev/null +++ b/assets/icones/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/ishikawa.jpg b/assets/ishikawa.jpg new file mode 100644 index 0000000..3b7d4f3 Binary files /dev/null and b/assets/ishikawa.jpg differ diff --git a/assets/javascripts/bundle.d7c377c4.min.js b/assets/javascripts/bundle.d7c377c4.min.js new file mode 100644 index 0000000..6a0bcf8 --- /dev/null +++ b/assets/javascripts/bundle.d7c377c4.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Mi=Object.create;var gr=Object.defineProperty;var Li=Object.getOwnPropertyDescriptor;var _i=Object.getOwnPropertyNames,Ft=Object.getOwnPropertySymbols,Ai=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,ro=Object.prototype.propertyIsEnumerable;var to=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&to(e,r,t[r]);if(Ft)for(var r of Ft(t))ro.call(t,r)&&to(e,r,t[r]);return e};var oo=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Ft)for(var o of Ft(e))t.indexOf(o)<0&&ro.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ci=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _i(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Li(t,n))||o.enumerable});return e};var jt=(e,t,r)=>(r=e!=null?Mi(Ai(e)):{},Ci(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var no=(e,t,r)=>new Promise((o,n)=>{var i=c=>{try{a(r.next(c))}catch(p){n(p)}},s=c=>{try{a(r.throw(c))}catch(p){n(p)}},a=c=>c.done?o(c.value):Promise.resolve(c.value).then(i,s);a((r=r.apply(e,t)).next())});var ao=yr((Er,io)=>{(function(e,t){typeof Er=="object"&&typeof io!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var ct=C.type,Ve=C.tagName;return!!(Ve==="INPUT"&&s[ct]&&!C.readOnly||Ve==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function d(C){a(C.target)&&(o||c(C.target))&&p(C.target)}function y(C){a(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function b(C){document.visibilityState==="hidden"&&(n&&(o=!0),D())}function D(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function Q(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,Q())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",b,!0),D(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Kr=yr((kt,qr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof kt=="object"&&typeof qr=="object"?qr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof kt=="object"?kt.ClipboardJS=r():t.ClipboardJS=r()})(kt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Oi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var d=function(_){var O=f()(_);return u("cut"),O},y=d;function b(V){var _=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[_?"right":"left"]="-9999px";var $=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat($,"px"),O.setAttribute("readonly",""),O.value=V,O}var D=function(_,O){var $=b(_);O.container.appendChild($);var N=f()($);return u("copy"),$.remove(),N},Q=function(_){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},$="";return typeof _=="string"?$=D(_,O):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?$=D(_.value,O):($=f()(_),u("copy")),$},J=Q;function C(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(O){return typeof O}:C=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},C(V)}var ct=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=_.action,$=O===void 0?"copy":O,N=_.container,Y=_.target,ke=_.text;if($!=="copy"&&$!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&C(Y)==="object"&&Y.nodeType===1){if($==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if($==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:N});if(Y)return $==="cut"?y(Y):J(Y,{container:N})},Ve=ct;function Fe(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(O){return typeof O}:Fe=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Fe(V)}function vi(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function eo(V,_){for(var O=0;O<_.length;O++){var $=_[O];$.enumerable=$.enumerable||!1,$.configurable=!0,"value"in $&&($.writable=!0),Object.defineProperty(V,$.key,$)}}function gi(V,_,O){return _&&eo(V.prototype,_),O&&eo(V,O),V}function xi(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function($,N){return $.__proto__=N,$},br(V,_)}function yi(V){var _=Ti();return function(){var $=Rt(V),N;if(_){var Y=Rt(this).constructor;N=Reflect.construct($,arguments,Y)}else N=$.apply(this,arguments);return Ei(this,N)}}function Ei(V,_){return _&&(Fe(_)==="object"||typeof _=="function")?_:wi(V)}function wi(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Ti(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Rt(V){return Rt=Object.setPrototypeOf?Object.getPrototypeOf:function(O){return O.__proto__||Object.getPrototypeOf(O)},Rt(V)}function vr(V,_){var O="data-clipboard-".concat(V);if(_.hasAttribute(O))return _.getAttribute(O)}var Si=function(V){xi(O,V);var _=yi(O);function O($,N){var Y;return vi(this,O),Y=_.call(this),Y.resolveOptions(N),Y.listenClick($),Y}return gi(O,[{key:"resolveOptions",value:function(){var N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof N.action=="function"?N.action:this.defaultAction,this.target=typeof N.target=="function"?N.target:this.defaultTarget,this.text=typeof N.text=="function"?N.text:this.defaultText,this.container=Fe(N.container)==="object"?N.container:document.body}},{key:"listenClick",value:function(N){var Y=this;this.listener=p()(N,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(N){var Y=N.delegateTarget||N.currentTarget,ke=this.action(Y)||"copy",It=Ve({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(It?"success":"error",{action:ke,text:It,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(N){return vr("action",N)}},{key:"defaultTarget",value:function(N){var Y=vr("target",N);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(N){return vr("text",N)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(N){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(N,Y)}},{key:"cut",value:function(N){return y(N)}},{key:"isSupported",value:function(){var N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof N=="string"?[N]:N,ke=!!document.queryCommandSupported;return Y.forEach(function(It){ke=ke&&!!document.queryCommandSupported(It)}),ke}}]),O}(a()),Oi=Si},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s},438:function(o,n,i){var s=i(828);function a(l,f,u,d,y){var b=p.apply(this,arguments);return l.addEventListener(u,b,y),{destroy:function(){l.removeEventListener(u,b,y)}}}function c(l,f,u,d,y){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(b){return a(b,f,u,d,y)}))}function p(l,f,u,d){return function(y){y.delegateTarget=s(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(o,n,i){var s=i(879),a=i(438);function c(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(y))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,y);if(s.nodeList(u))return l(u,d,y);if(s.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(b){b.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(b){b.removeEventListener(d,y)})}}}function f(u,d,y){return a(document.body,u,d,y)}o.exports=c},817:function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Wa=/["'&<>]/;Vn.exports=Ua;function Ua(e){var t=""+e,r=Wa.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function z(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function K(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||a(u,d)})})}function a(u,d){try{c(o[u](d))}catch(y){f(i[0][3],y)}}function c(u){u.value instanceof ot?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){a("next",u)}function l(u){a("throw",u)}function f(u,d){u(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function po(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof be=="function"?be(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function k(e){return typeof e=="function"}function pt(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Ut=pt(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var je=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=be(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(b){i=b instanceof Ut?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=be(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{lo(y)}catch(b){i=i!=null?i:[],b instanceof Ut?i=K(K([],z(i)),z(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Ut(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)lo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&ze(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&ze(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=je.EMPTY;function Nt(e){return e instanceof je||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function lo(e){k(e)?e():e.unsubscribe()}var He={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var lt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?Tr:(this.currentObservers=null,a.push(r),new je(function(){o.currentObservers=null,ze(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new I;return r.source=this,r},t.create=function(r,o){return new xo(r,o)},t}(I);var xo=function(e){se(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(x);var St={now:function(){return(St.delegate||Date).now()},delegate:void 0};var Ot=function(e){se(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=St);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(ut.cancelAnimationFrame(o),r._scheduled=void 0)},t}(zt);var wo=function(e){se(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(qt);var ge=new wo(Eo);var M=new I(function(e){return e.complete()});function Kt(e){return e&&k(e.schedule)}function Cr(e){return e[e.length-1]}function Ge(e){return k(Cr(e))?e.pop():void 0}function Ae(e){return Kt(Cr(e))?e.pop():void 0}function Qt(e,t){return typeof Cr(e)=="number"?e.pop():t}var dt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Yt(e){return k(e==null?void 0:e.then)}function Bt(e){return k(e[ft])}function Gt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Jt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Wi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Xt=Wi();function Zt(e){return k(e==null?void 0:e[Xt])}function er(e){return co(this,arguments,function(){var r,o,n,i;return Wt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,ot(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,ot(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,ot(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function tr(e){return k(e==null?void 0:e.getReader)}function F(e){if(e instanceof I)return e;if(e!=null){if(Bt(e))return Ui(e);if(dt(e))return Ni(e);if(Yt(e))return Di(e);if(Gt(e))return To(e);if(Zt(e))return Vi(e);if(tr(e))return zi(e)}throw Jt(e)}function Ui(e){return new I(function(t){var r=e[ft]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Ni(e){return new I(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?v(function(n,i){return e(n,i,o)}):pe,ue(1),r?$e(t):Uo(function(){return new or}))}}function Rr(e){return e<=0?function(){return M}:g(function(t,r){var o=[];t.subscribe(E(r,function(n){o.push(n),e=2,!0))}function de(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,y=!1,b=!1,D=function(){f==null||f.unsubscribe(),f=void 0},Q=function(){D(),l=u=void 0,y=b=!1},J=function(){var C=l;Q(),C==null||C.unsubscribe()};return g(function(C,ct){d++,!b&&!y&&D();var Ve=u=u!=null?u:r();ct.add(function(){d--,d===0&&!b&&!y&&(f=jr(J,c))}),Ve.subscribe(ct),!l&&d>0&&(l=new it({next:function(Fe){return Ve.next(Fe)},error:function(Fe){b=!0,D(),f=jr(Q,n,Fe),Ve.error(Fe)},complete:function(){y=!0,D(),f=jr(Q,s),Ve.complete()}}),F(C).subscribe(l))})(p)}}function jr(e,t){for(var r=[],o=2;oe.next(document)),e}function W(e,t=document){return Array.from(t.querySelectorAll(e))}function U(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function Ie(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var ca=L(h(document.body,"focusin"),h(document.body,"focusout")).pipe(ye(1),q(void 0),m(()=>Ie()||document.body),Z(1));function vt(e){return ca.pipe(m(t=>e.contains(t)),X())}function qo(e,t){return L(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?ye(t):pe,q(!1))}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Ko(e){return L(h(window,"load"),h(window,"resize")).pipe(Le(0,ge),m(()=>Ue(e)),q(Ue(e)))}function ir(e){return{x:e.scrollLeft,y:e.scrollTop}}function et(e){return L(h(e,"scroll"),h(window,"resize")).pipe(Le(0,ge),m(()=>ir(e)),q(ir(e)))}function Qo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Qo(e,r)}function S(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Qo(o,n);return o}function ar(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function gt(e){let t=S("script",{src:e});return H(()=>(document.head.appendChild(t),L(h(t,"load"),h(t,"error").pipe(w(()=>kr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),ue(1))))}var Yo=new x,pa=H(()=>typeof ResizeObserver=="undefined"?gt("https://unpkg.com/resize-observer-polyfill"):R(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)Yo.next(t)})),w(e=>L(Ke,R(e)).pipe(A(()=>e.disconnect()))),Z(1));function le(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Se(e){return pa.pipe(T(t=>t.observe(e)),w(t=>Yo.pipe(v(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>le(e)))),q(le(e)))}function xt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function sr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var Bo=new x,la=H(()=>R(new IntersectionObserver(e=>{for(let t of e)Bo.next(t)},{threshold:0}))).pipe(w(e=>L(Ke,R(e)).pipe(A(()=>e.disconnect()))),Z(1));function yt(e){return la.pipe(T(t=>t.observe(e)),w(t=>Bo.pipe(v(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Go(e,t=16){return et(e).pipe(m(({y:r})=>{let o=le(e),n=xt(e);return r>=n.height-o.height-t}),X())}var cr={drawer:U("[data-md-toggle=drawer]"),search:U("[data-md-toggle=search]")};function Jo(e){return cr[e].checked}function Ye(e,t){cr[e].checked!==t&&cr[e].click()}function Ne(e){let t=cr[e];return h(t,"change").pipe(m(()=>t.checked),q(t.checked))}function ma(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function fa(){return L(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(q(!1))}function Xo(){let e=h(window,"keydown").pipe(v(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:Jo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),v(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!ma(o,r)}return!0}),de());return fa().pipe(w(t=>t?M:e))}function me(){return new URL(location.href)}function st(e,t=!1){if(G("navigation.instant")&&!t){let r=S("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function Zo(){return new x}function en(){return location.hash.slice(1)}function pr(e){let t=S("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function ua(e){return L(h(window,"hashchange"),e).pipe(m(en),q(en()),v(t=>t.length>0),Z(1))}function tn(e){return ua(e).pipe(m(t=>ce(`[id="${t}"]`)),v(t=>typeof t!="undefined"))}function At(e){let t=matchMedia(e);return nr(r=>t.addListener(()=>r(t.matches))).pipe(q(t.matches))}function rn(){let e=matchMedia("print");return L(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(q(e.matches))}function Dr(e,t){return e.pipe(w(r=>r?t():M))}function lr(e,t){return new I(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let i=Number(o.getResponseHeader("Content-Length"))||0;t.progress$.next(n.loaded/i*100)}}),t.progress$.next(5)),o.send()})}function De(e,t){return lr(e,t).pipe(w(r=>r.text()),m(r=>JSON.parse(r)),Z(1))}function on(e,t){let r=new DOMParser;return lr(e,t).pipe(w(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),Z(1))}function nn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function an(){return L(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(nn),q(nn()))}function sn(){return{width:innerWidth,height:innerHeight}}function cn(){return h(window,"resize",{passive:!0}).pipe(m(sn),q(sn()))}function pn(){return B([an(),cn()]).pipe(m(([e,t])=>({offset:e,size:t})),Z(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(te("size")),n=B([o,r]).pipe(m(()=>Ue(e)));return B([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function da(e){return h(e,"message",t=>t.data)}function ha(e){let t=new x;return t.subscribe(r=>e.postMessage(r)),t}function ln(e,t=new Worker(e)){let r=da(t),o=ha(t),n=new x;n.subscribe(o);let i=o.pipe(ee(),oe(!0));return n.pipe(ee(),Re(r.pipe(j(i))),de())}var ba=U("#__config"),Et=JSON.parse(ba.textContent);Et.base=`${new URL(Et.base,me())}`;function he(){return Et}function G(e){return Et.features.includes(e)}function we(e,t){return typeof t!="undefined"?Et.translations[e].replace("#",t.toString()):Et.translations[e]}function Oe(e,t=document){return U(`[data-md-component=${e}]`,t)}function ne(e,t=document){return W(`[data-md-component=${e}]`,t)}function va(e){let t=U(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>U(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function mn(e){if(!G("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=U(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new x;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),va(e).pipe(T(r=>t.next(r)),A(()=>t.complete()),m(r=>P({ref:e},r)))})}function ga(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function fn(e,t){let r=new x;return r.subscribe(({hidden:o})=>{e.hidden=o}),ga(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))}function Ct(e,t){return t==="inline"?S("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},S("div",{class:"md-tooltip__inner md-typeset"})):S("div",{class:"md-tooltip",id:e,role:"tooltip"},S("div",{class:"md-tooltip__inner md-typeset"}))}function un(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return S("aside",{class:"md-annotation",tabIndex:0},Ct(t),S("a",{href:r,class:"md-annotation__index",tabIndex:-1},S("span",{"data-md-annotation-id":e})))}else return S("aside",{class:"md-annotation",tabIndex:0},Ct(t),S("span",{class:"md-annotation__index",tabIndex:-1},S("span",{"data-md-annotation-id":e})))}function dn(e){return S("button",{class:"md-clipboard md-icon",title:we("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Vr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,S("del",null,p)," "],[]).slice(0,-1),i=he(),s=new URL(e.location,i.base);G("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=he();return S("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},S("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&S("div",{class:"md-search-result__icon md-icon"}),r>0&&S("h1",null,e.title),r<=0&&S("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return S("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&S("p",{class:"md-search-result__terms"},we("search.result.term.missing"),": ",...n)))}function hn(e){let t=e[0].score,r=[...e],o=he(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreVr(l,1)),...c.length?[S("details",{class:"md-search-result__more"},S("summary",{tabIndex:-1},S("div",null,c.length>0&&c.length===1?we("search.result.more.one"):we("search.result.more.other",c.length))),...c.map(l=>Vr(l,1)))]:[]];return S("li",{class:"md-search-result__item"},p)}function bn(e){return S("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>S("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?ar(r):r)))}function zr(e){let t=`tabbed-control tabbed-control--${e}`;return S("div",{class:t,hidden:!0},S("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function vn(e){return S("div",{class:"md-typeset__scrollwrap"},S("div",{class:"md-typeset__table"},e))}function xa(e){let t=he(),r=new URL(`../${e.version}/`,t.base);return S("li",{class:"md-version__item"},S("a",{href:`${r}`,class:"md-version__link"},e.title))}function gn(e,t){return S("div",{class:"md-version"},S("button",{class:"md-version__current","aria-label":we("select.version")},t.title),S("ul",{class:"md-version__list"},e.map(xa)))}var ya=0;function Ea(e,t){document.body.append(e);let{width:r}=le(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=sr(t),n=typeof o!="undefined"?et(o):R({x:0,y:0}),i=L(vt(t),qo(t)).pipe(X());return B([i,n]).pipe(m(([s,a])=>{let{x:c,y:p}=Ue(t),l=le(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:s,offset:{x:c-a.x+l.width/2-r/2,y:p-a.y+l.height+8}}}))}function Be(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${ya++}`,o=Ct(r,"inline"),n=U(".md-typeset",o);return n.innerHTML=t,H(()=>{let i=new x;return i.subscribe({next({offset:s}){o.style.setProperty("--md-tooltip-x",`${s.x}px`),o.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),L(i.pipe(v(({active:s})=>s)),i.pipe(ye(250),v(({active:s})=>!s))).subscribe({next({active:s}){s?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,ge)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(_t(125,ge),v(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?o.style.setProperty("--md-tooltip-0",`${-s}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ea(o,e).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))}).pipe(qe(ie))}function wa(e,t){let r=H(()=>B([Ko(e),et(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=le(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return vt(e).pipe(w(o=>r.pipe(m(n=>({active:o,offset:n})),ue(+!o||1/0))))}function xn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new x,s=i.pipe(ee(),oe(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),yt(e).pipe(j(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),L(i.pipe(v(({active:a})=>a)),i.pipe(ye(250),v(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,ge)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(_t(125,ge),v(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(j(s),v(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(j(s),ae(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ie())==null||p.blur()}}),r.pipe(j(s),v(a=>a===o),Qe(125)).subscribe(()=>e.focus()),wa(e,t).pipe(T(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function Ta(e){return e.tagName==="CODE"?W(".c, .c1, .cm",e):[e]}function Sa(e){let t=[];for(let r of Ta(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function yn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of Sa(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ce(`:scope > li:nth-child(${c})`,e)&&(s.set(c,un(c,i)),a.replaceWith(s.get(c)))}return s.size===0?M:H(()=>{let a=new x,c=a.pipe(ee(),oe(!0)),p=[];for(let[l,f]of s)p.push([U(".md-typeset",f),U(`:scope > li:nth-child(${l})`,e)]);return o.pipe(j(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?yn(f,u):yn(u,f)}),L(...[...s].map(([,l])=>xn(l,t,{target$:r}))).pipe(A(()=>a.complete()),de())})}function En(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return En(t)}}function wn(e,t){return H(()=>{let r=En(e);return typeof r!="undefined"?fr(r,e,t):M})}var Tn=jt(Kr());var Oa=0;function Sn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Sn(t)}}function Ma(e){return Se(e).pipe(m(({width:t})=>({scrollable:xt(e).width>t})),te("scrollable"))}function On(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new x,i=n.pipe(Rr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let s=[];if(Tn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Oa++}`;let p=dn(c.id);c.insertBefore(p,e),G("content.tooltips")&&s.push(Be(p))}let a=e.closest(".highlight");if(a instanceof HTMLElement){let c=Sn(a);if(typeof c!="undefined"&&(a.classList.contains("annotate")||G("content.code.annotate"))){let p=fr(c,e,t);s.push(Se(a).pipe(j(i),m(({width:l,height:f})=>l&&f),X(),w(l=>l?p:M)))}}return Ma(e).pipe(T(c=>n.next(c)),A(()=>n.complete()),m(c=>P({ref:e},c)),Re(...s))});return G("content.lazy")?yt(e).pipe(v(n=>n),ue(1),w(()=>o)):o}function La(e,{target$:t,print$:r}){let o=!0;return L(t.pipe(m(n=>n.closest("details:not([open])")),v(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(v(n=>n||!o),T(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Mn(e,t){return H(()=>{let r=new x;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),La(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}var Ln=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Qr,Aa=0;function Ca(){return typeof mermaid=="undefined"||mermaid instanceof Element?gt("https://unpkg.com/mermaid@10.6.1/dist/mermaid.min.js"):R(void 0)}function _n(e){return e.classList.remove("mermaid"),Qr||(Qr=Ca().pipe(T(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Ln,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),Z(1))),Qr.subscribe(()=>no(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Aa++}`,r=S("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),Qr.pipe(m(()=>({ref:e})))}var An=S("table");function Cn(e){return e.replaceWith(An),An.replaceWith(vn(e)),R({ref:e})}function ka(e){let t=e.find(r=>r.checked)||e[0];return L(...e.map(r=>h(r,"change").pipe(m(()=>U(`label[for="${r.id}"]`))))).pipe(q(U(`label[for="${t.id}"]`)),m(r=>({active:r})))}function kn(e,{viewport$:t,target$:r}){let o=U(".tabbed-labels",e),n=W(":scope > input",e),i=zr("prev");e.append(i);let s=zr("next");return e.append(s),H(()=>{let a=new x,c=a.pipe(ee(),oe(!0));B([a,Se(e)]).pipe(j(c),Le(1,ge)).subscribe({next([{active:p},l]){let f=Ue(p),{width:u}=le(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=ir(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),B([et(o),Se(o)]).pipe(j(c)).subscribe(([p,l])=>{let f=xt(o);i.hidden=p.x<16,s.hidden=p.x>f.width-l.width-16}),L(h(i,"click").pipe(m(()=>-1)),h(s,"click").pipe(m(()=>1))).pipe(j(c)).subscribe(p=>{let{width:l}=le(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(j(c),v(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=U(`label[for="${p.id}"]`);l.replaceChildren(S("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(j(c),v(f=>!(f.metaKey||f.ctrlKey)),T(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&a.pipe(Ee(1),ae(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of W("[data-tabs]"))for(let b of W(":scope > input",y)){let D=U(`label[for="${b.id}"]`);if(D!==p&&D.innerText.trim()===f){D.setAttribute("data-md-switching",""),b.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),a.pipe(j(c)).subscribe(()=>{for(let p of W("audio, video",e))p.pause()}),ka(n).pipe(T(p=>a.next(p)),A(()=>a.complete()),m(p=>P({ref:e},p)))}).pipe(qe(ie))}function Hn(e,{viewport$:t,target$:r,print$:o}){return L(...W(".annotate:not(.highlight)",e).map(n=>wn(n,{target$:r,print$:o})),...W("pre:not(.mermaid) > code",e).map(n=>On(n,{target$:r,print$:o})),...W("pre.mermaid",e).map(n=>_n(n)),...W("table:not([class])",e).map(n=>Cn(n)),...W("details",e).map(n=>Mn(n,{target$:r,print$:o})),...W("[data-tabs]",e).map(n=>kn(n,{viewport$:t,target$:r})),...W("[title]",e).filter(()=>G("content.tooltips")).map(n=>Be(n)))}function Ha(e,{alert$:t}){return t.pipe(w(r=>L(R(!0),R(!1).pipe(Qe(2e3))).pipe(m(o=>({message:r,active:o})))))}function $n(e,t){let r=U(".md-typeset",e);return H(()=>{let o=new x;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ha(e,t).pipe(T(n=>o.next(n)),A(()=>o.complete()),m(n=>P({ref:e},n)))})}function $a({viewport$:e}){if(!G("header.autohide"))return R(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ce(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),X()),o=Ne("search");return B([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),X(),w(n=>n?r:R(!1)),q(!1))}function Pn(e,t){return H(()=>B([Se(e),$a(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),X((r,o)=>r.height===o.height&&r.hidden===o.hidden),Z(1))}function Rn(e,{header$:t,main$:r}){return H(()=>{let o=new x,n=o.pipe(ee(),oe(!0));o.pipe(te("active"),Ze(t)).subscribe(([{active:s},{hidden:a}])=>{e.classList.toggle("md-header--shadow",s&&!a),e.hidden=a});let i=fe(W("[title]",e)).pipe(v(()=>G("content.tooltips")),re(s=>Be(s)));return r.subscribe(o),t.pipe(j(n),m(s=>P({ref:e},s)),Re(i.pipe(j(n))))})}function Pa(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=le(e);return{active:o>=n}}),te("active"))}function In(e,t){return H(()=>{let r=new x;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ce(".md-content h1");return typeof o=="undefined"?M:Pa(o,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))})}function Fn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),X()),n=o.pipe(w(()=>Se(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),te("bottom"))));return B([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),X((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function Ra(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return R(...e).pipe(re(r=>h(r,"change").pipe(m(()=>r))),q(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{media:r.getAttribute("data-md-color-media"),scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),Z(1))}function jn(e){let t=W("input",e),r=S("meta",{name:"theme-color"});document.head.appendChild(r);let o=S("meta",{name:"color-scheme"});document.head.appendChild(o);let n=At("(prefers-color-scheme: light)");return H(()=>{let i=new x;return i.subscribe(s=>{if(document.body.setAttribute("data-md-color-switching",""),s.color.media==="(prefers-color-scheme)"){let a=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(a.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");s.color.scheme=c.getAttribute("data-md-color-scheme"),s.color.primary=c.getAttribute("data-md-color-primary"),s.color.accent=c.getAttribute("data-md-color-accent")}for(let[a,c]of Object.entries(s.color))document.body.setAttribute(`data-md-color-${a}`,c);for(let a=0;a{let s=Oe("header"),a=window.getComputedStyle(s);return o.content=a.colorScheme,a.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(s=>r.content=`#${s}`),i.pipe(Me(ie)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ra(t).pipe(j(n.pipe(Ee(1))),at(),T(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))})}function Wn(e,{progress$:t}){return H(()=>{let r=new x;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(T(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Yr=jt(Kr());function Ia(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Un({alert$:e}){Yr.default.isSupported()&&new I(t=>{new Yr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ia(U(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(T(t=>{t.trigger.focus()}),m(()=>we("clipboard.copied"))).subscribe(e)}function Fa(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function ur(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return R(t);{let r=he();return on(new URL("sitemap.xml",e||r.base)).pipe(m(o=>Fa(W("loc",o).map(n=>n.textContent))),xe(()=>M),$e([]),T(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function Nn(e){let t=ce("[rel=canonical]",e);typeof t!="undefined"&&(t.href=t.href.replace("//localhost:","//127.0.0.1:"));let r=new Map;for(let o of W(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let s=o.getAttribute(i);if(s===null)continue;let a=new URL(s,t==null?void 0:t.href),c=o.cloneNode();c.setAttribute(i,`${a}`),n=c.outerHTML;break}r.set(n,o)}return r}function Dn({location$:e,viewport$:t,progress$:r}){let o=he();if(location.protocol==="file:")return M;let n=ur().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=h(document.body,"click").pipe(ae(n),w(([l,f])=>{if(!(l.target instanceof Element))return M;let u=l.target.closest("a");if(u===null)return M;if(u.target||l.metaKey||l.ctrlKey)return M;let d=new URL(u.href);return d.search=d.hash="",f.includes(`${d}`)?(l.preventDefault(),R(new URL(u.href))):M}),de());i.pipe(ue(1)).subscribe(()=>{let l=ce("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ae(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let s=e.pipe(q(me()),te("pathname"),Ee(1),w(l=>lr(l,{progress$:r}).pipe(xe(()=>(st(l,!0),M))))),a=new DOMParser,c=s.pipe(w(l=>l.text()),w(l=>{let f=a.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let D=ce(b),Q=ce(b,f);typeof D!="undefined"&&typeof Q!="undefined"&&D.replaceWith(Q)}let u=Nn(document.head),d=Nn(f.head);for(let[b,D]of d)D.getAttribute("rel")==="stylesheet"||D.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(D));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let y=Oe("container");return We(W("script",y)).pipe(w(b=>{let D=f.createElement("script");if(b.src){for(let Q of b.getAttributeNames())D.setAttribute(Q,b.getAttribute(Q));return b.replaceWith(D),new I(Q=>{D.onload=()=>Q.complete()})}else return D.textContent=b.textContent,b.replaceWith(D),M}),ee(),oe(f))}),de());return h(window,"popstate").pipe(m(me)).subscribe(e),e.pipe(q(me()),Ce(2,1),v(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",pr(l.hash),history.scrollRestoration="manual")}),e.pipe(Ir(i),q(me()),Ce(2,1),v(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",pr(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ae(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):pr(l.hash)}),t.pipe(te("offset"),ye(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var qn=jt(zn());function Kn(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,qn.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Ht(e){return e.type===1}function dr(e){return e.type===3}function Qn(e,t){let r=ln(e);return L(R(location.protocol!=="file:"),Ne("search")).pipe(Pe(o=>o),w(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function Yn({document$:e}){let t=he(),r=De(new URL("../versions.json",t.base)).pipe(xe(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),w(n=>h(document.body,"click").pipe(v(i=>!i.metaKey&&!i.ctrlKey),ae(o),w(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?M:(i.preventDefault(),R(c))}}return M}),w(i=>{let{version:s}=n.get(i);return ur(new URL(i)).pipe(m(a=>{let p=me().href.replace(t.base,"");return a.includes(p.split("#")[0])?new URL(`../${s}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>st(n,!0)),B([r,o]).subscribe(([n,i])=>{U(".md-header__topic").appendChild(gn(n,i))}),e.pipe(w(()=>o)).subscribe(n=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let a=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(a)||(a=[a]);e:for(let c of a)for(let p of n.aliases.concat(n.version))if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let a of ne("outdated"))a.hidden=!1})}function Da(e,{worker$:t}){let{searchParams:r}=me();r.has("q")&&(Ye("search",!0),e.value=r.get("q"),e.focus(),Ne("search").pipe(Pe(i=>!i)).subscribe(()=>{let i=me();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=vt(e),n=L(t.pipe(Pe(Ht)),h(e,"keyup"),o).pipe(m(()=>e.value),X());return B([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),Z(1))}function Bn(e,{worker$:t}){let r=new x,o=r.pipe(ee(),oe(!0));B([t.pipe(Pe(Ht)),r],(i,s)=>s).pipe(te("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(te("focus")).subscribe(({focus:i})=>{i&&Ye("search",i)}),h(e.form,"reset").pipe(j(o)).subscribe(()=>e.focus());let n=U("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),Da(e,{worker$:t}).pipe(T(i=>r.next(i)),A(()=>r.complete()),m(i=>P({ref:e},i)),Z(1))}function Gn(e,{worker$:t,query$:r}){let o=new x,n=Go(e.parentElement).pipe(v(Boolean)),i=e.parentElement,s=U(":scope > :first-child",e),a=U(":scope > :last-child",e);Ne("search").subscribe(l=>a.setAttribute("role",l?"list":"presentation")),o.pipe(ae(r),Wr(t.pipe(Pe(Ht)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?we("search.result.none"):we("search.result.placeholder");break;case 1:s.textContent=we("search.result.one");break;default:let u=ar(l.length);s.textContent=we("search.result.other",u)}});let c=o.pipe(T(()=>a.innerHTML=""),w(({items:l})=>L(R(...l.slice(0,10)),R(...l.slice(10)).pipe(Ce(4),Nr(n),w(([f])=>f)))),m(hn),de());return c.subscribe(l=>a.appendChild(l)),c.pipe(re(l=>{let f=ce("details",l);return typeof f=="undefined"?M:h(f,"toggle").pipe(j(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(v(dr),m(({data:l})=>l)).pipe(T(l=>o.next(l)),A(()=>o.complete()),m(l=>P({ref:e},l)))}function Va(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=me();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Jn(e,t){let r=new x,o=r.pipe(ee(),oe(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(j(o)).subscribe(n=>n.preventDefault()),Va(e,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))}function Xn(e,{worker$:t,keyboard$:r}){let o=new x,n=Oe("search-query"),i=L(h(n,"keydown"),h(n,"focus")).pipe(Me(ie),m(()=>n.value),X());return o.pipe(Ze(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(v(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(v(dr),m(({data:a})=>a)).pipe(T(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function Zn(e,{index$:t,keyboard$:r}){let o=he();try{let n=Qn(o.search,t),i=Oe("search-query",e),s=Oe("search-result",e);h(e,"click").pipe(v(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ye("search",!1)),r.pipe(v(({mode:c})=>c==="search")).subscribe(c=>{let p=Ie();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of W(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ye("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...W(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(v(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Bn(i,{worker$:n});return L(a,Gn(s,{worker$:n,query$:a})).pipe(Re(...ne("search-share",e).map(c=>Jn(c,{query$:a})),...ne("search-suggest",e).map(c=>Xn(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function ei(e,{index$:t,location$:r}){return B([t,r.pipe(q(me()),v(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>Kn(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=S("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function za(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return B([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),X((i,s)=>i.height===s.height&&i.locked===s.locked))}function Br(e,o){var n=o,{header$:t}=n,r=oo(n,["header$"]);let i=U(".md-sidebar__scrollwrap",e),{y:s}=Ue(i);return H(()=>{let a=new x,c=a.pipe(ee(),oe(!0)),p=a.pipe(Le(0,ge));return p.pipe(ae(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(Pe()).subscribe(()=>{for(let l of W(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=le(f);f.scrollTo({top:u-d/2})}}}),fe(W("label[tabindex]",e)).pipe(re(l=>h(l,"click").pipe(Me(ie),m(()=>l),j(c)))).subscribe(l=>{let f=U(`[id="${l.htmlFor}"]`);U(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),za(e,r).pipe(T(l=>a.next(l)),A(()=>a.complete()),m(l=>P({ref:e},l)))})}function ti(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Lt(De(`${r}/releases/latest`).pipe(xe(()=>M),m(o=>({version:o.tag_name})),$e({})),De(r).pipe(xe(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),$e({}))).pipe(m(([o,n])=>P(P({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return De(r).pipe(m(o=>({repositories:o.public_repos})),$e({}))}}function ri(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return De(r).pipe(xe(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),$e({}))}function oi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return ti(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ri(r,o)}return M}var qa;function Ka(e){return qa||(qa=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return R(t);if(ne("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return oi(e.href).pipe(T(o=>__md_set("__source",o,sessionStorage)))}).pipe(xe(()=>M),v(t=>Object.keys(t).length>0),m(t=>({facts:t})),Z(1)))}function ni(e){let t=U(":scope > :last-child",e);return H(()=>{let r=new x;return r.subscribe(({facts:o})=>{t.appendChild(bn(o)),t.classList.add("md-source__repository--active")}),Ka(e).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function Qa(e,{viewport$:t,header$:r}){return Se(document.body).pipe(w(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),te("hidden"))}function ii(e,t){return H(()=>{let r=new x;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?R({hidden:!1}):Qa(e,t)).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function Ya(e,{viewport$:t,header$:r}){let o=new Map,n=W("[href^=\\#]",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ce(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(te("height"),m(({height:a})=>{let c=Oe("main"),p=U(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),de());return Se(document.body).pipe(te("height"),w(a=>H(()=>{let c=[];return R([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Ze(i),w(([c,p])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(a.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),X((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),q({prev:[],next:[]}),Ce(2,1),m(([a,c])=>a.prev.length{let i=new x,s=i.pipe(ee(),oe(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),G("toc.follow")){let a=L(t.pipe(ye(1),m(()=>{})),t.pipe(ye(250),m(()=>"smooth")));i.pipe(v(({prev:c})=>c.length>0),Ze(o.pipe(Me(ie))),ae(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=sr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=le(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return G("navigation.tracking")&&t.pipe(j(s),te("offset"),ye(250),Ee(1),j(n.pipe(Ee(1))),at({delay:250}),ae(i)).subscribe(([,{prev:a}])=>{let c=me(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Ya(e,{viewport$:t,header$:r}).pipe(T(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function Ba(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),Ce(2,1),m(([s,a])=>s>a&&a>0),X()),i=r.pipe(m(({active:s})=>s));return B([i,n]).pipe(m(([s,a])=>!(s&&a)),X(),j(o.pipe(Ee(1))),oe(!0),at({delay:250}),m(s=>({hidden:s})))}function si(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new x,s=i.pipe(ee(),oe(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(j(s),te("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),Ba(e,{viewport$:t,main$:o,target$:n}).pipe(T(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))}function ci({document$:e}){e.pipe(w(()=>W(".md-ellipsis")),re(t=>yt(t).pipe(j(e.pipe(Ee(1))),v(r=>r),m(()=>t),ue(1))),v(t=>t.offsetWidth{let r=t.innerText,o=t.closest("a")||t;return o.title=r,Be(o).pipe(j(e.pipe(Ee(1))),A(()=>o.removeAttribute("title")))})).subscribe(),e.pipe(w(()=>W(".md-status")),re(t=>Be(t))).subscribe()}function pi({document$:e,tablet$:t}){e.pipe(w(()=>W(".md-toggle--indeterminate")),T(r=>{r.indeterminate=!0,r.checked=!1}),re(r=>h(r,"change").pipe(Ur(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ae(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Ga(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function li({document$:e}){e.pipe(w(()=>W("[data-md-scrollfix]")),T(t=>t.removeAttribute("data-md-scrollfix")),v(Ga),re(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function mi({viewport$:e,tablet$:t}){B([Ne("search"),t]).pipe(m(([r,o])=>r&&!o),w(r=>R(r).pipe(Qe(r?400:100))),ae(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function Ja(){return location.protocol==="file:"?gt(`${new URL("search/search_index.js",Gr.base)}`).pipe(m(()=>__index),Z(1)):De(new URL("search/search_index.json",Gr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var rt=zo(),Pt=Zo(),wt=tn(Pt),Jr=Xo(),_e=pn(),hr=At("(min-width: 960px)"),ui=At("(min-width: 1220px)"),di=rn(),Gr=he(),hi=document.forms.namedItem("search")?Ja():Ke,Xr=new x;Un({alert$:Xr});var Zr=new x;G("navigation.instant")&&Dn({location$:Pt,viewport$:_e,progress$:Zr}).subscribe(rt);var fi;((fi=Gr.version)==null?void 0:fi.provider)==="mike"&&Yn({document$:rt});L(Pt,wt).pipe(Qe(125)).subscribe(()=>{Ye("drawer",!1),Ye("search",!1)});Jr.pipe(v(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ce("link[rel=prev]");typeof t!="undefined"&&st(t);break;case"n":case".":let r=ce("link[rel=next]");typeof r!="undefined"&&st(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});ci({document$:rt});pi({document$:rt,tablet$:hr});li({document$:rt});mi({viewport$:_e,tablet$:hr});var tt=Pn(Oe("header"),{viewport$:_e}),$t=rt.pipe(m(()=>Oe("main")),w(e=>Fn(e,{viewport$:_e,header$:tt})),Z(1)),Xa=L(...ne("consent").map(e=>fn(e,{target$:wt})),...ne("dialog").map(e=>$n(e,{alert$:Xr})),...ne("header").map(e=>Rn(e,{viewport$:_e,header$:tt,main$:$t})),...ne("palette").map(e=>jn(e)),...ne("progress").map(e=>Wn(e,{progress$:Zr})),...ne("search").map(e=>Zn(e,{index$:hi,keyboard$:Jr})),...ne("source").map(e=>ni(e))),Za=H(()=>L(...ne("announce").map(e=>mn(e)),...ne("content").map(e=>Hn(e,{viewport$:_e,target$:wt,print$:di})),...ne("content").map(e=>G("search.highlight")?ei(e,{index$:hi,location$:Pt}):M),...ne("header-title").map(e=>In(e,{viewport$:_e,header$:tt})),...ne("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Dr(ui,()=>Br(e,{viewport$:_e,header$:tt,main$:$t})):Dr(hr,()=>Br(e,{viewport$:_e,header$:tt,main$:$t}))),...ne("tabs").map(e=>ii(e,{viewport$:_e,header$:tt})),...ne("toc").map(e=>ai(e,{viewport$:_e,header$:tt,main$:$t,target$:wt})),...ne("top").map(e=>si(e,{viewport$:_e,header$:tt,main$:$t,target$:wt})))),bi=rt.pipe(w(()=>Za),Re(Xa),Z(1));bi.subscribe();window.document$=rt;window.location$=Pt;window.target$=wt;window.keyboard$=Jr;window.viewport$=_e;window.tablet$=hr;window.screen$=ui;window.print$=di;window.alert$=Xr;window.progress$=Zr;window.component$=bi;})(); +//# sourceMappingURL=bundle.d7c377c4.min.js.map + diff --git a/assets/javascripts/bundle.d7c377c4.min.js.map b/assets/javascripts/bundle.d7c377c4.min.js.map new file mode 100644 index 0000000..a57d388 --- /dev/null +++ b/assets/javascripts/bundle.d7c377c4.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/sample.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2023 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + +

+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/2.entrega-unidade2/index.html b/entregas/2.entrega-unidade2/index.html new file mode 100644 index 0000000..9f01ecf --- /dev/null +++ b/entregas/2.entrega-unidade2/index.html @@ -0,0 +1,1581 @@ + + + + + + + + + + + + + + + + + + + + + + + Unidade 2 - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Pré-planejamento: Engenharia de Requisitos

+ +

Vídeo de apresentação

+

A entrega da Unidade 2 está presente no vídeo abaixo, mas também pode ser acessada aqui.

+

+ + +

+

Verificação e Validação - Nutriguide (Facção Skywalkers)

+

A atividade de verificação e validação dos requisitos foi feita para o projeto NutriGuide, da facção Skywalkers, cuja documentação pode ser acessada aqui.

+

Slides verificação e validação nutriguide - página 1 +Slides verificação e validação nutriguide - página 2 +Slides verificação e validação nutriguide - página 3 +Slides verificação e validação nutriguide - página 4 +Slides verificação e validação nutriguide - página 5 +Slides verificação e validação nutriguide - página 6 +Slides verificação e validação nutriguide - página 7 +Slides verificação e validação nutriguide - página 8 +Slides verificação e validação nutriguide - página 9 +Slides verificação e validação nutriguide - página 10 +Slides verificação e validação nutriguide - página 11 +Slides verificação e validação nutriguide - página 12 +Slides verificação e validação nutriguide - página 13 +Slides verificação e validação nutriguide - página 14 +Slides verificação e validação nutriguide - página 15 +Slides verificação e validação nutriguide - página 16 +Slides verificação e validação nutriguide - página 17 +Slides verificação e validação nutriguide - página 18 +Slides verificação e validação nutriguide - página 19

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-03/1.entrega-unidade3/index.html b/entregas/unidade-03/1.entrega-unidade3/index.html new file mode 100644 index 0000000..16f2653 --- /dev/null +++ b/entregas/unidade-03/1.entrega-unidade3/index.html @@ -0,0 +1,1544 @@ + + + + + + + + + + + + + + + + + + + + + + + Apresentação - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Apresentação do PBB, BDD, USM, DoR e DoD desenvolvidos sobre a facção GBL

+ +

Vídeo de apresentação

+

A entrega da Unidade 3 está presente no vídeo abaixo, mas também pode ser acessada aqui.

+

+ + +

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-03/2.pbb/index.html b/entregas/unidade-03/2.pbb/index.html new file mode 100644 index 0000000..b2b39f0 --- /dev/null +++ b/entregas/unidade-03/2.pbb/index.html @@ -0,0 +1,1604 @@ + + + + + + + + + + + + + + + + + + + + + + + PBB - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

PBB

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
22/11/20230.1Criação do documentoJoão Barreto
+

O Product Backlog Building (PBB) é uma abordagem empregada no âmbito da gestão ágil de projetos de software. Trata-se de uma estratégia para a constante elaboração e aprimoramento do Backlog do Produto, uma lista dinâmica e priorizada que engloba todos os requisitos, funcionalidades, aprimoramentos e correções essenciais para um produto. O PBB implica na criação e atualização iterativa do backlog, incorporando novos elementos à medida que são identificados, eliminando ou aperfeiçoando aqueles que se tornam mais claros ou menos relevantes com o tempo, e priorizando-os com base no valor de negócio que proporcionam ao produto. Essa abordagem tem como objetivo manter o backlog constantemente alinhado com as demandas do produto e do cliente, viabilizando uma adaptação e evolução mais eficazes ao longo do ciclo de desenvolvimento.

+

O que é a HealthNet?

+

A HealthNet é uma rede de clínicas e hospitais que está passando por dificuldades no gerenciamento de seus dados. Os problemas e necessidades da HealthNet podem ser vistos de forma mais detalhada por meio deste link

+

PBB - Guardiões da Galáxia

+

Com base no documento apresentado no tópico acima, foi elaborado um PBB que atendesse as necessidades da HealthNet. Abaixo segue o quadro no Miro com esse PBB:

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-03/3.pbb-revisao/index.html b/entregas/unidade-03/3.pbb-revisao/index.html new file mode 100644 index 0000000..51ba078 --- /dev/null +++ b/entregas/unidade-03/3.pbb-revisao/index.html @@ -0,0 +1,1878 @@ + + + + + + + + + + + + + + + + + + + + + + + Ver&Val PBB - Facção GBL - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

PBB

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/11/20230.1Criação do documentoArtur e João
+

O Product Backlog Building (PBB) é uma técnica utilizada no contexto de gerenciamento ágil de projetos de software. Ele é uma estratégia para a construção e refinamento contínuo do Product Backlog, uma lista dinâmica e priorizada de todos os requisitos, funcionalidades, melhorias e correções necessárias para um produto. O PBB envolve a criação e atualização iterativa do backlog, adicionando novos itens conforme são identificados, removendo ou refinando aqueles que se tornam mais claros ou menos relevantes ao longo do tempo e priorizando-os de acordo com o valor de negócio que oferecem ao produto. Essa técnica visa manter o backlog constantemente alinhado com as necessidades do produto e do cliente, permitindo uma melhor adaptação e evolução durante o ciclo de desenvolvimento.

+

PBB de Feedback

+

Os Critérios de Verificação foram feitos com base na documentação do problema e sua respectiva descrição. Segue abaixo uma lista dos critérios utilizados:

+

[ X ] Contém o nome do produto no PBB +
+[ X ] Os problemas do cliente foram listados corretamente +
+[ X ] As expectativas atendem aos problemas apresentados +
+[ X ] As personas representam os perfis que utilizam o Health de alguma forma +
+[ X ] É definido o que as personas fazem e o que elas esperam +
+[ X ] As funcionalidades são capazes de identificar ações e/ou interações das personas com o produto +
+[ X ] As funcionalidades resolvem os problemas das personas +
+[ X ] As funcionalidades trazem benefícios para as personas +
+[ X ] Os PBIs representam todas as funcionalidades +
+[ X ] Cada PBI representa uma ação do usuário no produto +
+[ X ] As PBIs foram priorizadas com relação ao uso e ao valor de negócio +
+[ X ] Os PBIs seguem uma sequência lógica de organização +
+[ X ] As USs estão estruturadas no formato: “Eu, como persona, posso ação para valor de negócio

+

Em um contexto geral, o grupo atendeu às necessidades do problema proposto. Porém, existem algumas observações a serem apontadas:

+

Personas

+

As atividades e objetivos das personas devem possuir uma granularidade menor, para que elas tenham uma maior especificidade e claridade.

+

User Stories

+

Abaixo seguem observações para melhoria das User Stories:

+

US01 - Como gerenciador de consultas, Posso ser capaz de agendar consultas com diferentes especialistas Para que eu possa ter uma visão unificada das agendas e escolher horários convenientes.

+

Critério de aceitação se refere a outra persona.

+

US03 - Como gerenciador de consultas, quero ter a capacidade de acessar um painel de controle que exiba as agendas de todos os médicos, para não ter conflito de horário.

+

Critérios de aceitação estão muitos específicos e a User Story também é muito específica e +o para não é a solução direta de visualizar as agendas de todos os médicos

+

US04 - Como gerenciador de consultas, quero receber alertas que identifiquem automaticamente conflitos de agendamento, Para evitar que pacientes tenham que ser reagendados devido a sobreposições.

+

Não seria melhor o sistema evitar uma marcagem +de consulta em cima de outra? Essa US mais parece critério de aceitação da US 1

+

US05 - Como recepcionista, eu quero ser capaz de registrar informações dos pacientes no sistema, para manter um registro organizado dos pacientes que visitam a Healthnet.

+

Critérios de aceitação ñ especificam quais informações são cadastradas

+

US09 - Como paciente, posso receber notificações de consultas próximas para tornar mais conveniente a comunicação com pacientes.

+

Não seria critéiro de aceitação da US 8?

+

US10 - Como paciente, posso visualizar o resultado de exames realizados para que possa me manter informado sobre minha saúde.

+

O 2º critério de aceitação se refere a exame ou +consulta? Porque são coisas diferentes

+

US11 - Como paciente, posso receber lembretes sobre medicamento prescritos para que possa me lembrar de tomá-los.

+

Não seria critério de aceitação da US 13???

+

US16 - Como médico, posso verificar alergias a medicamentos para evitar danos à saúde do paciente.

+

US relacionada verificar alergias a medicamentos, porém a maioria dos critérios estão relacionados +a criação de prescrição de medicamento.

+

US18 - Como médico, posso inserir observações sobre o paciente para acrescentar informações relevantes.

+

Essas observações sobre o paciente não são inseridas no prontuário médico?

+

US23 - Como farmacêutica Posso cadastrar prescrições através da digitalização Para agilizar e reduzir erros no cadastro destes documentos.

+

Gerar um json interfere na regra de negócio ?

+

US25 - Como farmacêutica Posso integrar o sistema com outras farmácias internas Para melhorar o compartilhamento de informações.

+

integrar o sistema com outras farmácias é um requisito de alto nível que deveria ser quebrado em várias histórias de usuário

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-03/4.criterios-revisao/index.html b/entregas/unidade-03/4.criterios-revisao/index.html new file mode 100644 index 0000000..ec916ce --- /dev/null +++ b/entregas/unidade-03/4.criterios-revisao/index.html @@ -0,0 +1,1544 @@ + + + + + + + + + + + + + + + + + + + + + + + Ver&Val Critérios de aceitação - Facção GBL - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ver&Val - Critérios de Aceitação

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
22/11/20230.1Criação do documentoArtur
+

Validação 1

+

Somente esse critério não é suficiente para compreender e validar essa US. +
+Faltaram critérios relacionados a:
- quais infos tem em uma consulta a ser agendada
- quando é possível ou não agendar uma consulta
- como deve ser feita o agendamento dessas consultas
+O critério apresentado precisa trazer informações de quais são os tipos de especialistas.

+

Validação 2

+

A história parece ser muito grande, acho que seria interessante quebrar em duas histórias: uma relacionada a acessar a lista de pacientes da clínica ou algo do tipo, e outra relacionada a acessar o histórico de um paciente.
+Pouquíssimos critérios de aceitação para a história
+Tem que ter critérios relacionados a como o gerenciador consegue:

+
    +
  • selecionar um paciente para visualizar o histórico dele
  • +
  • quais as infos exatas que serão mostradas nesse histórico
  • +
  • o que tem nesse resumo das consultas
  • +
+

Validação 3

+

Essas duas US seguem no mesmo modelo das outras duas apresentadas anteriormente

+

Validação 4

+

Que informações o paciente coloca para realizar a consulta?
+quais tipos de consulta ele pode especificar?
+Trocaria “visualizar a marcação” por ter uma confirmação que a consulta foi marcada

+

O critério 3 e 4 são bem legais, pois mostra quando é possível e não é possível realizar a ação.

+

Validação 5

+

Nos critérios 1 e 2 eu trocaria a visão para ser a do paciente, como:
+“O paciente deve ser capaz de selecionar se deseja receber notificações”
+“O paciente deve ser capaz de selecionar o tempo de antecedência para receber a notificação”

+

Validação 6

+

Mesma coisa da outra US, seria melhor ter a visão do ator da US do que do sistema.
+Não dá pra saber o que terá no resultado do exame, como por exemplo:
+tem a prescrição do médico? tem algum medicamento que deve ser tomado? tem algum exame a ser feito? é só a confirmação que a consulta foi feita?

+

Validação 7

+

Quais as regras para o paciente receber uma notificação?
+ele tem o poder de não querer receber o lembrete?
+como que esses lembretes são gerados? é a partir da prescrição do médico?

+

Validação 8

+

Quais informações têm no prontuário?
+O filtro por data em relação ao que?

+

Validação 9

+

Acho legal deixar claro que as infos do critério 2 está relacionado a cada medicamento do histórico
+Poderia ter um critério para dizer quais informações têm nesse histórico, podendo, por exemplo, quebrar o critério 1 em dois.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-03/5.bdd/index.html b/entregas/unidade-03/5.bdd/index.html new file mode 100644 index 0000000..e38ec0b --- /dev/null +++ b/entregas/unidade-03/5.bdd/index.html @@ -0,0 +1,2518 @@ + + + + + + + + + + + + + + + + + + + + + + + BDD - Facção GBL - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

BDD

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/11/20230.1Criação do documentoArtur e João
+

O Behavior Driven Developmente (BDD) é uma abordagem que enfoca o comportamento do software do ponto de vista do usuário final. Ele utiliza exemplos concretos e histórias de usuário descritos em uma linguagem compreensível por todos os membros da equipe. Esses exemplos, chamados de cenários, descrevem como o sistema deveria se comportar em situações específicas.

+

Avalliação das User Stories

+

US01) Como gerenciador de consultas, Posso ser capaz de agendar consultas com diferentes especialistas Para que eu possa ter uma visão unificada das agendas e escolher horários convenientes. Erro: Critério de aceitação se refere a outra persona

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Agendar consulta do cardiologista João em horário disponívelO usuário Rafael é um gerenciador de consulta cadastrado no sistema, o cardiologista João ao qual se deseja atribuir uma consulta seja um médico cadastrado no sistema e o dia e hora da consulta estejam disponíveis na agenda do cardiologistaO usuário solicitar o agendamento da reuniãoO sistema deve marcar a consulta na agenda do cardiologista
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Agendar consulta de cardiologista em horário indisponívelO usuário Rafael é um gerenciador de consulta cadastrado no sistema, o cardiologista João ao qual se atribuir uma consulta seja um médico cadastrado no sistema e o dia e hora da consulta não estejam disponíveis na agenda do cardiologistaO usuário solicitar o agendamento da reuniãoO sistema deve notificar o usuário que o horário e dia escolhidos não estão disponíveis para serem agendados
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Conflito de horáriosUm especialista tem dois compromissos marcados no mesmo horárioO gerenciador de consultas tenta agendar outro compromisso para o mesmo especialista no horário conflitanteO sistema impede a marcação, indicando que há um conflito de horários e sugere um horário alternativo
+

US02) Como gerenciador de consultas, quero ter a capacidade de acessar o histórico +completo de consultas de cada paciente, Para ter noção da frequência que o paciente +acessa o hospital.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Acessar o histórico de consultas de uma pacienteo usuário Rafael é um gerenciador de consulta cadastrado no sistema e o paciente Carlos está cadastrado no sistemaO usuário solicitar o histórico de consultas do pacienteO sistema deve exibir uma lista com todas as consultas do paciente Carlos, sendo exibido a data da consulta e o tipo de especialista que fez a consulta para diferenciar as consultas exibidas
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Visualização da frequência das consultas de um pacienteHá um paciente com múltiplas consultas registradas no sistema em diferentes períodoso gerenciador de consultas analisa o histórico desse pacienteo sistema calcula e exibe corretamente a frequência das consultas desse paciente ao longo do tempo, fornecendo estatísticas ou resumos que mostram a regularidade ou intervalos entre as visitas
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Histórico de consultas completo e organizadoum paciente tem um histórico extenso de consultas em diferentes departamentos ou especialidadeso gerenciador de consultas acessa o histórico do pacienteo sistema apresenta o histórico de consultas de forma organizada e categorizada por especialidade, facilitando a compreensão e a análise do histórico completo do paciente
+

US03) Como gerenciador de consultas, quero ter a capacidade de acessar um painel de +controle que exiba as agendas de todos os médicos, para não ter conflito de horário. Erro: Critérios de aceitação estão muitos específicos e a User Story também é muito específica e +o para não é a solução direta de visualizar as agendas de todos os médicos

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Visualizar as agendas de todos os médicosO usuário Rafael é um gerenciador de consulta cadastrado no sistemaO usuário solicitar as agendas de todos os médicos cadastradosO sistema deve exibir uma uma lista com todas as agendas, sendo exibido o nome do médico e sua especialidade para diferenciar as agendas exibidas
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Capacidade de filtrar agendas médicashá muitos médicos cadastrados no sistemaO gerenciador de consultas utiliza filtros no painel de controle das agendaso sistema permite filtrar as agendas por especialidade, data ou médico específico, para facilitar a visualização e a análise das agendas
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Exibição de disponibilidade geral dos médicoso painel de controle das agendas está acessívelo gerenciador de consultas verifica as agendas dos médicoso sistema apresenta a disponibilidade geral dos médicos, indicando os horários em que cada médico está disponível, sem revelar detalhes de compromissos individuais
+

US04) Como gerenciador de consultas, quero receber alertas que identifiquem +automaticamente conflitos de agendamento, Para evitar que pacientes tenham que ser +reagendados devido a sobreposições. +
+Não seria melhor o sistema evitar uma marcagem +de consulta em cima de outra? Essa US mais parece critério de aceitação da US 1

+

US05) Como recepcionista, eu quero ser capaz de registrar informações dos pacientes no +sistema, para manter um registro organizado dos pacientes que visitam a Healthnet. +Critérios de aceitação ñ especificam quais informações são cadastradas

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Registro de um paciente não cadastrado com os dados corretosO usuário Rafael é um gerenciador de consulta cadastrado no sistema e a paciente Roberta não esteja cadastrada no sistemaO usuário cadastrar os dados da paciente em um formulário e solicitar que o sistema salve os dados da nova pacienteO sistema deve notificar ao usuário que a operação foi realizada com sucesso
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Tentativa de registro de um paciente não cadastrado com o CPF inválidoO usuário Rafael é um gerenciador de consulta cadastrado no sistema e o paciente Cláudio não esteja cadastrada no sistema e forneça um CPF que não existe para cadastroO usuário cadastrar os dados da paciente em um formulário e solicitar que o sistema salve os dados do novo pacienteO sistema deve notificar ao usuário que a operação foi realizada com sucesso
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Tentativa de registro de um paciente previamente cadastradoO usuário Rafael é um gerenciador de consulta cadastrado no sistema e o paciente Afonso já esteja cadastrada no sistemaO usuário cadastrar os dados da paciente em um formulário e solicitar que o sistema salve os dados do pacienteO sistema deve notificar ao usuário que a operação não pode ser realizada pois já existe um registro desse paciente
+

US06) Como recepcionista, eu quero ser capaz de atualizar as informações dos pacientes no +sistema, para manter seus registros precisos e atualizados.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Atualização do endereço de um pacienteO usuário Rafael é um gerenciador de consulta cadastrado no sistema, a paciente Lorena já esteja cadastrada no sistema e a paciente percebeu que o endereço errado foi atribuído a elaO usuário fornecer o endereço certo ao sistema e solicitar que o sistema atualize os dados da pacienteO sistema deve notificar ao usuário que a operação foi realizada com sucesso
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Tentativa de atualização do CPF de um pacienteO usuário Rafael é um gerenciador de consulta cadastrado no sistema, o paciente Leonardo já esteja cadastrado no sistema e o paciente percebeu que o CPF foi atribuído a ele mas na hora de fornecer o CPF certo ele inverte os dois últimos dígitos de seu CPF (tornando o CPF inválido)O usuário fornecer o CPF supostamente certo ao sistema e solicitar que o sistema atualize os dados da pacienteO sistema deve notificar ao usuário que a operação não pode ser realizada com sucesso pois o CPF é inválido
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Registro de histórico de procedimentos médicos anterioreso recepcionista está atualizando o registro de um pacienteo recepcionista adiciona informações sobre procedimentos médicos anteriores do pacienteo sistema registra esses procedimentos no histórico do paciente de forma clara e organizada
+ + + + + + + + + + + + + + + + + +
Cenário 4Dado queQuandoEntão
Validação e confirmação das atualizaçõeso recepcionista atualiza as informações de um pacienteas alterações são finalizadas e salvas no sistemao sistema confirma a atualização bem-sucedida e exibe uma mensagem de confirmação, assegurando que as informações foram registradas corretamente
+

US07) Como recepcionista, eu quero ser capaz de solicitar o histórico do paciente no sistema, +para fornecer informações relevantes aos profissionais de saúde.

+ + + + + + + + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Solicitar histórico de paciente cadastradaA usuário-recepcionista Maria é uma recepcionista cadastrada no sistema e ela está atendendo a paciente Laura que acabou de chegar ao hospital para tratar uma gripe e é uma paciente cadastrada no sistemaA usuário Maria fornecer o CPF da paciente ao sistema na parte de busca de históricoO sistema deve exibir o histórico da paciente
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Tentativa de solicitar histórico de paciente não cadastradoA usuário-recepcionista Maria é uma recepcionista cadastrada no sistema e ela está atendendo o paciente Elias que acabou de chegar ao hospital para tratar uma virose e não está cadastrada no sistema, além de que ele não se lembre se já foi em outras unidades desse hospital ou nãoA usuário Maria fornecer o CPF da paciente ao sistema na parte de busca de históricoO sistema deve exibir uma notificação informando que o CPF não está cadastrado no sistema
+

US08) Como paciente, posso realizar o agendamento de consultas on-line para tornar mais +conveniente o processo de agendamento.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Agendar consulta em horário e dia livresO paciente Guilherme é um paciente cadastrado no sistema e ele deseja marcar uma consulta com um neurologistaO usuário encontrar na agenda do neurologista Sebastião um horário e dia vagos e agendar uma consulta nesse horário e diaO sistema deve exibir uma notificação informando que o agendamento foi feito com sucesso
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Tentativa de agendar consulta em horário e dia não livresO paciente Gabriel é um paciente cadastrado no sistema e ele deseja marcar uma consulta com a endocrinologista Márcia em uma horário e dia que não estão disponíveisO usuário encontrar na agenda da médica um horário e dia que não estão vagos e pedir ao sistema que agende uma consulta nesse horário e diaO sistema deve exibir uma notificação informando que a operação não foi realizada com sucesso pois o horário não está disponível
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Lembrete de consultaMiguel é um paciente cadastrado no sistema, ele marcou uma consulta com a endocrinologista Márcia no dia 13/11/2023 às 08:00 e ele informou ao sistema que deve receber um lembrete da consulta 1 dia antesFor 08:00 do dia 12/11/2023O sistema deve enviar ao usuário um lembrete da consulta
+

US09) Como paciente, posso receber notificações de consultas próximas para tornar mais +conveniente a comunicação com pacientes. +
+Erro: Não seria critéiro de aceitação da US 8?

+

US10) Como paciente, posso visualizar o resultado de exames realizados para que possa +me manter informado sobre minha saúde. +
+Erro: O 2º critério de aceitação se refere a exame ou +consulta? Porque são coisas diferentes

+

US11) Como paciente, posso receber lembretes sobre medicamento prescritos para que +possa me lembrar de tomá-los. +
+Não seria critério de aceitação da US 13???

+

US12) Como paciente, posso visualizar o meu histórico de prontuários para que eu possa +acompanhar minhas informações de saúde.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Visualizar prontuárioO paciente Rodrigo, que está cadastrado no sistema, deseja ver seu histórico de consultas onde não foram encontrados prontuariosEle solicitar ao sistema o prontuário médicoO sistema deve informar que não foram encontrados prontuários
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Visualizar prontuárioO paciente Rodrigo, que está cadastrado no sistema, deseja ver seu histórico de consultasEle solicitar ao sistema o prontuário médicoO sistema deve exibir todos suas consultas
+

US13) Como paciente, posso visualizar o meu histórico de medicamentos prescritos para +que eu posse manter controle dos meus medicamentos.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Visualizar histórico de medicamentosO paciente Rodrigo, que está cadastrado no sistema, deseja ver seu histórico de medicamentosEle solicitar ao sistema o seu histórico de medicamentosO sistema deve exibir todos os medicamentos do paciente, os que devem ser tomados atualmente e os que já tiveram que ser tomados
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Visualizar histórico de medicamentosO paciente Rodrigo, que está cadastrado no sistema, deseja ver seu histórico de medicamentos que não retorna resultadosEle solicitar ao sistema o seu histórico de medicamentosO sistema deve informar que não foram encontrados dados
+ + + + + + + + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Lembrete de medicamentoMiguel é um paciente cadastrado no sistema, o médico de Miguel determinou que ele tomasse um comprimido de 600 mg ibuprofeno a cada 8 horas por cinco dias e que Miguel registrou no sistema que começou a tomar o remédio 11:00For o horário determinado para Miguel tomar o remédioO sistema deve enviar ao usuário um lembrete de ingestão do medicamento
+

US14) Como médico, posso buscar informações do paciente para realizar um atendimento melhor.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Exibir prontuário do pacienteO médico, Dr. João, está autenticado no sistema e o sistema possui o prontuário do paciente Clara cadastradoO médico acessa a seção de prontuários do sistema e seleciona o Clara na lista de pacientes disponíveisO sistema deve apresentar detalhes do prontuário do Clara, incluindo informações pessoais, histórico médico, alergias e outras informações relevantes
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Exibir exames realizados pelo pacienteo médico, Dr. João, está autenticado no sistema e o sistema possui registros de exames realizados para o Clarao médico acessa a seção de prontuários do sistema e seleciona o Clara na lista de pacientes disponíveiso sistema deve apresentar uma lista de exames médicos realizados pelo Clara, incluindo resultados e datas de realização.
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Busca de paciente por nomeo médico possui acesso ao sistema de registros de pacienteso médico busca informações de um paciente por seu nomesistema permite que o médico insira o nome do paciente na barra de busca ou campo designado
+ + + + + + + + + + + + + + + + + +
Cenário 4Dado queQuandoEntão
Busca de paciente por CPFo médico possui acesso ao sistema de registros de pacienteso médico busca informações de um paciente por seu CPFo sistema permite que o médico insira o CPF do paciente na barra de busca ou campo designado
+

US15) Como médico, posso criar prescrições para receitar medicamentos para o paciente.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Criar prescrição médicao médico, Dr. João, está autenticado no sistema E o sistema possui informações sobre o paciente Clarao médico acessa a função de criação de prescrição e seleciona Maria Silva como o paciente atual e insere medicamentos específicos na prescrição, juntamente com as dosagens apropriadas e adiciona informações textuais relevantes sobre a prescriçãoo sistema deve armazenar a prescrição médica para a paciente Clara.
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Imprimir prescriçãoo médico, Dr. João, está autenticado no sistema e possui uma prescrição médica previamente criada para a paciente Clarao médico acessa a função de impressão de prescrição, seleciona a prescrição desejadao sistema deve permitir a impressão da prescrição médica para que possa ser entregue à paciente Clara.
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Armazenamento de Prescrição Médicao médico acessa o sistema de registros de pacientes para prescrever medicamentoso médico cria uma nova prescrição médica para um paciente específicoo sistema armazena a prescrição no perfil do paciente, registrando-a no banco de dados do sistema de registros médicos
+

US16) Como médico, posso verificar alergias a medicamentos para evitar danos à saúde do paciente. Erro: +US relacionada verificar alergias a medicamentos, porém a maioria dos critérios estão relacionados +a criação de prescrição de medicamento.

+

US17) Como médico, posso verificar interações medicamentosas para evitar efeitos adversos.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Verificar interações medicamentosas na prescrição médica:o médico, Dr. João, está autenticado no sistema E está na tela de criação de prescrição para a paciente Clarao médico adiciona medicamentos à prescrição e o sistema verifica se há interações medicamentosas entre os medicamentos na prescriçãoo sistema deve destacar os medicamentos que possuem interações medicamentosas.
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Impedir a criação da prescrição com interações medicamentosaso médico, Dr. João, está autenticado no sistema e está na tela de criação de prescrição para a paciente Clara e o sistema identifica interações medicamentosas entre os medicamentos na prescrição.o médico tenta finalizar a prescrição e a prescrição contém medicamentos com interações medicamentosaso sistema deve impedir a conclusão da prescrição e notificar o médico sobre as interações medicamentosas.
+

US18) Como médico, posso inserir observações sobre o paciente para acrescentar informações +relevantes. Erro: Essas observações sobre o paciente não são inseridas no prontuário médico?

+

US19) Como farmacêutica Posso buscar medicamentos cadastrados no sistema Para fazer verificações +e visualizar informações de forma clara.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Buscar medicamentos no sistemaa farmacêutica, Lívia, está autenticada no sistemaa farmacêutica digita um termo de pesquisa (com até 50 caracteres) na caixa de pesquisa e o sistema retorna os medicamentos que correspondem ao termo de pesquisa, sugerindo opções relevantes em tempo realos medicamentos encontrados devem ser exibidos em ordem alfabética para facilitar a visualização.
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Exibir mensagem de medicamento não encontradoa farmacêutica, Lívia, realizou uma busca por medicamentos no sistemao sistema não encontra medicamentos correspondentes ao termo de pesquisao sistema deve exibir uma mensagem informando à farmacêutica que nenhum medicamento foi encontrado.
+

US20) Como farmacêutica Posso verificar a relação entre um medicamento e possíveis alergias Para +garantir o bem estar de todos os pacientes.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Selecionar medicamento e prontuário para verificar alergiasa farmacêutica, Lívia, está autenticada no sistemaa farmacêutica acessa a funcionalidade de verificação de alergias e seleciona um medicamento cadastrado no sistema e seleciona o prontuário de um paciente ou inserir manualmente alergias que o paciente possuio sistema deve permitir a verificação da relação entre o medicamento e as alergias do paciente.
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Exibir mensagem de alergias e possíveis reaçõesa farmacêutica, Lívia, verificou a relação entre um medicamento e as alergias do pacienteo paciente possui alergia a algum componente no medicamentoo sistema deve exibir uma mensagem informando quais componentes o paciente possui alergia e quais as possíveis reações alérgicas que ele pode sofrer.
+

US21) Como farmacêutica Posso verificar as interações entre medicamentos Para garantir que +pacientes não usem medicamentos com formulações conflitantes.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Selecionar medicamento para verificar interaçõesa farmacêutica, Lívia, está autenticada no sistemaa farmacêutica acessa a funcionalidade de verificação de interações entre medicamentos e seleciona um medicamento cadastrado no sistemao sistema deve permitir a verificação das interações entre o medicamento selecionado e outros medicamentos.
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Exibir mensagem de ausência de medicamentos incompatíveisa farmacêutica, Lívia, verificou as interações entre um medicamento e outros medicamentos no sistemanão há medicamentos com formulações incompatíveiso sistema deve exibir uma mensagem informando que não há medicamentos incompatíveis.
+

US22) Como farmacêutica Posso verificar se um medicamento prescrito é o mesmo entregue ao +paciente Para garantir que os pacientes recebam a medicação correta.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Verificar correspondência entre medicamento prescrito e retirado do estoquea farmacêutica, Lívia, está autenticada no sistemaa farmacêutica recebe uma prescrição de medicamento e retira o medicamento correspondente do estoque e seleciona a opção de verificar correspondência entre o medicamento prescrito e o retirado do estoqueo sistema deve comparar se o medicamento retirado do estoque é o mesmo que foi prescrito.
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Exibir mensagem de não correspondênciaa farmacêutica, Lívia, verificou a correspondência entre o medicamento prescrito e o retirado do estoqueo medicamento retirado do estoque não corresponde ao prescritoo sistema deve exibir uma mensagem informando à farmacêutica que a medicação retirada não é a mesma prescrita.
+

US23) Como farmacêutica Posso cadastrar prescrições através da digitalização Para agilizar e reduzir +erros no cadastro destes documentos. Erro: Gerar um json interfere na regra de negócio ?

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Cadastrar prescrições por digitalizaçãoa farmacêutica, Lívia, está autenticada no sistemaa farmacêutica acessa a funcionalidade de cadastrar prescrições E escolhe a opção de cadastrar por digitalização e digitalizar a prescrição do pacienteo sistema deve processar a digitalização e cadastrar a prescrição no sistema
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Exibir mensagem de erro no cadastroa farmacêutica, Lívia, tentou cadastrar uma prescrição por digitalizaçãoocorre algum erro no processo de digitalização ou cadastroo sistema deve exibir uma mensagem informando à farmacêutica sobre o erro no cadastro da prescrição.
+

US24) Como farmacêutica Posso cadastrar prescrições manualmente Para manter o sistema atualizado +caso a digitalização falhe.

+ + + + + + + + + + + + + + + + + +
Cenário 1Dado queQuandoEntão
Cadastrar prescrições manualmentea farmacêutica, Lívia, está autenticada no sistemaa farmacêutica acessa a funcionalidade de cadastrar prescrições manualmente e preenche o campo de nome do medicamento (digitando "Dipirona") e preenche o campo de nome do médico (digitando "Maria Rocha Silva") e insere as demais informações necessárias da prescrição e conclui o processo de cadastroo sistema deve cadastrar a prescrição no sistema.
+ + + + + + + + + + + + + + + + + +
Cenário 2Dado queQuandoEntão
Cadastrar prescrições com mais de 50 caracteres no campo nome do medicamentoa farmacêutica, Lívia, está autenticada no sistemaa farmacêutica acessa a funcionalidade de cadastrar prescrições manualmente, preenche o campo de nome do medicamento (digitando "Cloridrato de N-metil-N(3-metil-1-oxobutil)-DL-aspartato de 2-aminoetanol"), preenche o campo de nome do médico (digitando "Maria da Silva") caracteres e conclui o processo de cadastroo sistema não deve permitir que a prescrição seja cadastrada e reportar uma mensagem de erro dizendo que o campo nome do medicamento deve ter no máximo 50 caracteres.
+ + + + + + + + + + + + + + + + + +
Cenário 3Dado queQuandoEntão
Cadastrar prescrições com mais de 50 caracteres no campos nome do médico e nome do medicamentoa farmacêutica, Lívia, está autenticada no sistemaa farmacêutica acessa a funcionalidade de cadastrar prescrições manualmente, preenche o campo de nome do medicamento (digitando "Ibuprofeno"), preenche o campo de nome do médico (digitando "Evangeline Beatrice Priscilla Alexandra Harrington-Smith.") caracteres e conclui o processo de cadastroo sistema não deve permitir que a prescrição seja cadastrada e reportar uma mensagem de erro dizendo que o campo nome do médico deve ter no máximo 50 caracteres.
+ + + + + + + + + + + + + + + + + +
Cenário 4Dado queQuandoEntão
Cadastrar prescrições com mais de 50 caracteres no campo nome do médicoa farmacêutica, Lívia, está autenticada no sistemaa farmacêutica acessa a funcionalidade de cadastrar prescrições manualmente, preenche o campo de nome do medicamento (digitando "Cloridrato de N-metil-N(3-metil-1-oxobutil)-DL-aspartato de 2-aminoetanol"), preenche o campo de nome do médico (digitando "Evangeline Beatrice Priscilla Alexandra Harrington-Smith.") e conclui o processo de cadastroo sistema não deve permitir que a prescrição seja cadastrada e reportar uma mensagem de erro dizendo que os campos nome do médico e nome do medicamento devem ter no máximo 50 caracteres.
+

US25) Como farmacêutica Posso integrar o sistema com outras farmácias internas Para melhorar o +compartilhamento de informações. Erro: integrar o sistema com outras farmácias é um requisito de alto nível que deveria ser quebrado em várias histórias de usuário

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-03/6.usm/index.html b/entregas/unidade-03/6.usm/index.html new file mode 100644 index 0000000..c37fa58 --- /dev/null +++ b/entregas/unidade-03/6.usm/index.html @@ -0,0 +1,1835 @@ + + + + + + + + + + + + + + + + + + + + + + + USM - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

User Story Mapping

+

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/11/20230.1Criação do documentoArtur, João e Victório
22/11/20230.2Atualização da USMVictório
+

+

Neste tópico será apresentado o User Story Mappping da ComunEventos.

+

O que é a ComunEventos?

+

A ComunEventos é uma empresa que possui como missão desenvolver uma plataforma online para otimizar a organização e promoção de eventos comunitários, permitindo que seus membros se reúnam em eventos que visem os interesses de ambos.

+

Problemas a serem resolvidos

+

O intuito da plataforma é resolver problemas organizacionais de eventos comunitários, sendo os principais:

+
    +
  • Utilização de múltiplas ferramentas, nem sempre projetadas para eventos, o que dificulta a organização e sobrecarrega os membros, que precisam criar e divulgar o evento e comunicar com os participantes.
  • +
  • Orçamento baixo para contratação de plataformas especializadas para eventos.
  • +
  • Falta de uma plataforma simplificada e unificada para a realização de todas as etapas da inscrição dos participantes em um único lugar.
  • +
  • Dificuldades no processo de colaboração com os membros que acontece de forma física ou por canais de comunicação, nem sempre padronizados, prejudicando os organizadores que nem sempre conseguem acessar todas as solicitações recebidas.
  • +
+

Benefícios

+

A implementação dessa plataforma acarreta em inúmeros benefícios, como:

+
    +
  • Integração das ferramentas utilizadas pela ComunEventos em uma única plataforma
  • +
  • Diminuição dos custos de contratação de plataformas de eventos, uma vez que elas serão dispensadas
  • +
  • Melhoria no engajamento com os participantes
  • +
  • Incentivo a colaboração local, com parcerias e voluntários, devido a facilitação do processo
  • +
  • Incentivo a realização de eventos que atendam as diversas necessidades
  • +
+

Para quem?

+

Os beneficiados por essa plataforma seriam:

+
    +
  • Organizadores
  • +
  • Participantes
  • +
  • Fornecedores locais
  • +
  • Patrocinadores
  • +
  • Voluntários
  • +
+

USM construído

+

Abaixo, está apresentado o USM proposto para a resolução do problema. As fotos em melhor qualidade podem ser acessadas clicando em USM - Parte 1 e USM - Parte 2

+

USM - Parte 1 +USM - Parte 2

+

As histórias de usuário extraídas do USM estão registradas na tabela a seguir:

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
USEnunciado
US01Eu, como Organizador, desejo cadastrar um evento para ter um registro dos eventos que eu organizo
US02Eu, como Organizador, desejo adicionar um organizador a um evento que os outros organizadores do evento possam participar da gerência desse evento pelo sistema
US03Eu, como Organizador, desejo criar lista de contato para um evento para registrar os possíveis contatos que podem ter interesse em ajudar o evento
US04Eu, como Organizador, desejo enviar e-mail de divulgação de um evento para lista de contatos para divulgar o evento aos que podem querer ajudá-lo
US05Eu, como Organizador, desejo cadastrar tarefa para um evento para ter um registro de todas as tarefas que precisam ser feitas antes e durante a realização do evento
US06Eu, como Organizador, desejo cadastrar sessão de treinamento para ter um registro das sessões de treinamento necessárias para realização de certas tarefas um evento
US07Eu, como Organizador, desejo associar uma sessão de treinamento a uma tarefa para categorizar cada sessão de treinamento pela tarefa que ela capacita o voluntário a realizar
US08Eu, como Organizador, desejo cadastrar fornecedor para ter um registro dos fornecedores de um evento que pode fornecer para meus eventos
US09Eu, como Organizador, desejo cadastrar patrocinador para ter um registro de um patrocinador que pode patrocinar meus eventos
US10Eu, como Organizador, desejo assinalar voluntário a um evento para distribuir de forma organizada as pessoas aprovadas para serem voluntários entre meus eventos
US11Eu, como Organizador, desejo assinalar fornecedor a um evento para fazer o registro de um fornecedor confirmado do meu evento
US12Eu, como Organizador, desejo assinalar patrocinador a um evento para fazer o registro de um patrocinador confirmado do meu evento
US13Eu, como Organizador, desejo enviar e-mail a patrocinador de um evento para conseguir enviar alinhamentos sobre o evento na mesma plataforma que gerencio o evento
US14Eu, como Organizador, desejo enviar e-mail a fornecedor de um evento para conseguir enviar alinhamentos sobre o evento na mesma plataforma que gerencio o evento
US15Eu, como Organizador, desejo enviar mensagem a voluntário para fazer alinhamentos específicos com um certo voluntário
US16Eu, como Organizador, desejo enviar uma mensagem para todos os voluntários de um evento para fazer comunicados gerais para todos os voluntários de um evento facilmente
US17Eu, como Organizador, desejo enviar mensagem a participante para fazer alinhamentos específicos com um certo participante
US18Eu, como Organizador, desejo enviar uma mensagem para todos os participantes de um evento para fazer comunicados gerais para todos os participantes de um evento facilmente
US19Eu, como Organizador, desejo visualizar lista de pessoas inscritas como participantes de um evento para monitorar a quantidade de participantes inscritos de um evento
US20Eu, como Organizador, desejo visualizar lista de pessoas inscritas para concorrer a vaga de voluntário de um evento para monitorar a quantidade de pessoas com interesse em se voluntariar a um evento
US21Eu, como Participante-Voluntário, desejo visualizar lista com os próximos eventos para verificar se existe algum evento que eu tenha interesse de participar como Participante ou Voluntário
US22Eu, como Participante-Voluntário, desejo visualizar detalhes de um evento para ter acesso a mais detalhes de um evento pelo qual eu tenho interesse
US23Eu, como Participante-Voluntário, desejo enviar mensagem para o organizador do evento para tirar dúvidas sobre o evento
US24Eu, como Participante-Voluntário-Organizador, desejo compartilhar post do evento nas redes sociais para divulgar o evento ou compartilhar minha experiência no evento
US25Eu, como Organizador, desejo registrar um investimento em um evento para monitorar a entrada de dinheiro no evento
US26Eu, como Organizador, desejo registrar uma despesa de um evento para monitorar os gastos do evento
US27Eu, como Organizador, desejo visualizar fluxo de caixa de um evento para monitorar a situação financeira do meu evento
US28Eu, como Organizador, desejo visualizar resultados dos formulários de feedbacks dos participantes para conseguir visualizar o nível de satisfação dos participantes com o evento e ver o que pode melhorar
US29Eu, como Organizador, desejo visualizar quantidade de dinheiro arrecado das inscrições dos participantes que foram pagas para monitorar o dinheiro arrecadado com as inscrições de participantes
US30Eu, como Participante, desejo pagar inscrição em de um evento para confirmar minha inscrição nos eventos que exigem pagamentos
US31Eu, como Participante, desejo preencher formulário de feedback para poder informar diretamente aos organizadores do evento meus elogios e críticas ao evento
US32Eu, como Voluntário, desejo visualizar as tarefas disponíveis no evento para poder escolher qual delas eu desejo realizar
US33Eu, como Voluntário, desejo escolher uma tarefas disponível no evento para que eu possa assumir a responsabilidade por uma tarefa que quero realizar antes ou durante o evento
US34Eu, como Voluntário, desejo visualizar os horários de treinamento para que possa planejar meu tempo de acordo com os treinos que devo realizar para me capacitar para uma tarefa
US35Eu, como Voluntário, desejo baixar certificado de treinamento para que eu possa ter um certificado da minha capacitação para determinada tarefa
US36Eu, como Participante-Voluntário, desejo filtrar lista dos próximos eventos para que eu possa encontrar eventos que me interessam facilmente
US37Eu, como Participante-Voluntário, desejo preencher formulário de inscrição de um evento para que possa comprar um ingresso para um evento que desejo ser participante ou fornecer informações para os organizadores avaliarem se vão me chamar para um evento que desejo me voluntariar
+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-03/7.dor_dod/index.html b/entregas/unidade-03/7.dor_dod/index.html new file mode 100644 index 0000000..52bdf61 --- /dev/null +++ b/entregas/unidade-03/7.dor_dod/index.html @@ -0,0 +1,1530 @@ + + + + + + + + + + + + + + + + + + + + + + + Ver&Val DoR & DoD - Facção GBL - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ver&Val DoR & DoD - Facção GBL

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
22/11/20230.1Criação do documentoVictório
+

DoR & DoD - Facção GBL

+

Definition Of Ready (DoR)

+

Verificação:

+
    +
  • Ter mais verificações a respeito das histórias e menos sobre os requisitos, pois o DoR vai ser aplicado principalmente a nível de US.
  • +
  • As US devem ser verificadas se estão declaradas de forma correta (pode ser utilizada alguma técnica, como o INVEST ou DEEP)
  • +
  • Quem possui critérios de aceite são as histórias, acho que é interessante deixar isso claro
  • +
+

Validação:

+
    +
  • É interessante ter uma validação mais objetiva dos requisitos em relação ao prazo e entendimento da equipe
  • +
  • Quais são os critérios de priorização?
  • +
  • Os critérios de aceite também devem ser validados com o cliente
  • +
+

Definition Of Done (DoD)

+

Verificação:

+
    +
  • Tudo em conformidade
  • +
+

Validação:

+
    +
  • Como avaliar que é um incremento tangível para o produto? Acho que pode ser mais objetivo
  • +
+

Conclusão

+

Dada as considerações, o critérios para o DoR e DoD foram feitos de maneira correta.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-04/1.entrega-unidade4/index.html b/entregas/unidade-04/1.entrega-unidade4/index.html new file mode 100644 index 0000000..7ac8fda --- /dev/null +++ b/entregas/unidade-04/1.entrega-unidade4/index.html @@ -0,0 +1,1564 @@ + + + + + + + + + + + + + + + + + + + + + + + Apresentação e Validação do Cliente - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Apresentação Final

+ +

Vídeo de Apresentação

+

A entrega da Unidade 4 está presente no vídeo abaixo, mas também pode ser acessada aqui.

+

+ +

+

Reunião de Validação com o Cliente

+

A reunião de validação com o cliente está presente no vídeo abaixo, mas também pode ser acessada aqui.

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-04/2.especificacao-caso-de-uso/index.html b/entregas/unidade-04/2.especificacao-caso-de-uso/index.html new file mode 100644 index 0000000..a66d99d --- /dev/null +++ b/entregas/unidade-04/2.especificacao-caso-de-uso/index.html @@ -0,0 +1,2319 @@ + + + + + + + + + + + + + + + + + + + + + + + Especificação de Casos de Uso - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Introdução

+

O Processo Unificado emprega casos de uso como uma maneira de declarar e especificar requisitos. Nesse contexto, é importante destacar que, antes de detalhar os casos de uso, foi essencial realizar a elicitação dos requisitos que seriam posteriormente declarados. Esse processo inicial de levantamento de requisitos desempenha um papel fundamental na construção de uma base sólida para a especificação detalhada dos casos de uso no decorrer do desenvolvimento.

+ + +

Casos de Uso

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CDUObjetivoRequisito funcionalCaso de UsoResultado Observável
CDU-01Visualizar conteúdo digital de viagemVisualizar conteúdo digital de viagemVisualizar conteúdo digital de viagemartigos, fotografias e vídeos sobre a viagem
CDU-02Pesquisar destinoPesquisar destinoPesquisar destinoinformações do destino pesquisado
CDU-03Visualizar informações detalhadas de destinoVisualizar informações detalhadas de destinoVisualizar informações detalhadas de destinomelhores períodos para visitar, atrações culturais, culinária local, e dicas de viagem para um destino
CDU-04Buscar acomodação de destinoBuscar acomodação de destinoBuscar acomodação de destinoDeletar despesas
CDU-05Visualizar conteúdos da acomodaçãoVisualizar conteúdos da acomodaçãoVisualizar conteúdos da acomodaçãofotos, descrições detalhadas e avaliações de outros usuários da acomodação
CDU-06Verificar disponibilidade de acomodaçãoVerificar disponibilidade de acomodaçãoVerificar disponibilidade de acomodaçãodias disponíveis para reserva da acomodação
CDU-07Reservar acomodaçãoReservar acomodaçãoReservar acomodaçãocomprovante de reserva de acomodação
CDU-08Contactar acomodaçãoContactar acomodaçãoContactar acomodaçãoresposta do anfitrião/hotel com informações sobre a acomodação
CDU-09Pesquisar atividades locais em destinosPesquisar atividades locais em destinosPesquisar atividades locais em destinosPesquisar atividades locais em destinos
CDU-10Verificar disponibilidade de atividade localVerificar disponibilidade de atividade localVerificar disponibilidade de atividade localdias e vagas disponíveis para realizar a atividade local
CDU-11Reservar atividade localReservar atividade localReservar atividade localcomprovante de reserva de atividade local
CDU-12Pagar reserva de atividade localPagar reserva de atividade localPagar reserva de atividade localcomprovante de pagamento de reserva de atividade local
CDU-13Organizar itinerárioAdicionar plano de viagem, excluir plano de viagem, acessar itinerário e receber aviso de alteração no itinerárioAdicionar plano de viagem, excluir plano de viagem, acessar itinerário e receber aviso de alteração no itinerárioRegistro de novo plano de viagem, Exclusão de um plano de viagem e notificação de sucesso da operação, Voos, aluguéis de carro e outros planos de uma viagem e Mensagem notificando uma mudança no itinerário devido a mudanças de horário de voo ou mudanças climáticas
CDU-14Visualizar informações de contatos de emergênciaVisualizar informações de contatos de emergênciaVisualizar informações de contatos de emergênciaLista de contatos de emergência
CDU-15Receber recomendações de locaisReceber recomendações de locaisReceber recomendações de locaisLista de restaurantes, pontos turísticos e eventos na localização atual do usuário
CDU-16Ter acesso a mapaTer acesso a mapaTer acesso a mapaMapa indicando localização do usuário e locais próximos
CDU-17Receber sugestões de atividades próximasReceber sugestões de atividades próximasReceber sugestões de atividades próximasMensagem avisando de eventos ocorrendo próximos ao usuário
CDU-18Avaliar acomodações e atividadesAvaliar acomodações e atividadesAvaliar acomodações e atividadesRegistro da avaliação com ou sem comentário do viajante
CDU-19Receber recomendações de destinos e ofertasReceber recomendações de destinos e ofertasReceber recomendações de destinos e ofertasMensagem sugerindo destinos condizentes com o perfil do usuário ou de uma oferta de uma viagem
CDU-20Cadastrar acomodaçãoCadastrar acomodaçãoCadastrar acomodaçãoRegistro de fotos e informações detalhadas da acomodação
CDU-21Visualizar avaliação da acomodaçãoVisualizar avaliação da acomodaçãoVisualizar avaliação da acomodaçãoAvaliação e comentários da acomodação de acordo com os clientes
CDU-22Responder viajantesResponder viajantesResponder viajantesEnvio de mensagem a um viajante
CDU-23Visualizar itinerário de reservas da acomodaçãoVisualizar itinerário de reservas da acomodaçãoVisualizar itinerário de reservas da acomodaçãoItinerário com os dias e horários lotados e disponíveis dos quartos
CDU-24Receber notificações de reservas da acomodaçãoReceber notificações de reservas da acomodaçãoReceber notificações de reservas da acomodaçãoMensagem notificando uma reservas na acomodação e o registro da reserva no itinerário de disponibilidade dos quartos
CDU-25Cadastrar atividadeCadastrar atividadeCadastrar atividadeRegistro de fotos e informações detalhadas da atividade
CDU-26Visualizar avaliação da atividadeVisualizar avaliação da atividadeVisualizar avaliação da atividadeAvaliação e comentários da atividade de acordo com os clientes
CDU-27Responder viajantesResponder viajantesResponder viajantesEnvio de mensagem a um viajante
CDU-28Visualizar itinerário de reservas da atividadeVisualizar itinerário de reservas da atividadeVisualizar itinerário de reservas da atividadeItinerário com os dias e horários lotados e disponíveis das atividades
CDU-29Receber notificações de reservas da atividadeReceber notificações de reservas da atividadeReceber notificações de reservas da atividadeMensagem notificando uma reserva na atividade e o registro da reserva no itinerário de disponibilidade das vagas da atividade
CDU-30Receber notificação de pagamento de uma atividadeReceber notificação de pagamento de uma atividadeReceber notificação de pagamento de uma atividadeMensagem notificando um pagamento de uma vaga de uma atividade e mudança do status do pagamento de um cliente na lista de clientes com reserva para uma vaga em uma atividade
+

Especificação dos Casos de Uso

+

CDU-01 Visualizar conteúdo digital da viagem

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Número do Caso de UsoCDU-01
Nome do Caso de UsoGerenciar cadastro de Usuário
Versão1.0
Data de Criação20/11/2023
ResponsávelJuan Pablo e João Lucas
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Breve DescriçãoEste caso de uso permite que um usuário visualize o conteúdo digital associado a uma viagem registrada no sistema.
Fluxo Básico de Eventos
PassoDescrição
2.1O usuário acessa a seção de viagens ou conteúdo digital no sistema.
2.2O sistema lista as viagens disponíveis para o usuário.
2.3O usuário seleciona a viagem desejada para visualizar o conteúdo digital associado.
2.4O sistema exibe o conteúdo digital específico da viagem selecionada (fotos, vídeos, notas, etc.).
Área de Funcionalidade: Cadastro de Usuário
A1 Primeiro Fluxo AlternativoSe não houver nenhuma viagem disponível para o usuário, o sistema exibe uma mensagem indicando a falta de viagens registradas.
A2 Segundo Fluxo AlternativoSe a viagem selecionada não possuir conteúdo digital associado, o sistema informa que não há conteúdo disponível para essa viagem.
Fluxos de Exceção
NúmeroDescrição
4.1FE1 - Se ocorrer um erro ao tentar acessar o conteúdo digital da viagem, o sistema exibe uma mensagem de erro e sugere ao usuário tentar novamente mais tarde.
Pré-Condições
NúmeroDescrição
5.1O usuário está autenticado no sistema.
5.2Existe pelo menos uma viagem registrada para o usuário.
Pós-Condições
NúmeroDescrição
6.1O usuário visualizou o conteúdo digital da viagem selecionada.
Pontos de Extensão
NúmeroDescrição
7.1Não há pontos de extensão definidos para este caso de uso.
Requisitos Especiais
NúmeroDescrição
8.1O sistema deve garantir a privacidade e segurança do conteúdo digital acessado, limitando o acesso apenas ao usuário autorizado.
Informações Adicionais
---
Nenhuma informação adicional fornecida.
+

CDU-02 Gerenciar login de Usuário

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Número do Caso de UsoCDU-02
Nome do Caso de UsoGerenciar login de Usuário
Versão1.0
Data de Criação20/11/2023
ResponsávelJuan Pablo e João Lucas
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Breve DescriçãoEste caso de uso permite que um usuário faça login no sistema.
Fluxo Básico de Eventos
PassoDescrição
2.1O usuário escolhe a opção de fazer login (RF2).
2.2O sistema solicita as credenciais do usuário.
2.3O usuário fornece as credenciais.
2.4O sistema valida as credenciais.
2.5O sistema autentica o usuário e o direciona para a área logada.
Fluxos Alternativos
Área de Funcionalidade: Login de Usuário
A1 Primeiro Fluxo AlternativoA1: Se o usuário não tiver uma conta no sistema: - O sistema não autentica o usuário. - O sistema exibe uma mensagem informando que o usuário não possui uma conta no sistema. - O usuário pode escolher criar uma nova conta.
Fluxos de Exceção
NúmeroDescrição
4.1FE1 - Se houver falha na autenticação durante o login, o sistema notifica o usuário e oferece opções para recuperação de senha.
Pré-Condições
NúmeroDescrição
5.1O sistema está operacional.
Pós-Condições
NúmeroDescrição
6.1O usuário está autenticado no sistema.
Pontos de Extensão
NúmeroDescrição
7.1Não há pontos de extensão definidos para este caso de uso.
Requisitos Especiais
NúmeroDescrição
8.1O sistema deve garantir a segurança das informações do usuário durante o login.
Informações Adicionais
---Nenhuma informação adicional fornecida.
+

CDU-03 Gerenciar Cadastro de Conta Bancária

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Número do Caso de UsoCDU-03
Nome do Caso de UsoGerenciar Cadastro de Conta Bancária
Versão1.0
Data de Criação20/11/2023
ResponsávelJuan Pablo e João Lucas
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Breve DescriçãoEste caso de uso permite que um usuário cadastre até três contas bancárias associadas ao seu perfil.
Fluxo Básico de Eventos
PassoDescrição
2.1O usuário escolhe a opção de cadastrar conta bancária (RF3).
2.2O sistema solicita as informações da conta bancária.
2.3O usuário fornece os dados necessários.
2.4O sistema valida as informações e associa a conta bancária ao usuário.
Fluxos Alternativos
Área de Funcionalidade: Cadastro de Conta Bancária
A1 Primeiro Fluxo AlternativoA1.1 Um Subfluxo Alternativo
A2 Segundo Fluxo Alternativo- A2: Se o usuário tentar cadastrar uma conta bancária de um banco que não é suportado pelo sistema: - O sistema não permite o cadastro da conta bancária. - O sistema exibe uma mensagem informando que o banco não é suportado pelo sistema.
Fluxos de Exceção
NúmeroDescrição
4.1FE1 - Se houver falha na validação das informações do cadastro, o sistema notifica o usuário sobre os campos inválidos.
Pré-Condições
NúmeroDescrição
5.1O sistema está operacional.
Pós-Condições
NúmeroDescrição
6.1As informações do cadastro e as contas bancárias associadas foram registradas no sistema.
Pontos de Extensão
NúmeroDescrição
7.1Não há pontos de extensão definidos para este caso de uso.
Requisitos Especiais
NúmeroDescrição
8.1O sistema deve garantir a segurança das informações do usuário durante o cadastro.
Informações Adicionais
---Nenhuma informação adicional fornecida.
+

Histórico de versão

+ + + + + + + + + + + + + + + + + +
VersãoAutorDescriçãoData
1.0João BarretoCriação Inicial do Documento11/12/2023
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/entregas/unidade-04/3.ver&valUCs/index.html b/entregas/unidade-04/3.ver&valUCs/index.html new file mode 100644 index 0000000..ee1e792 --- /dev/null +++ b/entregas/unidade-04/3.ver&valUCs/index.html @@ -0,0 +1,1562 @@ + + + + + + + + + + + + + + + + + + + + + Ver & Val do Diagrama dos Casos de Uso do Grupo GBL - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ver&Val - Critérios de Aceitação

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
11/12/20230.1Criação do documentoVictório
+

O Diagrama de Casos de Uso feito pela facção GBL encontra-se clicando aqui

+

Validação

+
    +
  • Restaurante tem somente um caso de uso bem estabelecido e acredito que não precisaria desse ator dentro da aplicação, pois não foi comentado nada sobre a necessidade de abranger os restaurantes dos destinos turísticos
  • +
  • Empresa Aérea tem casos de uso que não são objetivos do ator dentro da aplicação, como: alugar carros e oferecer recomendações. Além disso, não foi comentado no texto a necessidade de uma empresa aérea se cadastrar no sistema
  • +
  • Guia Turístico não tem o objetivo de filtra
  • +
+

Verificação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PerguntaChecklistObs
Todos os atores são nomeados?Sim
Os atores estão representados como bonecos?Sim
Os casos de uso estão representados como elipses?Sim
A estrutura de escrita dos UC estão descritos adequadamente? (Verbo + objeto)Sim
Foram organizados hierarquicamente?Sim
Todos os atores possuem objetivos?Sim
Os casos de uso representam um valor de negócio definido?Sim
Os casos de uso possuem um retorno observávelSim
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/gamificacao/index.html b/gamificacao/index.html new file mode 100644 index 0000000..87d73ea --- /dev/null +++ b/gamificacao/index.html @@ -0,0 +1,1670 @@ + + + + + + + + + + + + + + + + + + + + + + + Gamificação - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
08/11/20230.1Criação do documentoVictório
+

+

Facção "Guardiões da Galáxia"

+

+

Escudo da Facção

+

+

Membros

+
    +
  • Cowboy Intergaláctico (João)
  • +
  • Defensor Cósmico (Artur)
  • +
  • Helios Nebularis (Weslley)
  • +
  • Lu’lu (Luciano)
  • +
  • Markus (Pablo)
  • +
  • Victrum Lazariano (Victório)
  • +
+

História dos Membros

+
    +
  1. Cowboy Intergalático
  2. +
+

Meu nome é João Barreto, mais conhecido como Cowboy Intergalático, e eu sou um dos membros mais leais da facção intergaláctica Guardiões da Galáxia. Desde que me juntei a esse grupo, tenho dedicado minha vida para proteger a galáxia de ameaças que poucos ousam enfrentar. Com um estilo de vida que mistura adrenalina e harmonia.

+

Sou uma pessoa única nesse universo, diferente de tudo e diferente de todos, apaixonado por carros. Sou um aficionado por eles. Seja pilotando uma nave de alta velocidade ou dirigindo um veículo terrestre em um planeta distante, estou sempre no comando das máquinas mais impressionantes que posso encontrar. Mas não é só a velocidade que me move, também é a música. E o meu estilo musical favorito? Sertanejo, sem dúvidas. Não importa onde esteja, sempre tenho um violão ou algum dispositivo que toque as melhores músicas sertanejas.

+

Minha combinação de paixões pode parecer estranha para alguns, mas é isso que me faz ser quem sou e que me encoraja a entrar nessa jornada perigosa.

+
    +
  1. Defensor Cósmico
  2. +
+

Me chamo Artur, um alienígena de um planeta distante, sou mais conhecido como Defensor Cósmico, um dos Guardiões da Galáxia. Eu sempre fui apaixonado por futebol e música, mas minha vida mudou para sempre quando meu planeta foi atacado por uma facção de alienígenas cruéis, Slitherium. Eu fui o único sobrevivente, e fui forçado a fugir para o espaço.

+

Após perder tudo, encontrei os Guardiões da Galáxia, que me acolheram e me ensinaram a usar meus poderes para proteger a galáxia. Hoje, sou um Guardião orgulhoso, determinado a lutar por justiça e igualdade para todos os seres vivos.

+

Ainda tenho tempo para aproveitar meus hobbies, pois eles me ajudam a relaxar e a me sentir feliz. Afinal, essas são as coisas que me tornam quem eu sou.

+
    +
  1. Helios Nebularis
  2. +
+

Helios Nebularis é um Guardião destemido e ambicioso na galáxia caótica de Calamum Caeruleum. Ele se destaca dos outros Guardiões por afirmar que tinha vivido em um multiverso chamado 2023.1, embora suas memórias fossem fragmentadas. Helios compartilhava suas experiências desse multiverso, inspirando outros Guardiões com suas visões de tecnologia avançada e desafios semelhantes aos que enfrentavam.

+

Sua ambição o impulsiona a encontrar formas inovadoras de proteger raças em risco de extinção e restaurar a ordem em planetas devastados pela ganância corporativa. Helios usava sua suposta conexão com o multiverso para desenvolver estratégias únicas e abordagens fora do comum.

+
    +
  1. Lu’lu
  2. +
+

Eu sou Lu'lu, e minha história começa em um lugar distante da galáxia. Quando eu era apenas um jovem alienígena, fazia parte de uma civilização antiga e religiosa, dedicada a ajudar os necessitados e praticar o bem. Mas um dia, a escuridão da ganância corporativa recaiu sobre nós. O Grupo Spark Tech, sob a fachada de inovação tecnológica, destruiu nossa civilização em busca de segredos ancestrais. Eu fui o único sobrevivente, uma pequena luz de esperança em meio à escuridão que eles trouxeram. Mas minha força de vontade e minha crença inabalável no bem me guiaram para um novo propósito.

+

Foi assim que eu encontrei os Guardiões da Galáxia, um grupo de pessoas com o mesmo desejo ardente de trazer paz e bondade para nossa galáxia. Juntos, juramos lutar contra as forças da ganância e da exploração desenfreada. Estamos determinados a enfrentar o Grupo Spark Tech e outras corporações gananciosas que ameaçam a harmonia da galáxia. Afinal, não importa o quão sombrio o cenário possa parecer, sempre haverá espaço para a luz e o bem prevalecerem. E eu estou aqui para garantir que isso aconteça."

+
    +
  1. Markus
  2. +
+

Markus viveu em um planeta devastado por uma corporação gananciosa(apache). Ele perdeu sua família e sua comunidade na destruição. Ele se refugiou nos estudos e na pesquisa, aprendendo sobre as civilizações antigas e a ecologia dos planetas. +Sendo um intelectual e pesquisador habilidoso. Ele sabe muito sobre os estragos das corporações e como proteger a natureza e as comunidades vulneráveis. Ele é um estrategista e planejador excelente. Ele fornece análises e informações cruciais para as missões dos Guardiões. +Markus quer proteger o que é precioso em sua galáxia. Ele acredita que seu conhecimento é uma arma poderosa contra as corporações. Ele também quer superar sua timidez e se tornar uma voz mais forte na luta pela justiça.

+
    +
  1. Victrum Lazariano
  2. +
+

Victrum Lazariano nasceu no planeta deserto Capivarian-3 (rico em recursos minerais). Seu povo foi escravizado pela Slitherium e foram forçados a trabalhar nas minas. Uma operação massiva de mineração culminou em uma catástrofe que contaminou irreparavelmente o ambiente de Capivarian-3.

+

Conseguiu fugir em uma nave da Slitherium, só que não conseguiu salvar sua família. Por anos, estudou táticas de guerrilha, aprendeu a pilotar naves espaciais e dominou a arte da diplomacia. Se juntou à facção dos Guardiões da Galáxia, que compartilhava seu objetivo de justiça e proteção dos vulneráveis na galáxia Calamum Caeruleum.

+

Jornada dos Guardiões da Galáxia

+

No coração da galáxia Calamum Caeruleum, onde a ganância das corporações e o caos imperavam, os destinos de seis indivíduos destemidos se cruzaram. Conhecidos como os Guardiões da Galáxia, eles eram uma facção comprometida com a justiça e a solidariedade. Defensor Cósmico, Cowboy Intergaláctico, Lu'lu, Victrum Lazariano, Helios Nebularis e Markus cada um com suas habilidades únicas e motivações pessoais, foram reunidos pelo Comandante Estelar Marsicano para formar uma coalizão contra as forças da tirania corporativa. Unidos por um propósito nobre, eles estavam prontos para enfrentar a batalha que definiria o destino da galáxia, promovendo a esperança onde antes só havia desespero.

+

Conclusão

+

Os Guardiões da Galáxia são uma facção composta por vários sobreviventes das ações tirânicas do conglomerado e por isso os membros sabem o perigo da ganância do conglomerado.

+

A facção se compromete à:

+
    +
  • Lutar contra a tirania corporativa
  • +
  • Instaurar a ordem na galáxia por meio da solidariedade e justiça.
  • +
  • Acatar ao Comando Estelar e ao Comandante Estelar Marsicano
  • +
  • Promover a esperança
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..90af66e --- /dev/null +++ b/index.html @@ -0,0 +1,1616 @@ + + + + + + + + + + + + + + + + + + + + + Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Beach Tennis CoordiMate

+

Sobre

+

+O Beach Tennis CoordiMate é uma aplicação versátil projetada para atender às necessidades específicas de empresas que oferecem aulas de Beach Tennis e alugam suas quadras para uso externo. Esta ferramenta aborda eficazmente desafios comuns, como o planejamento de drills, o controle de presença dos alunos e o gerenciamento do "day-use". Com o Beach Tennis CoordiMate, você pode simplificar esses processos, melhorar a eficiência operacional e proporcionar uma experiência mais fluida para seus alunos e clientes externos. +

+ +

Equipe

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FotoNomeGitHubE-mail
Artur RodriguesArtur RodriguesArtur Rodriguesartur190503@outlook.com
Joao BarretoJoao BarretoJoão Barreto211039519@aluno.unb.br
Luciano FreitasLuciano FreitasLuciano Freitasluciano.melo@unb.br
Pablo SantosPablo SantosPablo Santospablo.costa@aluno.unb.br
Victorio LazaroVictório LázaroVictorio Lazarovictorio.lazaro15@gmail.com
Weslley BarrosWeslley BarrosWeslley Barrosweslley17w@gmail.com
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/mvp/index.html b/mvp/index.html new file mode 100644 index 0000000..3c1b9c2 --- /dev/null +++ b/mvp/index.html @@ -0,0 +1,2537 @@ + + + + + + + + + + + + + + + + + + + + + + + MPV - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

MPV

+ +

Histórico de Revisão

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
25/10/20230.1Criação do documentoArtur, João, Luciano, Pablo, Victório e Weslley
07/11/20230.2Adição de pontuação das US'sVictório
08/11/20230.3Reordenamento das US'S do MVP pelas pontuações mais altasVictório
11/11/20230.4Exclusão da US 59 para resolver duplicação das US's 57 e 59Victório
+

+

Alinhamento do MPV aos objetivos do projeto

+

+ + + + + + + + + + + + + +
ObjetivosFuncionalidades relacionadas
Padronizar e melhorar a comunicação de planos de aulas entre coordenadores e professores, reduzindo conflitos e atrasosF1 (Gerenciamento de usuário-coordenador) e F8 (Gerenciamento de plano de aula)
+

+

Dado os objetivos do projeto estabelecidos no documento de visão do produto, é possível visualizar como o MPV se alinha a esses objetivos:

+
    +
  • As funcionalidades F1 e F8 estão diretamente relacionadas ao objetivo de planejamento das aulas de beach tennis, que buscam resolver o problema da falta de uma ferramenta para criação dos drills e padronização dos planos de aulas.
  • +
+

Mínimo Produto Viável

+

A metodologia utilizada para a escolha do nosso MPV foi a Matriz de Priorização. Essa técnica permite classificar os requisitos do produto com base em critérios específicos. Na matriz apresentada, foram utilizadas três dimensões para avaliar cada Feature: a perspectiva de negócios, o entendimento técnico e as dependências.

+

Na dimensão de perspectiva de negócio foi utilizada a técnica MoSCoW, em que as histórias de usuário foram divididas em 4 quadrantes, que são MUST, SHOULD, COULD e WON'T.

+

O entendimento técnico foi a avaliação da visão da equipe da facilidade de implementação da história de usuário e da capacidade da equipe para o desenvolvimento da mesma. Para isso, foi utilizado 3 classificações que estão relacionadas ao nível de entendimento e pode ser BAIXO, MEDIANO e ALTO.

+

Pontuações

+

Perspectiva de Negócio

+
    +
  • MUST: maior valor e devem fazer parte da solução (Valor 4)
  • +
  • SHOULD: tem valor e podem fazer parte da solução (Valor 3)
  • +
  • COULD: tem algum valor e seriam desejáveis para o produto (Valor 2)
  • +
  • WON'T: pouco valor e que não serão desenvolvidos no momento (Valor 1)
  • +
+

Entendimento Técnico:

+
    +
  • BAIXO: A equipe tem baixo entendimento ténicnico sobre a feature. (Valor 1)
  • +
  • MEDIANO: A equipe tem entendimento técnico médio. Podem haver algumas questões desconhecidas ou de difícil entendimento. (Valor 2)
  • +
  • ALTO: A equipe possui alto entendimento técnico sobre a feature. (Valor 3)
  • +
+

Abaixo, seguem as User Stories e sua descrição:

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FuncionalidadeUSDescrição
F1US01Eu, como usuário-coordenador, desejo criar minha conta para administrar a arena
F1US02Eu, como usuário-coordenador, desejo fazer login na minha conta para acessar as funcionalidades exclusivas de coordenador
F2US03Eu, como usuário-coordenador, desejo criar a conta de um professor para poder administrar os professores da arena
F2US04Eu, como usuário-professor, desejo fazer login na minha conta para me ajudar a realizar meu trabalho de ensino
F2US05Eu, como usuário-coordenador, desejo desativar a conta de um professor para professores que saírem da arena
F2US06Eu, como usuário-coordenador, desejo visualizar uma lista com todas os professores cadastrados para saber a quantidade de professores registrados
F3US07Eu, como usuário-coordenador, desejo criar a conta de um aluno para conseguir gerenciar os alunos da arena
F3US08Eu, como usuário-aluno, desejo fazer login na minha conta para visualizar meu horário de aulas e me comunicar com a coordenação da arena
F3US09Eu, como usuário-coordenador, desejo desativar a conta de um aluno para alunos que saírem da arena
F3US10Eu, como usuário-coordenador, desejo visualizar uma lista com todas os alunos cadastrados para ter uma noção da quantidade de alunos cadastrados
F4US11Eu, como usuário-coordenador, desejo criar uma turma para administrar as turmas da arena
F4US12Eu, como usuário-coordenador, desejo atribuir alunos a turmas para que eu possa ligar um aluno com a turma encontrada para ele
F4US13Eu, como usuário-coordenador, desejo atribuir professores a turmas para que eu possa responsabilizar professores pelas turmas que eles devem dar aula
F4US14Eu, como usuário-coordenador, desejo visualizar uma turma da arena para poder ver as informações dessa turma
F4US15Eu, como usuário-coordenador, desejo editar os dados de uma turma para alterar possíveis informações cadastradas erroneamente
F4US16Eu, como usuário-coordenador, desejo excluir uma turma para caso a turma pare de existir
F4US17Eu, como usuário-coordenador, desejo remover um aluno de uma turma para caso o aluno troque de turma ou saia da arena
F4US18Eu, como usuário-coordenador, desejo remover um professor de uma turma para caso o professor pare de dar aula para a turma ou ou saia da arena
F4US19Eu, como usuário-coordenador, desejo visualizar uma lista com todas as turma ativas da arena para ter uma noção da quantidade de turmas existentes na arena
F4US20Eu, como usuário-aluno, desejo visualizar as informações da minha turma para saber qual turma eu estou
F5US21Eu, como usuário-aluno, desejo notificar minha falta em uma aula com antecedência para ter direito à reposição dessa aula
F5US22Eu, como usuário-aluno, desejo enviar meu atestado de saúde para o coordenador para justificar minha falta e ter direito à reposição dessa aula
F5US23Eu, como usuário-aluno, desejo informar meus dias e horários disponíveis para que eu obtenha uma aula de reposição em um dia e horário satisfatórios
F5US24Eu, como usuário-aluno, desejo visualizar as minhas aulas de reposição para organizar meu tempo
F5US25Eu, como usuário-coordenador, desejo agendar uma aula de reposição para registrar a reposição de um aula
F5US26Eu, como usuário-coordenador, desejo visualizar uma aula de reposição para procurar por erros no registro
F5US27Eu, como usuário-coordenador, desejo editar uma aula de reposição para caso tenha algum erro cadastrado
F5US28Eu, como usuário-coordenador, desejo excluir uma aula de reposição para caso ela esteja errada por exemplo quando um aluno tiver sido atribuído a uma aula de reposição erroneamente
F5US29Eu, como usuário-coordenador, desejo atribuir alunos a aulas de reposição para que alunos com esse direito possam repor suas aulas
F5US30Eu, como usuário-coordenador, desejo baixar o atestado de um aluno para verificar se ele tem direito à reposição da aula
F5US31Eu, como usuário-coordenador, desejo atribuir professores a aulas de reposição para que eles reponham a aula para alunos com esse direito
F5US32Eu, como usuário-coordenador, desejo visualizar uma lista com todas as aula de reposição para ter uma noção da quantidade de aulas de reposição agendadas
F6US33Eu, como usuário-coordenador, desejo criar uma quadra com uma identificação para gerenciar as quadras do meu negócio
F6US34Eu, como usuário-coordenador, desejo excluir uma quadra para caso essa quadra seja desativada
F6US35Eu, como usuário-coordenador, desejo editar as informações de uma quadra para corrigir erros
F6US36Eu, como usuário-coordenador, desejo visualizar uma quadra, para procurar por erros nas informações da quadra
F6US37Eu, como usuário-coordenador, desejo definir o status de uma quadra em determinado dia e horário, para notificar quando ela está livre ou quando ela será limpa
F6US38Eu, como usuário-coordenador, desejo visualizar os status de uma quadra em um mês na forma de agenda, para observar quando ela está livre, está tendo aula ou será limpa
F6US39Eu, como usuário-coordenador, desejo editar o status de uma quadra em determinado dia e horário, para quando ocorrer mudanças no uso dessas quadras
F6US40Eu, como usuário-coordenador, desejo visualizar uma lista com todas as quadras, para saber a quantidade de quadras cadastradas
F7US41Eu, como usuário-coordenador, desejo atribuir uma quadra a uma turma, para definir o ambiente em que as aulas serão dadas
F7US42Eu, como usuário-coordenador, desejo trocar a quadra em que a turma tem a aula, para caso a turma troque de quadra
F7US43Eu, como usuário-coordenador, desejo atribuir uma quadra a uma aula de reposição, para definir o ambiente em que as aulas serão dadas
F7US44Eu, como usuário-coordenador, desejo trocar a quadra em que a aula de reposição foi agendada, para o caso de ocorrer um imprevisto e a quadra não esteja disponível
F7US45Eu, como usuário-aluno, desejo visualizar o status de uma quadra em determinado dia e horário em forma de agenda, para escolher um dia e horário, e agendar um day-use
F7US46Eu, como usuário-aluno, desejo agendar um day-use, para poder jogar Beach Tennis fora do horário de aula num horário de minha escolha
F7US47Eu, como visitante, desejo agendar um day-use, para poder jogar Beach Tennis num horário de minha escolha
F7US48Eu, como visitante, desejo visualizar o status de uma quadra na forma de agenda, para escolher um dia e horário para agendar um day-use
F8US49Eu, como usuário-coordenador, desejo criar um plano de aula, para poder administrar as aulas da arena
F8US50Eu, como usuário-coordenador, desejo poder visualizar um plano de aula, para procurar por possíveis erros
F8US51Eu, como usuário-coordenador, desejo poder excluir um plano de aula, para apagar planos de aula que estiverem obsoletos
F8US52Eu, como usuário-coordenador, desejo poder editar um plano de aula, para alterar planos de aula que estiverem com alguma informação errada
F8US53Eu, como usuário-coordenador, desejo baixar os planos de aulas, para conseguir enviá-los aos responsáveis pela verificação dos planos, que são externos a arena
F8US54Eu, como usuário-coordenador, desejo adicionar um ou mais drills a um plano de aula para declarar os diferentes drills presentes em um plano de aula
F8US55Eu, como usuário-coordenador, desejo adicionar elementos gráficos a um drill para representar o treino em um exercício/circuito
F8US56Eu, como usuário-coordenador, desejo deletar elementos gráficos de um drill para deletar um elemento adicionado erroneamente
F8US57Eu, como usuário-coordenador, desejo editar as informações de um drill para corrigir erros
F8US58Eu, como usuário-coordenador, desejo deletar um drill obsoleto para não deixar drills obsoletos em um plano de aula
F8US59Eu, como usuário-coordenador, desejo atribuir planos de aula a professores para informar a eles sobre como as aulas devem ser
F8US60Eu, como usuário-coordenador, desejo visualizar uma lista com todos os planos de aula para ter uma noção da quantidade de planos feitos
F8US61Eu, como usuário-coordenador, desejo visualizar uma lista com todos os drills de um plano de aula para ter uma noção da quantidade de drills nesse plano
F8US62Eu, como usuário-professor, desejo visualizar os planos de aula que me forem atribuídos para ter uma orientação de como devem ser minhas aulas
F9US63Eu, como usuário-professor, desejo visualizar o horário e quadra das minhas aulas no formato de agenda para que eu possa organizar meu trabalho
F9US64Eu, como usuário-professor, desejo visualizar a lista de alunos das minhas aulas para que eu possa ver as informações das pessoas a quem darei aula
F9US65Eu, como usuário-professor, desejo visualizar quais alunos notificaram que vão faltar a aula para que eu possa reorganizar meu tempo caso todos alunos de uma aula tenham avisado que não vão
F9US66Eu, como usuário-professor, desejo visualizar os planos de aula compartilhados comigo para saber como será minha aula
+

+

A partir desses critérios, as US foram avaliadas e os resultados obtidos indicam a importância. Dessa forma, as US's com pontuação maior ou igual a 6 foram escolhidas. Abaixo estão as US avaliadas:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FuncionalidadeUSPerspectiva de NegócioEntendimento TécnicoTotalMVP
F1US01437Presente
F1US02437Presente
F8US49437Presente
F8US50437Presente
F8US51437Presente
F8US52437Presente
F8US54437Presente
F8US57437Presente
F8US58437Presente
F8US60437Presente
F8US61437Presente
F8US53426Presente
F8US55426Presente
F8US56426Presente
F2US03235
F2US04235
F2US06235
F5US21325
F5US22325
F5US23325
F5US26325
F5US27325
F5US28325
F5US29325
F5US30325
F5US31325
F5US32325
F6US33325
F6US34325
F6US35325
F6US36325
F6US37325
F6US38315
F6US39315
F6US40325
F7US41325
F7US42325
F7US43325
F7US44325
F8US59325
F8US62325
F9US64235
F9US66235
F2US05224
F3US07134
F3US08134
F3US10134
F4US11134
F4US12134
F4US13134
F4US14134
F4US15134
F4US16134
F4US17134
F4US18134
F4US19134
F4US20134
F5US24314
F5US25314
F7US45314
F7US46314
F7US47314
F7US48314
F9US63214
F9US65224
F3US09123
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..25248a7 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["pt"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Beach Tennis CoordiMate","text":""},{"location":"#sobre","title":"Sobre","text":"

O Beach Tennis CoordiMate \u00e9 uma aplica\u00e7\u00e3o vers\u00e1til projetada para atender \u00e0s necessidades espec\u00edficas de empresas que oferecem aulas de Beach Tennis e alugam suas quadras para uso externo. Esta ferramenta aborda eficazmente desafios comuns, como o planejamento de drills, o controle de presen\u00e7a dos alunos e o gerenciamento do \"day-use\". Com o Beach Tennis CoordiMate, voc\u00ea pode simplificar esses processos, melhorar a efici\u00eancia operacional e proporcionar uma experi\u00eancia mais fluida para seus alunos e clientes\u00a0externos.

"},{"location":"#equipe","title":"Equipe","text":"Foto Nome GitHub E-mail Artur Rodrigues Artur Rodrigues artur190503@outlook.com Joao Barreto Jo\u00e3o Barreto 211039519@aluno.unb.br Luciano Freitas Luciano Freitas luciano.melo@unb.br Pablo Santos Pablo Santos pablo.costa@aluno.unb.br Vict\u00f3rio L\u00e1zaro Victorio Lazaro victorio.lazaro15@gmail.com Weslley Barros Weslley Barros weslley17w@gmail.com"},{"location":"backlog/","title":"Scale Agile Framework - SAFe","text":""},{"location":"backlog/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"

Data Vers\u00e3o Descri\u00e7\u00e3o Editores 16/10/2023 0.1 Cria\u00e7\u00e3o do documento Jo\u00e3o, Luciano, Pablo, Vict\u00f3rio 24/10/2023 0.2 Refatora\u00e7\u00e3o do backlog e adi\u00e7\u00e3o do link do Canvas Vict\u00f3rio 07/11/2023 0.3 Corre\u00e7\u00e3o do Backlog Vict\u00f3rio 11/11/2023 0.4 Exclus\u00e3o da US 59 para resolver duplica\u00e7\u00e3o das US's 57 e 59 Vict\u00f3rio

\u2003\u2003 O SAFe 6.0 \u00e9 uma base de conhecimento de princ\u00edpios, pr\u00e1ticas e compet\u00eancias integradas comprovadas para alcan\u00e7ar agilidade empresarial usando Lean, Agile e DevOps. Ele \u00e9 constru\u00eddo em torno da \"Seven Core Competencies of Business Agility\", que s\u00e3o fundamentais para alcan\u00e7ar e sustentar uma vantagem competitiva em uma era digital cada vez mais presente. O Modelo de requisitos utilizado pelo SAFe fornece uma estrutura de requisitos escal\u00e1vel que demonstra uma maneira de expressar comportamentos do sistema:

  • \u00c9picos: uma iniciativa de desenvolvimento de solu\u00e7\u00e3o significativa;
  • Capacidades: representa uma grande funcionalidade de solu\u00e7\u00e3o. Ela deve ser decomposta em funcionalidades a serem implementadas;
  • Features: representa a funcionalidade da solu\u00e7\u00e3o que fornece valor comercial, atende a uma necessidade das partes interessadas. Ela inclui uma hip\u00f3tese de benef\u00edcio e crit\u00e9rios de aceita\u00e7\u00e3o;
  • Hist\u00f3rias: descri\u00e7\u00f5es curtas de uma pequena parte da funcionalidade desejada, escritas da perspectiva do usu\u00e1rio. Elas s\u00e3o o principal artefato usado para definir o comportamentodosistema no Agile.
"},{"location":"backlog/#safe-backlog-beachtenniscoordimate","title":"SAFe Backlog BeachTennisCoordiMate","text":"

Confira no link uma vers\u00e3o mais intuitiva do nosso backlog.

"},{"location":"backlog/#tema-estrategico","title":"Tema Estrat\u00e9gico:","text":"

Gerenciamento de arena de Beach Tennis

"},{"location":"backlog/#epicos","title":"\u00c9picos","text":"

\u00c9pico Descri\u00e7\u00e3o E1 Gest\u00e3o do usu\u00e1rio E2 Gest\u00e3o do uso do espa\u00e7o

"},{"location":"backlog/#capacidade","title":"Capacidade","text":"

\u00c9pico Capacidade Descri\u00e7\u00e3o E1 C1 Administar conta E1 C2 Gerenciar alunos E2 C3 Gerenciar quadras E2 C4 Administrar aula

"},{"location":"backlog/#funcionalidade","title":"Funcionalidade","text":"

Capacidade Funcionalidade Descri\u00e7\u00e3o C1 F1 Gerenciamento de usu\u00e1rio-coordenador C1 F2 Gerenciamento de usu\u00e1rio-professor C1 F3 Gerenciamento de usu\u00e1rio-aluno C2 F4 Administra\u00e7\u00e3o de turma C2 F5 Administra\u00e7\u00e3o das aulas de reposi\u00e7\u00e3o C3 F6 Administra\u00e7\u00e3o de quadra C3 F7 Agendamento de quadra C4 F8 Gerenciamento de plano de aula C4 F9 Gerenciamento de aula

"},{"location":"backlog/#user-story","title":"User Story","text":"Funcionalidade US Descri\u00e7\u00e3o F1 US01 Eu, como usu\u00e1rio-coordenador, desejo criar minha conta para administrar a arena F1 US02 Eu, como usu\u00e1rio-coordenador, desejo fazer login na minha conta para acessar as funcionalidades exclusivas de coordenador F2 US03 Eu, como usu\u00e1rio-coordenador, desejo criar a conta de um professor para poder administrar os professores da arena F2 US04 Eu, como usu\u00e1rio-professor, desejo fazer login na minha conta para me ajudar a realizar meu trabalho de ensino F2 US05 Eu, como usu\u00e1rio-coordenador, desejo desativar a conta de um professor para professores que sa\u00edrem da arena F2 US06 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas os professores cadastrados para saber a quantidade de professores registrados F3 US07 Eu, como usu\u00e1rio-coordenador, desejo criar a conta de um aluno para conseguir gerenciar os alunos da arena F3 US08 Eu, como usu\u00e1rio-aluno, desejo fazer login na minha conta para visualizar meu hor\u00e1rio de aulas e me comunicar com a coordena\u00e7\u00e3o da arena F3 US09 Eu, como usu\u00e1rio-coordenador, desejo desativar a conta de um aluno para alunos que sa\u00edrem da arena F3 US10 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas os alunos cadastrados para ter uma no\u00e7\u00e3o da quantidade de alunos cadastrados F4 US11 Eu, como usu\u00e1rio-coordenador, desejo criar uma turma para administrar as turmas da arena F4 US12 Eu, como usu\u00e1rio-coordenador, desejo atribuir alunos a turmas para que eu possa ligar um aluno com a turma encontrada para ele F4 US13 Eu, como usu\u00e1rio-coordenador, desejo atribuir professores a turmas para que eu possa responsabilizar professores pelas turmas que eles devem dar aula F4 US14 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma turma da arena para poder ver as informa\u00e7\u00f5es dessa turma F4 US15 Eu, como usu\u00e1rio-coordenador, desejo editar os dados de uma turma para alterar poss\u00edveis informa\u00e7\u00f5es cadastradas erroneamente F4 US16 Eu, como usu\u00e1rio-coordenador, desejo excluir uma turma para caso a turma pare de existir F4 US17 Eu, como usu\u00e1rio-coordenador, desejo remover um aluno de uma turma para caso o aluno troque de turma ou saia da arena F4 US18 Eu, como usu\u00e1rio-coordenador, desejo remover um professor de uma turma para caso o professor pare de dar aula para a turma ou ou saia da arena F4 US19 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas as turma ativas da arena para ter uma no\u00e7\u00e3o da quantidade de turmas existentes na arena F4 US20 Eu, como usu\u00e1rio-aluno, desejo visualizar as informa\u00e7\u00f5es da minha turma para saber qual turma eu estou F5 US21 Eu, como usu\u00e1rio-aluno, desejo notificar minha falta em uma aula com anteced\u00eancia para ter direito \u00e0 reposi\u00e7\u00e3o dessa aula F5 US22 Eu, como usu\u00e1rio-aluno, desejo enviar meu atestado de sa\u00fade para o coordenador para justificar minha falta e ter direito \u00e0 reposi\u00e7\u00e3o dessa aula F5 US23 Eu, como usu\u00e1rio-aluno, desejo informar meus dias e hor\u00e1rios dispon\u00edveis para que eu obtenha uma aula de reposi\u00e7\u00e3o em um dia e hor\u00e1rio satisfat\u00f3rios F5 US24 Eu, como usu\u00e1rio-aluno, desejo visualizar as minhas aulas de reposi\u00e7\u00e3o para organizar meu tempo F5 US25 Eu, como usu\u00e1rio-coordenador, desejo agendar uma aula de reposi\u00e7\u00e3o para registrar a reposi\u00e7\u00e3o de um aula F5 US26 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma aula de reposi\u00e7\u00e3o para procurar por erros no registro F5 US27 Eu, como usu\u00e1rio-coordenador, desejo editar uma aula de reposi\u00e7\u00e3o para caso tenha algum erro cadastrado F5 US28 Eu, como usu\u00e1rio-coordenador, desejo excluir uma aula de reposi\u00e7\u00e3o para caso ela esteja errada por exemplo quando um aluno tiver sido atribu\u00eddo a uma aula de reposi\u00e7\u00e3o erroneamente F5 US29 Eu, como usu\u00e1rio-coordenador, desejo atribuir alunos a aulas de reposi\u00e7\u00e3o para que alunos com esse direito possam repor suas aulas F5 US30 Eu, como usu\u00e1rio-coordenador, desejo baixar o atestado de um aluno para verificar se ele tem direito \u00e0 reposi\u00e7\u00e3o da aula F5 US31 Eu, como usu\u00e1rio-coordenador, desejo atribuir professores a aulas de reposi\u00e7\u00e3o para que eles reponham a aula para alunos com esse direito F5 US32 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas as aula de reposi\u00e7\u00e3o para ter uma no\u00e7\u00e3o da quantidade de aulas de reposi\u00e7\u00e3o agendadas F6 US33 Eu, como usu\u00e1rio-coordenador, desejo criar uma quadra com uma identifica\u00e7\u00e3o para gerenciar as quadras do meu neg\u00f3cio F6 US34 Eu, como usu\u00e1rio-coordenador, desejo excluir uma quadra para caso essa quadra seja desativada F6 US35 Eu, como usu\u00e1rio-coordenador, desejo editar as informa\u00e7\u00f5es de uma quadra para corrigir erros F6 US36 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma quadra, para procurar por erros nas informa\u00e7\u00f5es da quadra F6 US37 Eu, como usu\u00e1rio-coordenador, desejo definir o status de uma quadra em determinado dia e hor\u00e1rio, para notificar quando ela est\u00e1 livre ou quando ela ser\u00e1 limpa F6 US38 Eu, como usu\u00e1rio-coordenador, desejo visualizar os status de uma quadra em um m\u00eas na forma de agenda, para observar quando ela est\u00e1 livre, est\u00e1 tendo aula ou ser\u00e1 limpa F6 US39 Eu, como usu\u00e1rio-coordenador, desejo editar o status de uma quadra em determinado dia e hor\u00e1rio, para quando ocorrer mudan\u00e7as no uso dessas quadras F6 US40 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas as quadras, para saber a quantidade de quadras cadastradas F7 US41 Eu, como usu\u00e1rio-coordenador, desejo atribuir uma quadra a uma turma, para definir o ambiente em que as aulas ser\u00e3o dadas F7 US42 Eu, como usu\u00e1rio-coordenador, desejo trocar a quadra em que a turma tem a aula, para caso a turma troque de quadra F7 US43 Eu, como usu\u00e1rio-coordenador, desejo atribuir uma quadra a uma aula de reposi\u00e7\u00e3o, para definir o ambiente em que as aulas ser\u00e3o dadas F7 US44 Eu, como usu\u00e1rio-coordenador, desejo trocar a quadra em que a aula de reposi\u00e7\u00e3o foi agendada, para o caso de ocorrer um imprevisto e a quadra n\u00e3o esteja dispon\u00edvel F7 US45 Eu, como usu\u00e1rio-aluno, desejo visualizar o status de uma quadra em determinado dia e hor\u00e1rio em forma de agenda, para escolher um dia e hor\u00e1rio, e agendar um day-use F7 US46 Eu, como usu\u00e1rio-aluno, desejo agendar um day-use, para poder jogar Beach Tennis fora do hor\u00e1rio de aula num hor\u00e1rio de minha escolha F7 US47 Eu, como visitante, desejo agendar um day-use, para poder jogar Beach Tennis num hor\u00e1rio de minha escolha F7 US48 Eu, como visitante, desejo visualizar o status de uma quadra na forma de agenda, para escolher um dia e hor\u00e1rio para agendar um day-use F8 US49 Eu, como usu\u00e1rio-coordenador, desejo criar um plano de aula, para poder administrar as aulas da arena F8 US50 Eu, como usu\u00e1rio-coordenador, desejo poder visualizar um plano de aula, para procurar por poss\u00edveis erros F8 US51 Eu, como usu\u00e1rio-coordenador, desejo poder excluir um plano de aula, para apagar planos de aula que estiverem obsoletos F8 US52 Eu, como usu\u00e1rio-coordenador, desejo poder editar um plano de aula, para alterar planos de aula que estiverem com alguma informa\u00e7\u00e3o errada F8 US53 Eu, como usu\u00e1rio-coordenador, desejo baixar os planos de aulas, para conseguir envi\u00e1-los aos respons\u00e1veis pela verifica\u00e7\u00e3o dos planos, que s\u00e3o externos a arena F8 US54 Eu, como usu\u00e1rio-coordenador, desejo adicionar um ou mais drills a um plano de aula para declarar os diferentes drills presentes em um plano de aula F8 US55 Eu, como usu\u00e1rio-coordenador, desejo adicionar elementos gr\u00e1ficos a um drill para representar o treino em um exerc\u00edcio/circuito F8 US56 Eu, como usu\u00e1rio-coordenador, desejo deletar elementos gr\u00e1ficos de um drill para deletar um elemento adicionado erroneamente F8 US57 Eu, como usu\u00e1rio-coordenador, desejo editar as informa\u00e7\u00f5es de um drill para corrigir erros F8 US58 Eu, como usu\u00e1rio-coordenador, desejo deletar um drill obsoleto para n\u00e3o deixar drills obsoletos em um plano de aula F8 US59 Eu, como usu\u00e1rio-coordenador, desejo atribuir planos de aula a professores para informar a eles sobre como as aulas devem ser F8 US60 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todos os planos de aula para ter uma no\u00e7\u00e3o da quantidade de planos feitos F8 US61 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todos os drills de um plano de aula para ter uma no\u00e7\u00e3o da quantidade de drills nesse plano F8 US62 Eu, como usu\u00e1rio-professor, desejo visualizar os planos de aula que me forem atribu\u00eddos para ter uma orienta\u00e7\u00e3o de como devem ser minhas aulas F9 US63 Eu, como usu\u00e1rio-professor, desejo visualizar o hor\u00e1rio e quadra das minhas aulas no formato de agenda para que eu possa organizar meu trabalho F9 US64 Eu, como usu\u00e1rio-professor, desejo visualizar a lista de alunos das minhas aulas para que eu possa ver as informa\u00e7\u00f5es das pessoas a quem darei aula F9 US65 Eu, como usu\u00e1rio-professor, desejo visualizar quais alunos notificaram que v\u00e3o faltar a aula para que eu possa reorganizar meu tempo caso todos alunos de uma aula tenham avisado que n\u00e3o v\u00e3o F9 US66 Eu, como usu\u00e1rio-professor, desejo visualizar os planos de aula compartilhados comigo para saber como ser\u00e1 minha aula"},{"location":"dor_dod/","title":"DoR & DoD","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/11/2023 0.1 Cria\u00e7\u00e3o do documento Artur e Jo\u00e3o

Definition of Ready (DoR) e Definition of Done (DoD) s\u00e3o crit\u00e9rios fundamentais no contexto \u00e1gil do desenvolvimento de software. DoR define as condi\u00e7\u00f5es que um item do backlog deve atender antes de ser selecionado para o sprint, garantindo que esteja claro, compreens\u00edvel e pronto para ser desenvolvido. Isso pode incluir a exist\u00eancia de detalhes suficientes, crit\u00e9rios de aceita\u00e7\u00e3o bem definidos e uma compreens\u00e3o compartilhada entre a equipe. Por outro lado, o DoD estabelece os crit\u00e9rios que um incremento de trabalho deve cumprir para ser considerado completo, testado, pronto para produ\u00e7\u00e3o e entreg\u00e1vel. Esses crit\u00e9rios garantem que o trabalho atenda aos padr\u00f5es de qualidade, funcione conforme o esperado e esteja em conformidade com os requisitos antes de ser considerado finalizado. Juntos, o DoR e o DoD asseguram uma melhor compreens\u00e3o, consist\u00eancia e qualidade ao longo do ciclo de desenvolvimento \u00e1gil.

"},{"location":"dor_dod/#dor-definition-of-ready","title":"DoR - Definition of Ready","text":"

Os seguintes crit\u00e9rios foram definidos para o DoR desse projeto:

  • O requisito est\u00e1 declarado como uma hist\u00f3ria de usu\u00e1rio?

  • A hist\u00f3ria tem crit\u00e9rios de aceita\u00e7\u00e3o definidos?

  • A hist\u00f3ria tem valor de neg\u00f3cio estabelecido?

  • A hist\u00f3ria est\u00e1 de acordo com o modelo do INVEST?

  • A hist\u00f3ria foi estimada em pontos, levando em conta os crit\u00e9rios de aceita\u00e7\u00e3o?

  • A hist\u00f3ria tem representa\u00e7\u00e3o no formato de um prot\u00f3tipo?

  • A hist\u00f3ria foi validada pelo cliente?

"},{"location":"dor_dod/#dod-definition-of-done","title":"DoD - Definition of Done","text":"

Os seguintes crit\u00e9rios foram definidos para o DoD desse projeto:

  • Os crit\u00e9rios de aceita\u00e7\u00e3o foram desenvolvidos e verificados?

  • O c\u00f3digo desenvolvido est\u00e1 de acordo com a arquitetura do projeto?

  • O c\u00f3digo desenvolvido \u00e9 responsivo com os modelos de tela estabelecidos para o projeto?

  • A funcionalidade desenvolvida foi revisada por um membro da equipe?

  • A funcionalidade est\u00e1 integrada ao sistema principal\u00a0da\u00a0aplica\u00e7\u00e3o?

"},{"location":"gamificacao/","title":"Gamifica\u00e7\u00e3o","text":"

Data Vers\u00e3o Descri\u00e7\u00e3o Autor 08/11/2023 0.1 Cria\u00e7\u00e3o do documento Vict\u00f3rio

"},{"location":"gamificacao/#faccao-guardioes-da-galaxia","title":"Fac\u00e7\u00e3o \"Guardi\u00f5es da Gal\u00e1xia\"","text":"

"},{"location":"gamificacao/#membros","title":"Membros","text":"
  • Cowboy Intergal\u00e1ctico (Jo\u00e3o)
  • Defensor C\u00f3smico (Artur)
  • Helios Nebularis (Weslley)
  • Lu\u2019lu (Luciano)
  • Markus (Pablo)
  • Victrum Lazariano (Vict\u00f3rio)
"},{"location":"gamificacao/#historia-dos-membros","title":"Hist\u00f3ria dos Membros","text":"
  1. Cowboy Intergal\u00e1tico

Meu nome \u00e9 Jo\u00e3o Barreto, mais conhecido como Cowboy Intergal\u00e1tico, e eu sou um dos membros mais leais da fac\u00e7\u00e3o intergal\u00e1ctica Guardi\u00f5es da Gal\u00e1xia. Desde que me juntei a esse grupo, tenho dedicado minha vida para proteger a gal\u00e1xia de amea\u00e7as que poucos ousam enfrentar. Com um estilo de vida que mistura adrenalina e harmonia.

Sou uma pessoa \u00fanica nesse universo, diferente de tudo e diferente de todos, apaixonado por carros. Sou um aficionado por eles. Seja pilotando uma nave de alta velocidade ou dirigindo um ve\u00edculo terrestre em um planeta distante, estou sempre no comando das m\u00e1quinas mais impressionantes que posso encontrar. Mas n\u00e3o \u00e9 s\u00f3 a velocidade que me move, tamb\u00e9m \u00e9 a m\u00fasica. E o meu estilo musical favorito? Sertanejo, sem d\u00favidas. N\u00e3o importa onde esteja, sempre tenho um viol\u00e3o ou algum dispositivo que toque as melhores m\u00fasicas sertanejas.

Minha combina\u00e7\u00e3o de paix\u00f5es pode parecer estranha para alguns, mas \u00e9 isso que me faz ser quem sou e que me encoraja a entrar nessa jornada perigosa.

  1. Defensor C\u00f3smico

Me chamo Artur, um alien\u00edgena de um planeta distante, sou mais conhecido como Defensor C\u00f3smico, um dos Guardi\u00f5es da Gal\u00e1xia. Eu sempre fui apaixonado por futebol e m\u00fasica, mas minha vida mudou para sempre quando meu planeta foi atacado por uma fac\u00e7\u00e3o de alien\u00edgenas cru\u00e9is, Slitherium. Eu fui o \u00fanico sobrevivente, e fui for\u00e7ado a fugir para o espa\u00e7o.

Ap\u00f3s perder tudo, encontrei os Guardi\u00f5es da Gal\u00e1xia, que me acolheram e me ensinaram a usar meus poderes para proteger a gal\u00e1xia. Hoje, sou um Guardi\u00e3o orgulhoso, determinado a lutar por justi\u00e7a e igualdade para todos os seres vivos.

Ainda tenho tempo para aproveitar meus hobbies, pois eles me ajudam a relaxar e a me sentir feliz. Afinal, essas s\u00e3o as coisas que me tornam quem eu sou.

  1. Helios Nebularis

Helios Nebularis \u00e9 um Guardi\u00e3o destemido e ambicioso na gal\u00e1xia ca\u00f3tica de Calamum Caeruleum. Ele se destaca dos outros Guardi\u00f5es por afirmar que tinha vivido em um multiverso chamado 2023.1, embora suas mem\u00f3rias fossem fragmentadas. Helios compartilhava suas experi\u00eancias desse multiverso, inspirando outros Guardi\u00f5es com suas vis\u00f5es de tecnologia avan\u00e7ada e desafios semelhantes aos que enfrentavam.

Sua ambi\u00e7\u00e3o o impulsiona a encontrar formas inovadoras de proteger ra\u00e7as em risco de extin\u00e7\u00e3o e restaurar a ordem em planetas devastados pela gan\u00e2ncia corporativa. Helios usava sua suposta conex\u00e3o com o multiverso para desenvolver estrat\u00e9gias \u00fanicas e abordagens fora do comum.

  1. Lu\u2019lu

Eu sou Lu'lu, e minha hist\u00f3ria come\u00e7a em um lugar distante da gal\u00e1xia. Quando eu era apenas um jovem alien\u00edgena, fazia parte de uma civiliza\u00e7\u00e3o antiga e religiosa, dedicada a ajudar os necessitados e praticar o bem. Mas um dia, a escurid\u00e3o da gan\u00e2ncia corporativa recaiu sobre n\u00f3s. O Grupo Spark Tech, sob a fachada de inova\u00e7\u00e3o tecnol\u00f3gica, destruiu nossa civiliza\u00e7\u00e3o em busca de segredos ancestrais. Eu fui o \u00fanico sobrevivente, uma pequena luz de esperan\u00e7a em meio \u00e0 escurid\u00e3o que eles trouxeram. Mas minha for\u00e7a de vontade e minha cren\u00e7a inabal\u00e1vel no bem me guiaram para um novo prop\u00f3sito.

Foi assim que eu encontrei os Guardi\u00f5es da Gal\u00e1xia, um grupo de pessoas com o mesmo desejo ardente de trazer paz e bondade para nossa gal\u00e1xia. Juntos, juramos lutar contra as for\u00e7as da gan\u00e2ncia e da explora\u00e7\u00e3o desenfreada. Estamos determinados a enfrentar o Grupo Spark Tech e outras corpora\u00e7\u00f5es gananciosas que amea\u00e7am a harmonia da gal\u00e1xia. Afinal, n\u00e3o importa o qu\u00e3o sombrio o cen\u00e1rio possa parecer, sempre haver\u00e1 espa\u00e7o para a luz e o bem prevalecerem. E eu estou aqui para garantir que isso aconte\u00e7a.\"

  1. Markus

Markus viveu em um planeta devastado por uma corpora\u00e7\u00e3o gananciosa(apache). Ele perdeu sua fam\u00edlia e sua comunidade na destrui\u00e7\u00e3o. Ele se refugiou nos estudos e na pesquisa, aprendendo sobre as civiliza\u00e7\u00f5es antigas e a ecologia dos planetas. Sendo um intelectual e pesquisador habilidoso. Ele sabe muito sobre os estragos das corpora\u00e7\u00f5es e como proteger a natureza e as comunidades vulner\u00e1veis. Ele \u00e9 um estrategista e planejador excelente. Ele fornece an\u00e1lises e informa\u00e7\u00f5es cruciais para as miss\u00f5es dos Guardi\u00f5es. Markus quer proteger o que \u00e9 precioso em sua gal\u00e1xia. Ele acredita que seu conhecimento \u00e9 uma arma poderosa contra as corpora\u00e7\u00f5es. Ele tamb\u00e9m quer superar sua timidez e se tornar uma voz mais forte na luta pela justi\u00e7a.

  1. Victrum Lazariano

Victrum Lazariano nasceu no planeta deserto Capivarian-3 (rico em recursos minerais). Seu povo foi escravizado pela Slitherium e foram for\u00e7ados a trabalhar nas minas. Uma opera\u00e7\u00e3o massiva de minera\u00e7\u00e3o culminou em uma cat\u00e1strofe que contaminou irreparavelmente o ambiente de Capivarian-3.

Conseguiu fugir em uma nave da Slitherium, s\u00f3 que n\u00e3o conseguiu salvar sua fam\u00edlia. Por anos, estudou t\u00e1ticas de guerrilha, aprendeu a pilotar naves espaciais e dominou a arte da diplomacia. Se juntou \u00e0 fac\u00e7\u00e3o dos Guardi\u00f5es da Gal\u00e1xia, que compartilhava seu objetivo de justi\u00e7a e prote\u00e7\u00e3o dos vulner\u00e1veis na gal\u00e1xia Calamum Caeruleum.

"},{"location":"gamificacao/#jornada-dos-guardioes-da-galaxia","title":"Jornada dos Guardi\u00f5es da Gal\u00e1xia","text":"

No cora\u00e7\u00e3o da gal\u00e1xia Calamum Caeruleum, onde a gan\u00e2ncia das corpora\u00e7\u00f5es e o caos imperavam, os destinos de seis indiv\u00edduos destemidos se cruzaram. Conhecidos como os Guardi\u00f5es da Gal\u00e1xia, eles eram uma fac\u00e7\u00e3o comprometida com a justi\u00e7a e a solidariedade. Defensor C\u00f3smico, Cowboy Intergal\u00e1ctico, Lu'lu, Victrum Lazariano, Helios Nebularis e Markus cada um com suas habilidades \u00fanicas e motiva\u00e7\u00f5es pessoais, foram reunidos pelo Comandante Estelar Marsicano para formar uma coaliz\u00e3o contra as for\u00e7as da tirania corporativa. Unidos por um prop\u00f3sito nobre, eles estavam prontos para enfrentar a batalha que definiria o destino da gal\u00e1xia, promovendo a esperan\u00e7a onde antes s\u00f3 havia desespero.

"},{"location":"gamificacao/#conclusao","title":"Conclus\u00e3o","text":"

Os Guardi\u00f5es da Gal\u00e1xia s\u00e3o uma fac\u00e7\u00e3o composta por v\u00e1rios sobreviventes das a\u00e7\u00f5es tir\u00e2nicas do conglomerado e por isso os membros sabem o perigo da gan\u00e2ncia do conglomerado.

A fac\u00e7\u00e3o se compromete \u00e0:

  • Lutar contra a tirania corporativa
  • Instaurar a ordem na gal\u00e1xia por meio da solidariedade e justi\u00e7a.
  • Acatar ao Comando Estelar e ao Comandante Estelar Marsicano
  • Promover a esperan\u00e7a
"},{"location":"mvp/","title":"MPV","text":""},{"location":"mvp/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"

Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/10/2023 0.1 Cria\u00e7\u00e3o do documento Artur, Jo\u00e3o, Luciano, Pablo, Vict\u00f3rio e Weslley 07/11/2023 0.2 Adi\u00e7\u00e3o de pontua\u00e7\u00e3o das US's Vict\u00f3rio 08/11/2023 0.3 Reordenamento das US'S do MVP pelas pontua\u00e7\u00f5es mais altas Vict\u00f3rio 11/11/2023 0.4 Exclus\u00e3o da US 59 para resolver duplica\u00e7\u00e3o das US's 57 e 59 Vict\u00f3rio

"},{"location":"mvp/#alinhamento-do-mpv-aos-objetivos-do-projeto","title":"Alinhamento do MPV aos objetivos do projeto","text":"

Objetivos Funcionalidades relacionadas Padronizar e melhorar a comunica\u00e7\u00e3o de planos de aulas entre coordenadores e professores, reduzindo conflitos e atrasos F1 (Gerenciamento de usu\u00e1rio-coordenador) e F8 (Gerenciamento de plano de aula)

Dado os objetivos do projeto estabelecidos no documento de vis\u00e3o do produto, \u00e9 poss\u00edvel visualizar como o MPV se alinha a esses objetivos:

  • As funcionalidades F1 e F8 est\u00e3o diretamente relacionadas ao objetivo de planejamento das aulas de beach tennis, que buscam resolver o problema da falta de uma ferramenta para cria\u00e7\u00e3o dos drills e padroniza\u00e7\u00e3o dos planos de aulas.
"},{"location":"mvp/#minimo-produto-viavel","title":"M\u00ednimo Produto Vi\u00e1vel","text":"

A metodologia utilizada para a escolha do nosso MPV foi a Matriz de Prioriza\u00e7\u00e3o. Essa t\u00e9cnica permite classificar os requisitos do produto com base em crit\u00e9rios espec\u00edficos. Na matriz apresentada, foram utilizadas tr\u00eas dimens\u00f5es para avaliar cada Feature: a perspectiva de neg\u00f3cios, o entendimento t\u00e9cnico e as depend\u00eancias.

Na dimens\u00e3o de perspectiva de neg\u00f3cio foi utilizada a t\u00e9cnica MoSCoW, em que as hist\u00f3rias de usu\u00e1rio foram divididas em 4 quadrantes, que s\u00e3o MUST, SHOULD, COULD e WON'T.

O entendimento t\u00e9cnico foi a avalia\u00e7\u00e3o da vis\u00e3o da equipe da facilidade de implementa\u00e7\u00e3o da hist\u00f3ria de usu\u00e1rio e da capacidade da equipe para o desenvolvimento da mesma. Para isso, foi utilizado 3 classifica\u00e7\u00f5es que est\u00e3o relacionadas ao n\u00edvel de entendimento e pode ser BAIXO, MEDIANO e ALTO.

Pontua\u00e7\u00f5es

Perspectiva de Neg\u00f3cio

  • MUST: maior valor e devem fazer parte da solu\u00e7\u00e3o (Valor 4)
  • SHOULD: tem valor e podem fazer parte da solu\u00e7\u00e3o (Valor 3)
  • COULD: tem algum valor e seriam desej\u00e1veis para o produto (Valor 2)
  • WON'T: pouco valor e que n\u00e3o ser\u00e3o desenvolvidos no momento (Valor 1)

Entendimento T\u00e9cnico:

  • BAIXO: A equipe tem baixo entendimento t\u00e9nicnico sobre a feature. (Valor 1)
  • MEDIANO: A equipe tem entendimento t\u00e9cnico m\u00e9dio. Podem haver algumas quest\u00f5es desconhecidas ou de dif\u00edcil entendimento. (Valor 2)
  • ALTO: A equipe possui alto entendimento t\u00e9cnico sobre a feature. (Valor 3)

Abaixo, seguem as User Stories e sua descri\u00e7\u00e3o:

Funcionalidade US Descri\u00e7\u00e3o F1 US01 Eu, como usu\u00e1rio-coordenador, desejo criar minha conta para administrar a arena F1 US02 Eu, como usu\u00e1rio-coordenador, desejo fazer login na minha conta para acessar as funcionalidades exclusivas de coordenador F2 US03 Eu, como usu\u00e1rio-coordenador, desejo criar a conta de um professor para poder administrar os professores da arena F2 US04 Eu, como usu\u00e1rio-professor, desejo fazer login na minha conta para me ajudar a realizar meu trabalho de ensino F2 US05 Eu, como usu\u00e1rio-coordenador, desejo desativar a conta de um professor para professores que sa\u00edrem da arena F2 US06 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas os professores cadastrados para saber a quantidade de professores registrados F3 US07 Eu, como usu\u00e1rio-coordenador, desejo criar a conta de um aluno para conseguir gerenciar os alunos da arena F3 US08 Eu, como usu\u00e1rio-aluno, desejo fazer login na minha conta para visualizar meu hor\u00e1rio de aulas e me comunicar com a coordena\u00e7\u00e3o da arena F3 US09 Eu, como usu\u00e1rio-coordenador, desejo desativar a conta de um aluno para alunos que sa\u00edrem da arena F3 US10 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas os alunos cadastrados para ter uma no\u00e7\u00e3o da quantidade de alunos cadastrados F4 US11 Eu, como usu\u00e1rio-coordenador, desejo criar uma turma para administrar as turmas da arena F4 US12 Eu, como usu\u00e1rio-coordenador, desejo atribuir alunos a turmas para que eu possa ligar um aluno com a turma encontrada para ele F4 US13 Eu, como usu\u00e1rio-coordenador, desejo atribuir professores a turmas para que eu possa responsabilizar professores pelas turmas que eles devem dar aula F4 US14 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma turma da arena para poder ver as informa\u00e7\u00f5es dessa turma F4 US15 Eu, como usu\u00e1rio-coordenador, desejo editar os dados de uma turma para alterar poss\u00edveis informa\u00e7\u00f5es cadastradas erroneamente F4 US16 Eu, como usu\u00e1rio-coordenador, desejo excluir uma turma para caso a turma pare de existir F4 US17 Eu, como usu\u00e1rio-coordenador, desejo remover um aluno de uma turma para caso o aluno troque de turma ou saia da arena F4 US18 Eu, como usu\u00e1rio-coordenador, desejo remover um professor de uma turma para caso o professor pare de dar aula para a turma ou ou saia da arena F4 US19 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas as turma ativas da arena para ter uma no\u00e7\u00e3o da quantidade de turmas existentes na arena F4 US20 Eu, como usu\u00e1rio-aluno, desejo visualizar as informa\u00e7\u00f5es da minha turma para saber qual turma eu estou F5 US21 Eu, como usu\u00e1rio-aluno, desejo notificar minha falta em uma aula com anteced\u00eancia para ter direito \u00e0 reposi\u00e7\u00e3o dessa aula F5 US22 Eu, como usu\u00e1rio-aluno, desejo enviar meu atestado de sa\u00fade para o coordenador para justificar minha falta e ter direito \u00e0 reposi\u00e7\u00e3o dessa aula F5 US23 Eu, como usu\u00e1rio-aluno, desejo informar meus dias e hor\u00e1rios dispon\u00edveis para que eu obtenha uma aula de reposi\u00e7\u00e3o em um dia e hor\u00e1rio satisfat\u00f3rios F5 US24 Eu, como usu\u00e1rio-aluno, desejo visualizar as minhas aulas de reposi\u00e7\u00e3o para organizar meu tempo F5 US25 Eu, como usu\u00e1rio-coordenador, desejo agendar uma aula de reposi\u00e7\u00e3o para registrar a reposi\u00e7\u00e3o de um aula F5 US26 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma aula de reposi\u00e7\u00e3o para procurar por erros no registro F5 US27 Eu, como usu\u00e1rio-coordenador, desejo editar uma aula de reposi\u00e7\u00e3o para caso tenha algum erro cadastrado F5 US28 Eu, como usu\u00e1rio-coordenador, desejo excluir uma aula de reposi\u00e7\u00e3o para caso ela esteja errada por exemplo quando um aluno tiver sido atribu\u00eddo a uma aula de reposi\u00e7\u00e3o erroneamente F5 US29 Eu, como usu\u00e1rio-coordenador, desejo atribuir alunos a aulas de reposi\u00e7\u00e3o para que alunos com esse direito possam repor suas aulas F5 US30 Eu, como usu\u00e1rio-coordenador, desejo baixar o atestado de um aluno para verificar se ele tem direito \u00e0 reposi\u00e7\u00e3o da aula F5 US31 Eu, como usu\u00e1rio-coordenador, desejo atribuir professores a aulas de reposi\u00e7\u00e3o para que eles reponham a aula para alunos com esse direito F5 US32 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas as aula de reposi\u00e7\u00e3o para ter uma no\u00e7\u00e3o da quantidade de aulas de reposi\u00e7\u00e3o agendadas F6 US33 Eu, como usu\u00e1rio-coordenador, desejo criar uma quadra com uma identifica\u00e7\u00e3o para gerenciar as quadras do meu neg\u00f3cio F6 US34 Eu, como usu\u00e1rio-coordenador, desejo excluir uma quadra para caso essa quadra seja desativada F6 US35 Eu, como usu\u00e1rio-coordenador, desejo editar as informa\u00e7\u00f5es de uma quadra para corrigir erros F6 US36 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma quadra, para procurar por erros nas informa\u00e7\u00f5es da quadra F6 US37 Eu, como usu\u00e1rio-coordenador, desejo definir o status de uma quadra em determinado dia e hor\u00e1rio, para notificar quando ela est\u00e1 livre ou quando ela ser\u00e1 limpa F6 US38 Eu, como usu\u00e1rio-coordenador, desejo visualizar os status de uma quadra em um m\u00eas na forma de agenda, para observar quando ela est\u00e1 livre, est\u00e1 tendo aula ou ser\u00e1 limpa F6 US39 Eu, como usu\u00e1rio-coordenador, desejo editar o status de uma quadra em determinado dia e hor\u00e1rio, para quando ocorrer mudan\u00e7as no uso dessas quadras F6 US40 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todas as quadras, para saber a quantidade de quadras cadastradas F7 US41 Eu, como usu\u00e1rio-coordenador, desejo atribuir uma quadra a uma turma, para definir o ambiente em que as aulas ser\u00e3o dadas F7 US42 Eu, como usu\u00e1rio-coordenador, desejo trocar a quadra em que a turma tem a aula, para caso a turma troque de quadra F7 US43 Eu, como usu\u00e1rio-coordenador, desejo atribuir uma quadra a uma aula de reposi\u00e7\u00e3o, para definir o ambiente em que as aulas ser\u00e3o dadas F7 US44 Eu, como usu\u00e1rio-coordenador, desejo trocar a quadra em que a aula de reposi\u00e7\u00e3o foi agendada, para o caso de ocorrer um imprevisto e a quadra n\u00e3o esteja dispon\u00edvel F7 US45 Eu, como usu\u00e1rio-aluno, desejo visualizar o status de uma quadra em determinado dia e hor\u00e1rio em forma de agenda, para escolher um dia e hor\u00e1rio, e agendar um day-use F7 US46 Eu, como usu\u00e1rio-aluno, desejo agendar um day-use, para poder jogar Beach Tennis fora do hor\u00e1rio de aula num hor\u00e1rio de minha escolha F7 US47 Eu, como visitante, desejo agendar um day-use, para poder jogar Beach Tennis num hor\u00e1rio de minha escolha F7 US48 Eu, como visitante, desejo visualizar o status de uma quadra na forma de agenda, para escolher um dia e hor\u00e1rio para agendar um day-use F8 US49 Eu, como usu\u00e1rio-coordenador, desejo criar um plano de aula, para poder administrar as aulas da arena F8 US50 Eu, como usu\u00e1rio-coordenador, desejo poder visualizar um plano de aula, para procurar por poss\u00edveis erros F8 US51 Eu, como usu\u00e1rio-coordenador, desejo poder excluir um plano de aula, para apagar planos de aula que estiverem obsoletos F8 US52 Eu, como usu\u00e1rio-coordenador, desejo poder editar um plano de aula, para alterar planos de aula que estiverem com alguma informa\u00e7\u00e3o errada F8 US53 Eu, como usu\u00e1rio-coordenador, desejo baixar os planos de aulas, para conseguir envi\u00e1-los aos respons\u00e1veis pela verifica\u00e7\u00e3o dos planos, que s\u00e3o externos a arena F8 US54 Eu, como usu\u00e1rio-coordenador, desejo adicionar um ou mais drills a um plano de aula para declarar os diferentes drills presentes em um plano de aula F8 US55 Eu, como usu\u00e1rio-coordenador, desejo adicionar elementos gr\u00e1ficos a um drill para representar o treino em um exerc\u00edcio/circuito F8 US56 Eu, como usu\u00e1rio-coordenador, desejo deletar elementos gr\u00e1ficos de um drill para deletar um elemento adicionado erroneamente F8 US57 Eu, como usu\u00e1rio-coordenador, desejo editar as informa\u00e7\u00f5es de um drill para corrigir erros F8 US58 Eu, como usu\u00e1rio-coordenador, desejo deletar um drill obsoleto para n\u00e3o deixar drills obsoletos em um plano de aula F8 US59 Eu, como usu\u00e1rio-coordenador, desejo atribuir planos de aula a professores para informar a eles sobre como as aulas devem ser F8 US60 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todos os planos de aula para ter uma no\u00e7\u00e3o da quantidade de planos feitos F8 US61 Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todos os drills de um plano de aula para ter uma no\u00e7\u00e3o da quantidade de drills nesse plano F8 US62 Eu, como usu\u00e1rio-professor, desejo visualizar os planos de aula que me forem atribu\u00eddos para ter uma orienta\u00e7\u00e3o de como devem ser minhas aulas F9 US63 Eu, como usu\u00e1rio-professor, desejo visualizar o hor\u00e1rio e quadra das minhas aulas no formato de agenda para que eu possa organizar meu trabalho F9 US64 Eu, como usu\u00e1rio-professor, desejo visualizar a lista de alunos das minhas aulas para que eu possa ver as informa\u00e7\u00f5es das pessoas a quem darei aula F9 US65 Eu, como usu\u00e1rio-professor, desejo visualizar quais alunos notificaram que v\u00e3o faltar a aula para que eu possa reorganizar meu tempo caso todos alunos de uma aula tenham avisado que n\u00e3o v\u00e3o F9 US66 Eu, como usu\u00e1rio-professor, desejo visualizar os planos de aula compartilhados comigo para saber como ser\u00e1 minha aula

A partir desses crit\u00e9rios, as US foram avaliadas e os resultados obtidos indicam a import\u00e2ncia. Dessa forma, as US's com pontua\u00e7\u00e3o maior ou igual a 6 foram escolhidas. Abaixo est\u00e3o as US avaliadas:

Funcionalidade US Perspectiva de Neg\u00f3cio Entendimento T\u00e9cnico Total MVP F1 US01 4 3 7 Presente F1 US02 4 3 7 Presente F8 US49 4 3 7 Presente F8 US50 4 3 7 Presente F8 US51 4 3 7 Presente F8 US52 4 3 7 Presente F8 US54 4 3 7 Presente F8 US57 4 3 7 Presente F8 US58 4 3 7 Presente F8 US60 4 3 7 Presente F8 US61 4 3 7 Presente F8 US53 4 2 6 Presente F8 US55 4 2 6 Presente F8 US56 4 2 6 Presente F2 US03 2 3 5 F2 US04 2 3 5 F2 US06 2 3 5 F5 US21 3 2 5 F5 US22 3 2 5 F5 US23 3 2 5 F5 US26 3 2 5 F5 US27 3 2 5 F5 US28 3 2 5 F5 US29 3 2 5 F5 US30 3 2 5 F5 US31 3 2 5 F5 US32 3 2 5 F6 US33 3 2 5 F6 US34 3 2 5 F6 US35 3 2 5 F6 US36 3 2 5 F6 US37 3 2 5 F6 US38 3 1 5 F6 US39 3 1 5 F6 US40 3 2 5 F7 US41 3 2 5 F7 US42 3 2 5 F7 US43 3 2 5 F7 US44 3 2 5 F8 US59 3 2 5 F8 US62 3 2 5 F9 US64 2 3 5 F9 US66 2 3 5 F2 US05 2 2 4 F3 US07 1 3 4 F3 US08 1 3 4 F3 US10 1 3 4 F4 US11 1 3 4 F4 US12 1 3 4 F4 US13 1 3 4 F4 US14 1 3 4 F4 US15 1 3 4 F4 US16 1 3 4 F4 US17 1 3 4 F4 US18 1 3 4 F4 US19 1 3 4 F4 US20 1 3 4 F5 US24 3 1 4 F5 US25 3 1 4 F7 US45 3 1 4 F7 US46 3 1 4 F7 US47 3 1 4 F7 US48 3 1 4 F9 US63 2 1 4 F9 US65 2 2 4 F3 US09 1 2 3"},{"location":"us/","title":"User Stories - MPV","text":""},{"location":"us/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"

Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/11/2023 0.1 Cria\u00e7\u00e3o do documento Weslley Barros 22/11/2023 0.2 Atualiza\u00e7\u00e3o dos crit\u00e9rios de aceita\u00e7\u00e3o Jo\u00e3o, Luciano, Vict\u00f3rio

"},{"location":"us/#us001-criar-conta-de-administrador","title":"US001 - Criar conta de administrador","text":"

Descri\u00e7\u00e3o:

Eu, como usu\u00e1rio-coordenador, desejo criar minha conta para administrar a arena

Crit\u00e9rios de Aceita\u00e7\u00e3o:

  • Ao acessar a p\u00e1gina de cadastro, o usu\u00e1rio-coordenador deve fornecer as seguintes informa\u00e7\u00f5es: nome, endere\u00e7o de e-mail, senha e confirma\u00e7\u00e3o de senha.
  • O sistema deve validar se o endere\u00e7o de e-mail fornecido \u00e9 \u00fanico e ainda n\u00e3o est\u00e1 registrado no sistema.
  • A senha e a confirma\u00e7\u00e3o de senha devem coincidir
  • O email deve estar no formato \"nome@email.com\"
  • Todos os campos devem ser obrigat\u00f3rios
  • A senha deve ter no m\u00ednimo 6 caracteres
  • O nome deve ter no m\u00ednimo 4 caracteres
"},{"location":"us/#us002-fazer-login-como-administrador","title":"US002 - Fazer login como administrador","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo fazer login na minha conta para acessar as funcionalidades exclusivas de coordenador

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • Ao acessar a p\u00e1gina de login, o usu\u00e1rio-coordenador deve encontrar campos para inserir o endere\u00e7o de e-mail e senha.
  • Os campos e-mail e senha s\u00e3o obrigat\u00f3rios
  • O usu\u00e1rio deve receber uma mensagem de aviso, caso o email ou a senha estejam incorretos
"},{"location":"us/#us049-criar-plano-de-aula","title":"US049 - Criar plano de aula","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo criar um plano de aula, para poder administrar as aulas da arena.

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • Ao criar um plano de aula, o usu\u00e1rio-coordenador deve fornecer as informa\u00e7\u00f5es no t\u00edtulo.
  • O campo t\u00edtulo \u00e9 obrigat\u00f3rio.
  • O t\u00edtulo dever\u00e1 ter no m\u00ednimo 5 caracteres.
  • O campo objetivos dever\u00e1 ter, no m\u00e1ximo, 600 caracteres.
  • O campo observa\u00e7\u00f5es dever\u00e1 ter no m\u00e1ximo 500 caracteres.
  • O sistema deve criar os campos \"objetivos\" e \"observa\u00e7\u00f5es\" vazios.
"},{"location":"us/#us050-visualizar-plano-de-aula","title":"US050 - Visualizar plano de aula","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo poder visualizar um plano de aula, para procurar por poss\u00edveis erros.

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • O sistema deve permitir que o usu\u00e1rio consiga selecionar um plano de aula para conseguir visualizar o t\u00edtulo, a descri\u00e7\u00e3o, as observa\u00e7\u00f5es e os drills.
"},{"location":"us/#us051-excluir-plano-de-aula","title":"US051 - Excluir plano de aula","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo poder excluir um plano de aula, para apagar planos de aula que estiverem obsoletos

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • Ao selecionar a op\u00e7\u00e3o de exclus\u00e3o, o sistema deve solicitar uma confirma\u00e7\u00e3o antes de apagar o plano de aula.
  • O sistema deve retornar uma mensagem ao usu\u00e1rio confirmando a realiza\u00e7\u00e3o da a\u00e7\u00e3o
"},{"location":"us/#us052-editar-plano-de-aula","title":"US052 - Editar plano de aula","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo poder editar um plano de aula, para alterar planos de aula que estiverem com alguma informa\u00e7\u00e3o errada:

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • Os campos t\u00edtulo, objetivos e observa\u00e7\u00f5es do plano de aula devem ser edit\u00e1veis.
  • O sistema deve impedir o usu\u00e1rio de deixar o campo obrigat\u00f3rio \"t\u00edtulo\" vazio
  • O t\u00edtulo dever\u00e1 ter, no m\u00ednimo, 5 caracteres
  • O campo objetivos dever\u00e1 ter, no m\u00e1ximo, 600 caracteres
  • O campo observa\u00e7\u00f5es dever\u00e1 ter no m\u00e1ximo 500 caracteres
"},{"location":"us/#us053-baixar-planos-de-aula","title":"US053 - Baixar planos de aula","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo baixar os planos de aulas, para conseguir envi\u00e1-los aos respons\u00e1veis pela verifica\u00e7\u00e3o dos planos, que s\u00e3o externos a arena:

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • O sistema deve gerar um arquivo de download contendo as informa\u00e7\u00f5es completas do plano de aula com t\u00edtulo, objetivos, observa\u00e7\u00f5es e os drills.
  • Cada drill do plano de aula deve apresentar seu t\u00edtulo, descri\u00e7\u00e3o, observa\u00e7\u00f5es e a representa\u00e7\u00e3o gr\u00e1fica do treino.
  • O arquivo de download deve estar em um formato PDF.
"},{"location":"us/#us054-adicionar-drills","title":"US054 - Adicionar Drills","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo adicionar um ou mais drills a um plano de aula para declarar os diferentes drills presentes em um plano de aula

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • Devem ser informados os campos t\u00edtulo, descri\u00e7\u00e3o e observa\u00e7\u00f5es dos drills para adicion\u00e1-los ao plano de aula.
  • O campo \"T\u00edtulo\" \u00e9 obrigat\u00f3rio.
  • O t\u00edtulo dever\u00e1 ter entre 5 e 30 caracteres
  • A descri\u00e7\u00e3o do drill dever\u00e1 ter, no m\u00ednimo, 100 caracteres.
  • O campo observa\u00e7\u00f5es dever\u00e1 ter no m\u00e1ximo 500 caracteres
  • Quando um drill for criado, o sistema deve adicionar de forma autom\u00e1tica uma representa\u00e7\u00e3o gr\u00e1fica base do treino (s\u00f3 com a rede e a quadra) a esse drill.
"},{"location":"us/#us055-historia-do-usuario","title":"US055 - Hist\u00f3ria do Usu\u00e1rio","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo adicionar elementos gr\u00e1ficos a um drill para representar o treino em um exerc\u00edcio/circuito.

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • Deve ser permitir adicionar elementos gr\u00e1ficos como jogadores, cano alterado, arco,\u00a0cone\u00a0e\u00a0setas
  • Os elementos gr\u00e1ficos n\u00e3o podem ser sobrepostos na representa\u00e7\u00e3o dos drills
  • O sistema deve permitir que o usu\u00e1rio adicione, no m\u00e1ximo, 50 elementos gr\u00e1ficos a um drill
"},{"location":"us/#us056-deletar-elementos-graficos","title":"US056 - Deletar elementos gr\u00e1ficos","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio coordenador, desejo deletar elementos gr\u00e1ficos de um drill para deletar um elemento adicionado erroneamente.

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • O sistema deve permitir deletar elementos gr\u00e1ficos como jogadores, cano alterado, arco, cone e setas
"},{"location":"us/#us057-editar-drill","title":"US057 - Editar drill","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo editar as informa\u00e7\u00f5es de um drill para corrigir erros.

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • O sistema deve permitir editar os campos t\u00edtulo, descri\u00e7\u00e3o e observa\u00e7\u00f5es
  • O campo t\u00edtulo deve ter entre 5 e 30 caracteres
  • O campo descri\u00e7\u00e3o deve ter entre 10 e 500 caracteres
  • O campo observa\u00e7\u00f5es deve ter entre 0 e 500 caracteres
"},{"location":"us/#us058-deletar-drill","title":"US058 - Deletar drill","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo deletar um drill obsoleto para n\u00e3o deixar drills obsoletos em um plano de aula.

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • Ao selecionar a op\u00e7\u00e3o de exclus\u00e3o, o sistema deve solicitar uma confirma\u00e7\u00e3o antes de apagar o drill
  • O sistema deve fornecer uma notifica\u00e7\u00e3o para o usu\u00e1rio confirmando o sucesso da a\u00e7\u00e3o
"},{"location":"us/#us060-visualizar-planos-de-aula","title":"US060 - Visualizar planos de aula","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todos os planos de aula para ter uma no\u00e7\u00e3o da quantidade de planos feitos.

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • O sistema deve exibir os t\u00edtulos dos diferentes planos de aula
  • O sistema deve permitir ao usu\u00e1rio pesquisar planos de aula por uma parte de seus t\u00edtulos
  • O sistema deve permitir ao usu\u00e1rio informar um intervalo de tempo em dias (com um dia de in\u00edcio e um dia de fim) e filtrar os planos de aula cuja data de cria\u00e7\u00e3o se encontram nesse intervalo
  • O sistema deve permitir que a pesquisa por parte do t\u00edtulo e o filtro possam funcionar de maneira simult\u00e2nea e alternada
"},{"location":"us/#us061-visualizar-drills","title":"US061 - Visualizar drills","text":"

Descri\u00e7\u00e3o

Eu, como usu\u00e1rio-coordenador, desejo visualizar uma lista com todos os drills de um plano de aula para ter uma no\u00e7\u00e3o da quantidade de drills nesse plano

Crit\u00e9rios de Aceita\u00e7\u00e3o

  • O sistema deve permitir que o usu\u00e1rio-coordenador visualize os drills de um plano de aula espec\u00edfico
  • O sistema deve exibir os t\u00edtulos dos diferentes drills
"},{"location":"doc-visao/1.visao-produto/","title":"Vis\u00e3o do Produto","text":"VIS\u00c3O GERAL DO PRODUTO"},{"location":"doc-visao/1.visao-produto/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 14/9/2023 0.1 Cria\u00e7\u00e3o do documento Vict\u00f3rio L\u00e1zaro 23/9/2023 0.2 Corrigindo duplicidade no item \"Objetivos do Produto\" Weslley Barros 24/9/2023 0.3 Inser\u00e7\u00e3o das tecnologias e do diagrama de Ishikawa na Vis\u00e3o Geral do Produto Vict\u00f3rio L\u00e1zaro 24/10/2023 0.4 Corre\u00e7\u00e3o do Diagrama de Ishikawa e do Problema Principal Vict\u00f3rio L\u00e1zaro 01/11/2023 0.5 Altera\u00e7\u00e3o no problema principal do Diagrama de Ishikawa Vict\u00f3rio L\u00e1zaro"},{"location":"doc-visao/1.visao-produto/#problema","title":"Problema","text":"

Os desafios discutidos est\u00e3o relacionados ao contexto de uma empresa que oferece aulas de Beach Tennis e aluga suas quadras para uso externo quando estas n\u00e3o est\u00e3o em uso para as aulas regulares (day use). Conforme relatado em entrevista com o cliente, foram identificados quatro problemas principais.

O problema diz respeito ao uso de ferramentas inadequadas para planejamento dos drills (tamb\u00e9m conhecidos como treinos). Cada aula consiste em quatro tipos de drills: aquecimento, movimenta\u00e7\u00e3o, jogo sem saque e jogo completo. Atualmente, o coordenador das aulas \u00e9 respons\u00e1vel por elaborar manualmente os planos de aula com todos os drills, adaptando-os de acordo com o n\u00edvel dos alunos (iniciante, intermedi\u00e1rio ou avan\u00e7ado). Essa tarefa envolve a cria\u00e7\u00e3o de representa\u00e7\u00f5es visuais da quadra, incluindo a disposi\u00e7\u00e3o dos alunos, as trajet\u00f3rias das bolas, a divis\u00e3o das linhas da quadra e os equipamentos necess\u00e1rios, como o cano alterado, o arco e o cone. Este processo de cria\u00e7\u00e3o de drills consome um tempo significativo devido \u00e0 utiliza\u00e7\u00e3o de ferramentas de edi\u00e7\u00e3o de texto, como o Word. Como resultado, a elabora\u00e7\u00e3o das aulas \u00e9 demorada e os elementos inseridos nos drills nem sempre representam os equipamentos das aulas de maneira intuitiva.

Um problema adicional decorrente do planejamento dos drills \u00e9 a falta de padroniza\u00e7\u00e3o e legenda, o que leva a confus\u00f5es entre os professores. Esses professores frequentemente precisam entrar em contato com o coordenador para esclarecer d\u00favidas, o que pode resultar em interfer\u00eancias e atrasos nas aulas.

O terceiro problema reportado diz respeito ao ineficiente sistema de controle de presen\u00e7a dos alunos usado atualmente pela empresa. A empresa utiliza um sistema de registro de faltas que automaticamente marca aulas de reposi\u00e7\u00e3o para os alunos ausentes. No entanto, este sistema n\u00e3o leva em considera\u00e7\u00e3o as pol\u00edticas da empresa, que exigem que as aulas de reposi\u00e7\u00e3o sejam agendadas apenas se o aluno apresentar um atestado m\u00e9dico ou avisar com pelo menos vinte e quatro horas de anteced\u00eancia. Isso tem resultado no registro de aulas de reposi\u00e7\u00e3o para alunos que n\u00e3o atendem a esses requisitos, causando uma sobrecarga administrativa.

Outro problema \u00e9 a informalidade no gerenciamento do fluxo de pessoas durante o \"day-use\" - o per\u00edodo em que as quadras n\u00e3o est\u00e3o sendo usadas para aulas e podem ser utilizadas para jogos por alunos e p\u00fablico externo. Atualmente, n\u00e3o existe um controle desse processo. Isso inclui o controle de presen\u00e7a dos alunos durante o \"day-use\" e a falta de um registro claro sobre quais alunos ou pessoas externas est\u00e3o usando as quadras. Al\u00e9m disso, o agendamento para o uso das quadras \u00e9 realizado por meio de conversas via chat ou atendimento presencial, o que pode ser ineficiente e suscet\u00edvel a erros.

Para se entender a causa principal, que causa todos os problemas citados, foi utilizada a t\u00e9cnica do Diagrama de Ishikawa (Espinha de Peixe). O problema se sustenta sobre a inefici\u00eancia na gest\u00e3o de uma arena de Beach Tennis. Atrav\u00e9s do Diagrama de Ishikawa, foram encontradas 4 causas ra\u00edzes: Uso de ferramentas inadequadas para planejamento dos drills, Falta de padroniza\u00e7\u00e3o e legenda nos drills, Sistema de controle de presen\u00e7a ineficiente e Informalidade no agendamento do uso das quadras no day use. O diagrama feito pela equipe pode ser visualizado na figura 1.

Figura 1 - Diagrama de Ishikawa do Problema

Fonte: Autores (2023)

"},{"location":"doc-visao/1.visao-produto/#declaracao-de-posicao-do-produto","title":"Declara\u00e7\u00e3o de Posi\u00e7\u00e3o do Produto","text":"

O Beach Tennis CoordiMate \u00e9 uma ferramenta completa para planejamento, controle de presen\u00e7a e controle de uso de quadras esportivas para atender a gest\u00e3o de uma arena de Beach Tennis.

Ao contr\u00e1rio de outras ferramentas, como o Microsoft Word para o planejamento de aulas e sistemas de controle de presen\u00e7a como o Sistema Pacto, o Beach Tennis CoordiMate foi desenvolvido especificamente para atender \u00e0s necessidades \u00fanicas dos instrutores e organizadores de Beach Tennis. Ele n\u00e3o apenas automatiza tarefas, mas tamb\u00e9m oferece recursos avan\u00e7ados, como cria\u00e7\u00e3o de drills, padroniza\u00e7\u00e3o de comunica\u00e7\u00f5es com professores, respeito \u00e0s regras de neg\u00f3cio da empresa nas marca\u00e7\u00f5es de aulas de reposi\u00e7\u00e3o e uma gest\u00e3o eficiente do uso da quadras fora do per\u00edodo de aula. Nossa plataforma se destaca por integrar todas essas funcionalidades em uma \u00fanica plataforma, proporcionando a voc\u00ea uma solu\u00e7\u00e3o completa e eficaz.

Com o Beach Tennis CoordiMate, voc\u00ea economiza tempo valioso, reduz erros administrativos e, o mais importante, melhora a experi\u00eancia de seus alunos. Isso torna todo o processo de organiza\u00e7\u00e3o mais organizado e eficaz, resultando em clientes satisfeitos e aulas bem-sucedidas. Toda essa descri\u00e7\u00e3o da aplica\u00e7\u00e3o est\u00e1 resumida na tabela 1.

Tabela 1 - Declara\u00e7\u00e3o de Posi\u00e7\u00e3o do Produto

Para Organizadores do Beach Tennis Quem Necessita de mais efici\u00eancia no gerenciamento de clientes O Beach Tennis CoordiMate \u00c9 um aplica\u00e7\u00e3o web de planejamento e controle de presen\u00e7a de aulas de Beach Tennis, al\u00e9m de gerenciar o uso de quadras e tamb\u00e9m serve de ferramenta de comunica\u00e7\u00e3o entre o aluno e a empresa. Que Oferece uma maneira eficiente e conveniente de planejar e coordenar todas as atividades relacionadas \u00e0s aulas de Beach Tennis, desde o planejamento dos drills at\u00e9 o controle de presen\u00e7a dos alunos. Com isso, voc\u00ea economiza tempo valioso, reduz erros administrativos e melhora a experi\u00eancia de seus alunos, tornando o processo mais organizado e eficaz. Ao contr\u00e1rio Do Microsoft Word, para planejar aulas, e tamb\u00e9m o sistema de controle de presen\u00e7a em aulas de crossfit Sistema Pacto para controlar presen\u00e7a e que marca aulas sem permiss\u00e3o do usu\u00e1rio. Nosso produto Automatiza e integra v\u00e1rias tarefas em uma \u00fanica plataforma. Ele oferece recursos avan\u00e7ados de cria\u00e7\u00e3o de drills, padroniza\u00e7\u00e3o das comunica\u00e7\u00f5es com os professores, garantia de conformidade nas marca\u00e7\u00f5es de aulas de reposi\u00e7\u00e3o e uma gest\u00e3o eficiente do \"day-use\". Nenhuma outra solu\u00e7\u00e3o oferece essa combina\u00e7\u00e3o de recursos em uma \u00fanica plataforma.

Fonte: Autores (2023)

"},{"location":"doc-visao/1.visao-produto/#objetivos-do-produto","title":"Objetivos do Produto","text":"

O principal objetivo \u00e9 facilitar o planejamento de aulas de Beach Tennis e administra\u00e7\u00e3o de quadras. Os objetivos secund\u00e1rios s\u00e3o:

  • Padronizar e melhorar a comunica\u00e7\u00e3o entre coordenadores e professores, reduzindo conflitos e atrasos;
  • Garantir a conformidade nas marca\u00e7\u00f5es de aulas de reposi\u00e7\u00e3o, dando maior liberdade e controle para o usu\u00e1rio;
  • Gerenciar eficientemente o fluxo de pessoas durante o \"day-use\", proporcionando uma experi\u00eancia mais organizada e segura.
"},{"location":"doc-visao/1.visao-produto/#tecnologias-a-serem-utilizadas","title":"Tecnologias a Serem Utilizadas","text":"

Para o desenvolvimento do produto de software apresentado, a equipe utilizar\u00e1 as tecnologias listadas na tabela 2.

Tabela 2 - Tecnologias a Serem Utilizadas

Categoria Tecnologia Linguagem de programa\u00e7\u00e3o TypeScript, JavaScript Framework de frontend React Framework de backend PrismaORM, NodeJS Banco de dados PostgreSQL

Fonte: Autores (2023)

"},{"location":"doc-visao/1.visao-produto/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"
  • Material da disciplina disponivel no aprender
"},{"location":"doc-visao/2.requisitos/","title":"Requisitos Funcionais e N\u00e3o Funcionais","text":"REQUISITOS FUNCIONAIS E N\u00c3O FUNCIONAIS"},{"location":"doc-visao/2.requisitos/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 09/10/2023 0.1 Cria\u00e7\u00e3o do documento Luciano de Freitas 09/10/2023 0.2 Inser\u00e7\u00e3o dos requisitos funcionais e n\u00e3o funcionais Artur Rodrigues, Jo\u00e3o Barreto, Luciano de Freitas,Pablo, Vict\u00f3rio L\u00e1zaro, Weslley Barros 25/10/2023 0.3 Revis\u00e3o dos requisitos n\u00e3o funcionais Luciano de Freitas, Weslley Barros"},{"location":"doc-visao/2.requisitos/#requisitos-funcionais","title":"Requisitos Funcionais","text":"

Os requisitos funcionais foram realizados com a utiliza\u00e7\u00e3o da metodologia do Lean Inception para verifica\u00e7\u00e3o da vis\u00e3o do produto e dos objetivos do projeto, bem como na cria\u00e7\u00e3o das personas, estrutura\u00e7\u00e3o das jornadas das personas e brainstorming das funcionalidades. Todas essas atividades est\u00e3o presentes nesse Mural. Ao final desses processos obtiveram-se os requisitos funcionais presentes na Tabela 1.

Tabela 1 - Requisitos funcionais do produto

ID Descri\u00e7\u00e3o RF01 Criar plano de aula RF02 Visualizar plano de aula RF03 Baixar plano de aula RF04 Compartilhar plano de aula RF05 Cadastrar aluno RF06 Editar dados do aluno RF07 Desativar aluno RF08 Visualizar os alunos RF09 Criar turmas de alunos RF10 Editar alunos da turma RF11 Excluir turma RF12 Associar hor\u00e1rios a turmas, alunos ou day-use RF13 Informar status de uma quadra (limpeza, livre) RF14 Visualizar a quadra da aula RF15 Cadastrar professor RF16 Editar professor RF17 Desativar professor RF18 Verificar alunos da aula RF19 Realizar chamada dos alunos RF20 Verificar agenda de aulas RF21 Notificar aus\u00eancia na aula RF22 Remarcar aula RF23 Receber notifica\u00e7\u00e3o da data da aula de reposi\u00e7\u00e3o RF24 Visualizar os dias dispon\u00edveis para day-use RF25 Agendar day-use

Fonte: Autores, 2023

"},{"location":"doc-visao/2.requisitos/#requisitos-nao-funcionais","title":"Requisitos N\u00e3o Funcionais","text":"

Os requisitos n\u00e3o funcionais (RNF) foram realizados seguindo o modelo do URPS+, em que foi descoberto os requisitos n\u00e3o funcionais para cada tipo do modelo. O resultado desse procedimento est\u00e1 presente na Tabela 2 logo abaixo.

Tabela 2 - Requisitos n\u00e3o funcionais do produto

ID Tipo de RNF Descri\u00e7\u00e3o RNF01 Usabilidade O sistema deve ser acess\u00edvel pelos Navegadores Chrome e Safari RNF02 Implementa\u00e7\u00e3o A arquitetura ser\u00e1 no modelo MVC (Model, View, Controller) RNF03 Implementa\u00e7\u00e3o O banco de dados do sistema deve ser modelado seguindo a 3\u00aa forma normal RNF04 Implementa\u00e7\u00e3o O servidor do sistema deve ser desenvolvido com o framework PrismaORM e TypeScript RNF05 Implementa\u00e7\u00e3o A interface do sistema deve ser desenvolvida com o framework ReactJS e TypeScript RNF06 Restri\u00e7\u00f5es de Design A comunica\u00e7\u00e3o entre\u00a0a Model e a Controller ocorrer\u00e1 atrav\u00e9s de protocolo HTTP RNF07 Interface A interface deve se adaptar dinamicamente a diferentes tamanhos de tela e orienta\u00e7\u00f5es, garantindo uma experi\u00eancia consistente em um iphone 11 e em um desktop padr\u00e3o de tela 1440x1024

Fonte: Autores, 2023

"},{"location":"doc-visao/2.visao-projeto/","title":"Vis\u00e3o do Projeto","text":"VIS\u00c3O GERAL DO PROJETO"},{"location":"doc-visao/2.visao-projeto/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/9/2023 0.1 Inser\u00e7\u00e3o dos itens de Vis\u00e3o Geral do Projeto Vict\u00f3rio L\u00e1zaro e Weslley Barros 26/9/2023 0.2 Realiza\u00e7\u00e3o das altera\u00e7\u00f5es pedidas no documento Vict\u00f3rio L\u00e1zaro 26/9/2023 0.3 Altera\u00e7\u00e3o na matriz de comunica\u00e7\u00e3o, adi\u00e7\u00e3o da tabela de Gerenciamento de Riscos e adi\u00e7\u00e3o de t\u00f3picos de Replanejamento Jo\u00e3o Barreto e Luciano de Freitas 24/10/2023 0.4 Altera\u00e7\u00e3o no planejamento de fases do projeto Vict\u00f3rio L\u00e1zaro 25/10/2023 0.5 Adiciona um engenheiro de requisitos e corrije a data da Sprint 0. Weslley Barros"},{"location":"doc-visao/2.visao-projeto/#organizacao-do-projeto","title":"Organiza\u00e7\u00e3o do Projeto","text":"

A tabela 1 apresenta uma vis\u00e3o geral da estrutura organizacional com foco em pap\u00e9is e responsabilidades dentro da equipe. Ela detalha os principais perfis, suas atribui\u00e7\u00f5es e as pessoas respons\u00e1veis por cada um desses pap\u00e9is, bem como os participantes associados.

Tabela 1 - Organiza\u00e7\u00e3o do Projeto

Perfil Atribui\u00e7\u00f5es Respons\u00e1vel Participantes L\u00edder/Scrum Master Assegurar que a equipe siga os princ\u00edpios e m\u00e9todos do Scrum. Luciano Freitas Artur Rodrigues, Jo\u00e3o Barreto, Pablo Santos, Victorio Lazaro e Weslley Barros Product Owner Respons\u00e1vel por definir e priorizar o backlog de produto, representando as necessidades do cliente e otimizando o valor entregue. Luciano Freitas Artur Rodrigues, Jo\u00e3o Barreto, Victorio Lazaro e Weslley Barros Desenvolvedores Respons\u00e1vel por projetar, codificar e testar funcionalidades, trabalhando juntos para alcan\u00e7ar metas da equipe Scrum. Weslley Barros Artur Rodrigues, Jo\u00e3o Barreto, Luciano Freitas, Pablo Santos e Victorio Lazaro Engenheiro de requisitos Respons\u00e1vel por realizar o levantamento, defini\u00e7\u00e3o, documenta\u00e7\u00e3o e manuten\u00e7\u00e3o dos requisitos Victorio Lazaro Artur Rodrigues, Jo\u00e3o Barreto, Luciano Freitas, Pablo Santos e Weslley Barros Cliente Respons\u00e1vel por fornece informa\u00e7\u00f5es sobre requisitos e expectativas, garantindo que o produto atenda \u00e0s suas necessidades. Mateus Mateus Monitor Respons\u00e1vel por retirar d\u00favidas, oferecer opini\u00f5es, acompanhar e, se necess\u00e1rio, ajudar a equipe para garantir a entrega de um\u00a0bom\u00a0trabalho. Jo\u00e3o Matheus Jo\u00e3o Matheus

Fonte: Autores (2023)

"},{"location":"doc-visao/2.visao-projeto/#planejamento-das-fases-eou-iteracoes-do-projeto","title":"Planejamento das Fases e/ou Itera\u00e7\u00f5es do Projeto","text":"

A tabela 2 apresenta um resumo das sprints e entregas relacionadas ao nosso projeto. As informa\u00e7\u00f5es incluem o n\u00famero da sprint, o nome da entrega associada, a data de in\u00edcio da sprint e a data de conclus\u00e3o da sprint. Utilize esta tabela para acompanhar o progresso do projeto e garantir que todas as tarefas sejam conclu\u00eddas dentro do prazo estabelecido.

Tabela 2 - Cronograma do Projeto

Sprint Entrega Data de in\u00edcio Data de fim Sprint 0 Defini\u00e7\u00e3o do problema e solu\u00e7\u00e3o 03/09/2023 09/09/2023 Sprint 1 Defini\u00e7\u00e3o do produto, projeto e tecnologias 10/09/2023 16/09/2023 Sprint 2 Metodologia, processos, procedimentos e alinhamento do produto 17/09/2023 23/09/2023 Sprint 3 Vis\u00e3o do Produto e Projeto 24/09/2023 30/09/2023 Sprint 4 Defini\u00e7\u00e3o dos Requisitos do Produto 01/10/2023 07/10/2023 Sprint 5 Defini\u00e7\u00e3o do Backlog SAFE do Produto 08/10/2023 14/10/2023 Sprint 6 Prioriza\u00e7\u00e3o das US's e defini\u00e7\u00e3o do MVP 15/10/2023 21/10/2023 Sprint 7 Valida\u00e7\u00e3o do Backlog SAFE do Produto 22/10/2023 28/10/2023 Sprint 8 Refatora\u00e7\u00e3o e valida\u00e7\u00e3o do MVP 29/10/2023 04/11/2023 Sprint 9 Defini\u00e7\u00e3o dos crit\u00e9rios de aceita\u00e7\u00e3o das hist\u00f3rias 05/11/2023 11/11/2023 Sprint 10 Defini\u00e7\u00e3o dos crit\u00e9rios de DOR e DOD 12/11/2023 18/11/2023 Sprint 11 US01, US02, US49, US50 19/11/2023 25/11/2023 Sprint 12 US51, US52, US54, US57, US58 26/11/2023 02/12/2023 Sprint 13 US60, US61, US53, US55, US56 03/12/2023 09/12/2023

Fonte: Autores (2023)

"},{"location":"doc-visao/2.visao-projeto/#matriz-de-comunicacao","title":"Matriz de Comunica\u00e7\u00e3o","text":"

A matriz de comunica\u00e7\u00e3o tem por objetivo auxiliar a equipe na organiza\u00e7\u00e3o da execu\u00e7\u00e3o do projeto, uma vez que ela consiste em definir quais informa\u00e7\u00f5es ser\u00e3o compartilhadas, as pessoas que as receber\u00e3o e a frequ\u00eancia em que essa comunica\u00e7\u00e3o ocorrer\u00e1, como \u00e9 mencionado no PMBOK (2017)\u00b9.

Esta se\u00e7\u00e3o descreve a estrat\u00e9gia de comunica\u00e7\u00e3o adotada para monitoramento do progresso do projeto como mostrado na tabela 3.

Tabela 3 - Matriz de Comunica\u00e7\u00e3o

Descri\u00e7\u00e3o \u00c1rea/Envolvidos Periodicidade Produtos Gerados Planejamento das atividades Equipe do projeto Semanal Planejamento do que ser\u00e1 feito no ciclo da sprint Acompanhamento das atividades Equipe do projeto Di\u00e1rio Relato por parte dos membros da equipe no whatsapp ou no discord sobre o andamento individual das partes do projeto Encontro com o cliente Product owner, cliente Quinzenal Valida\u00e7\u00e3o do produto Retrospectiva das atividades Equipe do projeto Semanal Identifica\u00e7\u00e3o de oportunidades de melhoria Comunicar situa\u00e7\u00e3o do projeto Equipe do projeto, professor Quinzenal Artefatos solicitados e rela\u00e7\u00e3o de feedbacks do professor

Fonte: Autores (2023)

"},{"location":"doc-visao/2.visao-projeto/#gerenciamento-de-riscos","title":"Gerenciamento de Riscos","text":"

De acordo com o PMBOK (2017)\u00b9, risco \u00e9 um evento ou condi\u00e7\u00e3o que pode ter impacto positivo ou negativo em um projeto de software, podendo levar a atrasos ou preju\u00edzos. Portanto, o gerenciamento de risco \u00e9 crucial para garantir o sucesso do projeto, a tabela 4 abaixo traz informa\u00e7\u00f5es sobre os principais riscos do projeto e as a\u00e7\u00f5es para mitig\u00e1-los.

Tabela 4 - Gerenciamento de Riscos

Tipos de Risco Descri\u00e7\u00e3o Probabilidade Mitiga\u00e7\u00e3o Risco de problemas de sa\u00fade Em algum momento, algum dos integrantes pode ter que se afastar devido a problemas de sa\u00fade, o que prejudicaria o desenvolvimento do projeto. M\u00e9dia - Os demais membros da equipe podem repartir as fun\u00e7\u00f5es que seria(m) exercida(s) pelo(s) membro(s) ausente(s), devido a exist\u00eancia de algum problema desse tipo. Risco de abandono A equipe pode n\u00e3o querer continuar o trabalho e abandon\u00e1-lo, devido \u00e0 sua complexidade ou algum membro pode desistir da disciplina. M\u00e9dia - Diminui\u00e7\u00e3o do espoco do projeto e realoca\u00e7\u00e3o de responsabilidades da equipe. - Manter sempre uma boa comunica\u00e7\u00e3o com os membros para que eles possam esclarecer poss\u00edveis problemas que afetariam o desenvolvimento do projeto, para que os demais possam ajud\u00e1-lo ou substitu\u00ed-lo em caso de desist\u00eancia. Risco de escopo A solu\u00e7\u00e3o proposta pode n\u00e3o satisfazer aos requisitos propostos, levando \u00e0 constru\u00e7\u00e3o de um projeto que n\u00e3o atende \u00e0s necessidades do cliente. Alta - Realizar reuni\u00f5es frequentes com o cliente, mostrando aquilo que est\u00e1 sendo elaborado naquela etapa, para que haja um feedback frequente. Risco de prazo de entrega O prazo determinado para a execu\u00e7\u00e3o do projeto pode n\u00e3o ser o suficiente para a realiza\u00e7\u00e3o de determinada entrega, devido a baixa produtividade dos membros da equipe e/ou dimensionamento incorreto do escopo da itera\u00e7\u00e3o e dos MVPs. Alta - Criar um cronograma que possua em que as entregas sejam realizadas antes do prazo estipulado, dando uma margem de tempo para corre\u00e7\u00e3o de poss\u00edveis problemas.- Comunica\u00e7\u00e3o antecipada com o cliente sobre o problema surgido. Comunica\u00e7\u00e3o Ineficiente entre stakeholders A falta de comunica\u00e7\u00e3o clara e efetiva entre os stakeholders pode levar a perda ou m\u00e1 interpreta\u00e7\u00e3o de informa\u00e7\u00f5es importantes. Isso pode causar atrasos e custos adicionais no projeto. M\u00e9dia - Estabelecer reuni\u00f5es quinzenais com o cliente e deixar claro as expectativas da equipe e do cliente quanto ao projeto ao decorrer do processo. Comunica\u00e7\u00e3o ineficiente entre os integrantes da equipe Quando a comunica\u00e7\u00e3o n\u00e3o \u00e9 efetiva, a equipe pode ter dificuldades em colaborar, alcan\u00e7ar seus objetivos e atender \u00e0s expectativas do cliente. M\u00e9dia - A equipe deve apresentar disponibilidade e transpar\u00eancias nas reuni\u00f5es estabelecidas nas sprints do projeto e sempre comunicar em caso de dificuldade em qualquer problema que apare\u00e7a Sobrecarga de trabalho de membros da equipe Os integrantes da equipe podem ser sobrecarregados com as demandas de entrega do projeto. M\u00e9dia - \u00c9 importante que o gerente do projeto defina claramente as responsabilidades de cada membro da equipe. Isso ajuda a evitar situa\u00e7\u00f5es em que uma pessoa \u00e9 sobrecarregada com tarefas que n\u00e3o s\u00e3o de sua responsabilidade.

Fonte: Autores (2023)

"},{"location":"doc-visao/2.visao-projeto/#criterios-de-replanejamento","title":"Crit\u00e9rios de Replanejamento","text":"

S\u00e3o condi\u00e7\u00f5es que podem ocorrer durante o projeto que exijam uma revis\u00e3o e adapta\u00e7\u00e3o do planejamento original. Deve ser feito o acompanhamento desses crit\u00e9rios a cada sprint, garantindo a qualidade do projeto at\u00e9 sua finaliza\u00e7\u00e3o.

  • Mudan\u00e7as significativas no cronograma: O prazo para a entrega do projeto pode ser alterado, afetando o planejamento realizado inicialmente. Para isso, \u00e9 importante que a equipe seja capaz de mensurar quais partes do projeto podem ser entregues com esse novo cronograma.
  • Altera\u00e7\u00e3o nos requisitos: Pode ser que ao longo do projeto surjam novas necessidades, diante disso, \u00e9 importante que a equipe esteja preparada para lidar com essas altera\u00e7\u00f5es, avaliando seus impactos e definindo um plano adequado.
  • Riscos n\u00e3o previstos: Mesmo com um planejamento bem feito, sempre existe a possibilidade de que riscos n\u00e3o previstos ocorram durante o projeto. A equipe deve estar preparada para identificar esses riscos e definir um plano de a\u00e7\u00e3o para ameniz\u00e1-los.
  • Atrasos: \u00c9 importante que o planejamento do projeto seja realista e que a equipe trabalhe dentro dos prazo e metas estabelecidos, trabalhando de forma colaborativa visando maximizar a produtividade.
  • Altera\u00e7\u00e3o no backlog: Caso a comunica\u00e7\u00e3o com o cliente seja ineficiente e o cliente se sinta insatisfeito com os entreg\u00e1veis apresentados pela equipe, \u00e9 necess\u00e1rio marcar reuni\u00f5es com o cliente para que a equipe alinhe sua vis\u00e3o do projeto com a do cliente e altere o backlog caso necess\u00e1rio.
  • Problemas com a qualidade: Pode ser que aplica\u00e7\u00e3o desenvolvida contenha erros que passaram despercebidos no teste ou algum problema de usabilidade que poderia ser corrigido. Assim, a equipe dever\u00e1 replanejar suas atividades, reconhecer os erros/problemas e elaborar uma nova solu\u00e7\u00e3o
"},{"location":"doc-visao/2.visao-projeto/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"
  1. PROJECT MANAGEMENT INSTITUTE. Guia PMBOK: um guia para o conjunto de conhecimentos em gerenciamento de projetos. 6. ed. Newtown Square, PA: Project Management Institute, 2017.
  2. Material da disciplina disponivel no aprender
"},{"location":"doc-visao/3.processo-dev/","title":"Processo de Desenvolvimento","text":"PROCESSO DE DESENVOLVIMENTO DE SOFTWARE"},{"location":"doc-visao/3.processo-dev/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 26/9/2023 0.1 Cria\u00e7\u00e3o do documento Luciano de Freitas 26/9/2023 0.2 Adiciona Abordagem, Ciclo de Vida e Processo Luciano de Freitas 27/9/2023 0.3 Insere as caracter\u00edsticas do processo que ser\u00e3o desenvolvidos pela equipe Luciano de Freitas 15/11/2023 0.4 Revis\u00e3o das caracter\u00edsticas do processo Luciano de Freitas"},{"location":"doc-visao/3.processo-dev/#abordagem-de-desenvolvimento-do-software","title":"Abordagem de Desenvolvimento do Software","text":"

Segundo Sommerville(2018)\u00b9, para decidir sobre uma abordagem para o desenvolvimento de um software \u00e9 necess\u00e1rio responder a uma s\u00e9rie de perguntas, de tr\u00eas tipos diferentes:

  1. Quest\u00f5es t\u00e9cnicas relacionadas ao sistema a ser desenvolvido
  2. Quest\u00f5es humanas relacionadas \u00e0 equipe de desenvolvimento
  3. Quest\u00f5es organizacionais relacionadas ao contexto no qual o sistema ser\u00e1 desenvolvido
"},{"location":"doc-visao/3.processo-dev/#questoes-tecnicas","title":"Quest\u00f5es t\u00e9cnicas","text":"
  1. Qual \u00e9 o tamanho do sistema que est\u00e1 sendo desenvolvido?

Um sistema de pequeno porte.

  1. Que tipo de sistema est\u00e1 sendo desenvolvido?

Uma aplica\u00e7\u00e3o web de complexidade m\u00e9dia, com requisitos n\u00e3o muito bem definidos e que podem ser alterados durante o desenvolvimento.

  1. Qual \u00e9 a vida \u00fatil prevista para o sistema?

A princ\u00edpio, vida \u00fatil de curto a m\u00e9dio per\u00edodo.

  1. O sistema est\u00e1 sujeito a controle externo?

Sim, sujeito ao controle do cliente e do acompanhamento da disciplina.

"},{"location":"doc-visao/3.processo-dev/#questoes-humanas","title":"Quest\u00f5es humanas","text":"
  1. Qual \u00e9 o n\u00edvel de compet\u00eancia dos projetistas e programadores do time de desenvolvimento?

Os projetistas possuem conhecimento em \u00e1reas diversas do desenvolvimento de software.

  1. Como est\u00e1 organizado o time de desenvolvimento?

O time \u00e9 pequeno, e apesar de terem pap\u00e9is definidos, todos devem participar da maioria das atividades.

  1. Quais s\u00e3o as tecnologias dispon\u00edveis para apoiar o desenvolvimento do sistema?

Os escopo tecnol\u00f3gico do projeto est\u00e1 melhor descrito nesta se\u00e7\u00e3o.

"},{"location":"doc-visao/3.processo-dev/#questoes-organizacionais","title":"Quest\u00f5es organizacionais","text":"
  1. \u00c9 importante ter uma especifica\u00e7\u00e3o e um projeto (design) bem detalhados antes de passar para a implementa\u00e7\u00e3o \u2014 talvez por motivos contratuais?

N\u00e3o, existem partes da aplica\u00e7\u00e3o que podem ser resolvidos sem especifica\u00e7\u00f5es de design.

  1. \u00c9 realista uma estrat\u00e9gia de entrega incremental, na qual o software \u00e9 entregue aos clientes ou outros stakeholders e um r\u00e1pido feedback \u00e9 obtido?

Sim, pois dessa forma \u00e9 poss\u00edvel corrigir os problemas por partes, antes de uma implementa\u00e7\u00e3o completa do projeto, a qual poderia comprometer todo o produto.

  1. Os representantes do cliente estar\u00e3o dispon\u00edveis e dispostos a participar do time de desenvolvimento?

N\u00e3o, os representantes do cliente participar\u00e3o apenas no envio de feedbacks durante as fases de constru\u00e7\u00e3o, n\u00e3o participando do desenvolvimento em si.

  1. Existem quest\u00f5es culturais que possam afetar o desenvolvimento do sistema?

N\u00e3o, pois o time \u00e9 novo e n\u00e3o tem apego a determinado m\u00e9todo de desenvolvimento.

"},{"location":"doc-visao/3.processo-dev/#conclusoes","title":"Conclus\u00f5es","text":"

Levando em considera\u00e7\u00e3o as respostas das quest\u00f5es acima e outros fatores elencados pela equipe, foi decidido que a abordagem de desenvolvimento do software ser\u00e1 a Abordagem \u00c1gil*, pelos seguintes crit\u00e9rios:*

  • Complexidade ainda n\u00e3o mensurada e imprevis\u00edvel das funcionalidades do sistema;
  • Proximidade com o cliente e a possibilidade de feedbacks r\u00e1pidos, al\u00e9m de n\u00e3o ser necess\u00e1rio uma formaliza\u00e7\u00e3o acentuada dos requisitos e do projeto como um todo;
  • Time de desenvolvimento pequeno para um sistema de pequeno porte para um projeto de ciclo curto/m\u00e9dio;
"},{"location":"doc-visao/3.processo-dev/#ciclo-de-vida-e-processo-de-desenvolvimento-do-software","title":"Ciclo de Vida e Processo de Desenvolvimento do Software","text":"

Como a abordagem de desenvolvimento escolhida foi a Abordagem \u00c1gil, o ciclo de vida do software ser\u00e1 o Ciclo de Vida \u00c1gil*, pois o desenvolvimento do software ser\u00e1 feito em incrementos, com entregas parciais e cont\u00ednuas, com o objetivo de atender as necessidades do cliente e se favorecer da disponibilidade de feedbacks constantes.*

O processo de desenvolvimento do software ser\u00e1 o Scrum/XP*, que a uni\u00e3o de duas metodologias complementares: O Scrum e o eXtreme Programming (XP). A metodologia Scrum servir\u00e1 para organiza\u00e7\u00e3o e adapta\u00e7\u00e3o da equipe de desenvolvimento durante o projeto, o XP servir\u00e1 para a execu\u00e7\u00e3o das atividades de desenvolvimento do software.*

A escolha desse processo de software tem o objetivo de gerar uma melhor adapta\u00e7\u00e3o do projeto a mudan\u00e7as de requisitos e de escopo, al\u00e9m de potencializar a participa\u00e7\u00e3o do cliente por meio dos feedbacks constantes, todas caracter\u00edsticas identificadas no projeto em quest\u00e3o.

"},{"location":"doc-visao/3.processo-dev/#caracteristicas-e-adaptacoes-do-processo-escolhido","title":"Caracter\u00edsticas e Adapta\u00e7\u00f5es do Processo Escolhido","text":""},{"location":"doc-visao/3.processo-dev/#scrum","title":"Scrum","text":"

Todos os rituais e artefatos do Scrum que ser\u00e3o utilizados no projeto est\u00e3o descritos na tabela 1, logo abaixo, seguindo as defini\u00e7\u00f5es do The Scrum Guide(2020)\u00b2.

Tabela 1 - Caracter\u00edsticas do Scrum a serem trabalhadas no projeto

Rituais/Artefatos Descri\u00e7\u00e3o Sprints As sprints ter\u00e3o dura\u00e7\u00e3o de 1 semana, sempre iniciando e finalizando aos s\u00e1bados. Sprint Planning As plannings ocorrer\u00e3o sempre aos s\u00e1bados no in\u00edcio da sprint atrav\u00e9s de reuni\u00f5es s\u00edncronas. Para crit\u00e9rios de simplifica\u00e7\u00e3o, a Sprint Planning ser\u00e1 incorporada a Release Planning do XP. Daily Scrum Ser\u00e3o feitas de forma ass\u00edncrona todos os dias pela equipe de desenvolvimento no decorrer da sprint. Sprint Retrospective As Retrospectives ser\u00e3o realizadas as quartas-feiras, por conta de disponibilidade da equipe. Sprint Review A review da sprint ocorrer\u00e1 no \u00faltimo dia da Sprint, aos s\u00e1bados, antes do in\u00edcio da pr\u00f3xima Planning. Product Backlog O Backlog ser\u00e1 utilizado para elencar e estruturar o conjunto inicial de requisitos do projeto e ser\u00e1 utilizado ao longo do projeto para novos requisitos encontrados. Sprint Backlog Esse artefato servir\u00e1 para definir os requisitos que ser\u00e3o desenvolvidos e entregues para a pr\u00f3xima release. Definition Of Done (DoD) Esse compromisso do Scrum ser\u00e1 utilizado para verificar e validar que os incrementos fazem sentido para o produto.

Fonte: Autores (2023)

"},{"location":"doc-visao/3.processo-dev/#extreme-programming-xp","title":"eXtreme Programming (XP)","text":"

As caracter\u00edsticas do XP que ser\u00e3o utilizadas no projeto est\u00e3o descritas na tabela 2, seguindo as informa\u00e7\u00f5es fornecidas por Don Wells(2013)\u00b3 sobre eXtreme Programming.

Tabela 2 - Caracter\u00edsticas do XP a serem trabalhadas no projeto

Caracter\u00edstica Descri\u00e7\u00e3o User Stories (US) As US ser\u00e3o a principal fonte de requisitos do projeto e auxiliaram para estimar os prazos para as entregas das funcionalidade do produto. Release Planning A Release Planning servir\u00e1 para definir o Backlog da Sprint de quais US ser\u00e3o implementadas. Devido ao espoco da disciplina de Requisitos as releases ser\u00e3o planejadas por prazos (by date). Al\u00e9m disso, a Sprint Planning do Scrum ser\u00e1 englobada pela Release Planning por crit\u00e9rios de simplifica\u00e7\u00e3o. Velocity Tracking Tanto na Release Planning, como na Iteration Planning ser\u00e1 utilizado o Velocity Tracking para auxiliar na defini\u00e7\u00e3o dos prazos e nas estimativas de entrega das funcionalidades. Planning Poker M\u00e9todo para avalia\u00e7\u00e3o das hist\u00f3rias e consentimento acerca da US. Sustainable, Measurable, Predictable Pace O ritmo da equipe ser\u00e1 avaliado durante todas as etapas de projeto, principalmente atrav\u00e9s do Velocity Tracking e das Retrospectives do Scrum. Stand up Meetings Ser\u00e3o incorporadas as dailys do Scrum, com o prop\u00f3sito de responder as seguintes perguntas: O que foi feito ontem?; O que ser\u00e1 tentado hoje?; e Quais problemas est\u00e3o causando atrasos? Pair programming e Move people around O Pair Programming servir\u00e1 para melhoria na qualidade do produto, al\u00e9m de compartilhamento de experi\u00eancia pela equipe. Para isso, o Move People Around tamb\u00e9m ser\u00e1 muito \u00fatil, pois far\u00e1 com que toda a equipe esteja capacitada em todas as \u00e1reas do produto.

Fonte: Autores (2023)

"},{"location":"doc-visao/3.processo-dev/#organizacao-das-sprints","title":"Organiza\u00e7\u00e3o das sprints","text":"

A organiza\u00e7\u00e3o das sprints levou em conta as caracter\u00edsticas escolhidas para cada processo, a disponibilidade do cliente e da equipe do projeto, bem como as caracter\u00edsticas da disciplina de requisitos. Foi estabelecido uma etapa anterior aos ciclos do Scrum/XP, chamado de Pr\u00e9-planejamento*, em que ser\u00e1 estruturado o backlog inicial do produto utilizando as atividades de engenharia de requisitos, melhor descritos nesse artefato. A figura 1 abaixo mostra de forma visual a organiza\u00e7\u00e3o das sprints do projeto.*

Figura 1 - Organiza\u00e7\u00e3o das sprints do projeto

Fonte: Autores (2023)

"},{"location":"doc-visao/3.processo-dev/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"
  1. Sommerville, Ian Engenharia de software/ Ian Sommerville; tradu\u00e7\u00e3o Luiz Cl\u00e1udio Queiroz; revis\u00e3o t\u00e9cnica F\u00e1bio Levy Siqueira. 10. ed. S\u00e3o Paulo: Pearson Education do Brasil, 2018. T\u00edtulo original: Software engineering ISBN 978-65-5011-048-2 1. Engenharia de software I. Siqueira.
  2. The 2020 Scrum Guide TM. Scrum Guides, 2020. Dispon\u00edvel no link. Acesso em: 27 de setembro de 2023.
  3. WELLS, Don. Extreme Programming: A gentle introduction. Extreme Programming, 2013. Dispon\u00edvel no link. Acesso em: 27 de setembro de 2023.
"},{"location":"doc-visao/4.processo-requisitos/","title":"Processo de Engenharia de Requisitos","text":"PROCESSO DE ENGENHARIA DE REQUISITOS"},{"location":"doc-visao/4.processo-requisitos/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 26/9/2023 0.1 Cria\u00e7\u00e3o do documento Luciano de Freitas 26/9/2023 0.2 Documenta\u00e7\u00e3o dos processos de Engenharia de Requisitos Artur Rodrigues e Jo\u00e3o Barreto 27/9/2023 0.3 Refatora\u00e7\u00e3o e corre\u00e7\u00e3o da documenta\u00e7\u00e3o dos processos de Engenharia de Requisitos Artur Rodrigues, Jo\u00e3o Barreto e Luciano de Freitas 15/11/2023 0.4 Altera\u00e7\u00f5es nas atividades de ER do processo Luciano de Freitas"},{"location":"doc-visao/4.processo-requisitos/#processos-de-engenharia-de-requisitos-er","title":"Processos de Engenharia de Requisitos (ER)","text":"

Segundo MARSICANO (2023)\u00b9, o Processo de Engenharia de Requisitos define quais s\u00e3o as etapas essenciais para a constru\u00e7\u00e3o de um software, sendo aplicado em metodologias \u00e1geis ou em processos dirigidos a plano. A Figura 1 mostra as atividades pertencentes \u00e0 ER:

Figura 1 - Atividades da Engenharia de Requisitos

Fonte: MARSICANO, George (2023)

Como definido no artefato de Processo de Desenvolvimento de Software, a equipe escolheu pela metodologia Scrum/XP, em que as caracter\u00edsticas que ser\u00e3o obordadas para o projeto est\u00e3o descritas na parte de Caracter\u00edsticas e Adapta\u00e7\u00f5es do Processo Escolhido do mesmo artefato. Caracter\u00edsticas as quais ser\u00e3o citadas neste artefato e relacionadas aos processos de ER.

"},{"location":"doc-visao/4.processo-requisitos/#facetas-do-processo","title":"Facetas do processo","text":"

Uma vez que definidas as tarefas da Engenharia de Requisitos, \u00e9 necess\u00e1rio estabelecer uma abordagem ou procedimento para realiz\u00e1-las. No Handbook for the CPRE Foundation Level according to the IREB Standard, publicado pelo International Requirements Engineering Board (IREB), \u00e9 apresentado um m\u00e9todo para definir um processo de Engenharia de Requisitos com base na an\u00e1lise das diversas dimens\u00f5es desse processo. \u00c9 preciso analisar quais caracter\u00edsticas extremas de cada aspecto se relacionam com o conhecimento atual e as expectativas em rela\u00e7\u00e3o ao produto a ser desenvolvido. Com base nessa an\u00e1lise, juntamente com as defini\u00e7\u00f5es previamente estabelecidas sobre o ciclo de vida e o processo de desenvolvimento de software, \u00e9 poss\u00edvel estabelecer um processo a ser seguido para a execu\u00e7\u00e3o das atividades de Engenharia de Requisitos. A Figura 2 ilustra as diferentes dimens\u00f5es desse processo:

Figura 2 - Facetas da Engenharia de Requisitos.

Fonte: Handbook IREB CPRE Foundation Level, 2022

A partir da descri\u00e7\u00e3o das facetas, \u00e9 poss\u00edvel definir qual o melhor processo a ser utilizado no processo, sendo ent\u00e3o escolhido o modelo Participativo, que engloba as facetas: iterativo, explorat\u00f3rio e cliente espec\u00edfico. Essa escolha foi baseada nos seguintes requisitos:

  • O projeto ser\u00e1 desenvolvido em etapas de curto ciclo com um feedback cont\u00ednuo por parte do cliente;
  • Os requisitos do projeto n\u00e3o s\u00e3o totalmente conhecidos no in\u00edcio, havendo a necessidade de explor\u00e1-los ao longo de seu desenvolvimento;
  • O projeto est\u00e1 sendo feito para atender \u00e0s necessidades de um cliente espec\u00edfico. Logo, a participa\u00e7\u00e3o do mesmo \u00e9 de extrema import\u00e2ncia no desenvolvimento do produto.
"},{"location":"doc-visao/4.processo-requisitos/#ferramentas","title":"Ferramentas","text":"

As ferramentas foram selecionadas de modo a facilitar a comunica\u00e7\u00e3o entre os membros da equipe e alavancar, na medida do poss\u00edvel, a produtividade e criatividade. Nesse sentido, as ferramentas s\u00e3o as seguintes, listadas na Tabela 1:

Tabela 1 - Ferramentas utilizadas no projeto.

Logo Ferramenta Finalidade Discord Realizar as Sprints e Dailies Mural Ferramenta visual para atividades colaborativas remotas Canva Ferramenta visual para cria\u00e7\u00e3o de apresenta\u00e7\u00f5es e documentos de forma colaborativa Github e Gitpages Armazenar e apresentar a documenta\u00e7\u00e3o do projeto, bem como o c\u00f3digo-fonte do produto, al\u00e9m de organiza\u00e7\u00e3o das atividades da equipe. Microsoft Teams Realizar as reuni\u00f5es semanais e gravar os v\u00eddeos das apresenta\u00e7\u00f5es VSCode Programa\u00e7\u00e3o do projeto e edi\u00e7\u00e3o da github pages WhatsApp Manter a comunica\u00e7\u00e3o entre os integrantes Youtube Compartilhar apresenta\u00e7\u00f5es e disponibilizar as reuni\u00f5es semanais Figma Prototipa\u00e7\u00e3o do projeto

Fonte: Autores, 2023

"},{"location":"doc-visao/4.processo-requisitos/#atividades-de-engenharia-de-requisitos","title":"Atividades de Engenharia de Requisitos","text":"

As tabelas 2 a 6 mostram a rela\u00e7\u00e3o entre as atividades do Processo de Engenharia de Requisitos, a organiza\u00e7\u00e3o das sprints, os m\u00e9todos do Scrum e do XP utilizados, as ferramentas necess\u00e1rias e a defini\u00e7\u00e3o do que ser\u00e1 entregue naquela etapa.

"},{"location":"doc-visao/4.processo-requisitos/#pre-planejamento","title":"Pr\u00e9-planejamento","text":"

Tabela 2 - Processos da Engenharia de Requisitos (ER) envolvidos no Pr\u00e9-Planejamento

Atividades M\u00e9todos Ferramentas Entrega Elicita\u00e7\u00e3o e descoberta Entrevista com o cliente e Lean Inception Microsoft Teams, Discord, Whatsapp, Mural Lista de personas, conjunto de requisitos brutos An\u00e1lise e consenso Lean Inception e Brainstorming Discord, e Mural Lista de personas, conjunto de requisitos funcionais e n\u00e3o funcionais Declara\u00e7\u00e3o Estrutura\u00e7\u00e3o segundo o SAFe GitHub, Canva Backlog SAFe com hist\u00f3rias de usu\u00e1rio (US) e crit\u00e9rios de aceita\u00e7\u00e3o Organiza\u00e7\u00e3o e Atualiza\u00e7\u00e3o MoSCoW e pontua\u00e7\u00e3o por entendimento t\u00e9cnico das hist\u00f3rias GitHub, Canva Hist\u00f3rias de usu\u00e1rio priorizadas segundo valor de neg\u00f3cio e entedimento t\u00e9cnico Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o Checklist e revis\u00e3o informal de verifica\u00e7\u00e3o e valida\u00e7\u00e3o GitHub, Canva, Discord, Whatsapp Resultados dos checklist e feedbacks da revis\u00e3o

Fonte: Autores, 2023

"},{"location":"doc-visao/4.processo-requisitos/#release-planning","title":"Release Planning","text":"

Tabela 3 - Processos de ER envolvidos na Release Planning

Atividades M\u00e9todos Ferramentas Entrega Representa\u00e7\u00e3o Prototipagem Figma Prot\u00f3tipo de baixa fidelidade das hist\u00f3rias da release Declara\u00e7\u00e3o Hist\u00f3rias de usu\u00e1rio e crit\u00e9rios de aceita\u00e7\u00e3o GitHub US da sprint com crit\u00e9rios de aceita\u00e7\u00e3o Verifica\u00e7\u00e3o e Atualiza\u00e7\u00e3o INVEST e Definition of Ready Microsoft Teams e GitHub Checklist INVEST e DoR das US da sprint Organiza\u00e7\u00e3o e Atualiza\u00e7\u00e3o Pontos por hist\u00f3ria Microsoft Teams e GitHub US da sprint pontuadas por esfor\u00e7o e valor para entrarem na sprint

Fonte: Autores, 2023

"},{"location":"doc-visao/4.processo-requisitos/#sprint","title":"Sprint","text":"

Tabela 4 - Processos de ER envolvidos na Sprint

Atividades M\u00e9todos Ferramentas Entrega Elicita\u00e7\u00e3o e Descoberta Descoberta de novos requisitos durante o desenvolvimento do produto VSCode, Github e Whatsapp Conjunto de requisitos funcionais e n\u00e3o funcionais brutos trazidos da sprint An\u00e1lise e Consenso Conversa com o cliente e an\u00e1lise dos requisitos levantados durante a sprint Microsoft Teams e GitHub Conjuntos de requisitos funcionais e n\u00e3o funcionais para entrar no backlog do projeto Declara\u00e7\u00e3o Estrutura\u00e7\u00e3o dos requisitos no backlog SAFe GitHub Hist\u00f3rias de usu\u00e1rio dos requisitos levantados durante a sprint Organiza\u00e7\u00e3o e atualiza\u00e7\u00e3o Atualiza\u00e7\u00e3o do backlog do produto e do backlog da sprint Github Backlog da sprint atualizado e priorizado, bem como o backlog do produto

Fonte: Autores, 2023

"},{"location":"doc-visao/4.processo-requisitos/#sprint-review","title":"Sprint Review","text":"

Tabela 5 - Processos de ER envolvidos na Sprint Review

Atividades M\u00e9todos Ferramentas Entrega Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o Definition of Done Microsoft Teams, Whatsapp e GitHub DoD das US entregues na sprint Organiza\u00e7\u00e3o e atualiza\u00e7\u00e3o Organiza\u00e7\u00e3o e atualiza\u00e7\u00e3o do Backlog do produto Microsoft Teams e Github Backlog priorizado e atualizado para a pr\u00f3xima sprint

Fonte: Autores, 2023

"},{"location":"doc-visao/4.processo-requisitos/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"
  1. Material da disciplina disponivel no aprender
"},{"location":"doc-visao/5.licoes-aprendidas/","title":"Li\u00e7\u00f5es Aprendidas","text":"LI\u00c7\u00d5ES APRENDIDAS"},{"location":"doc-visao/5.licoes-aprendidas/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 26/9/2023 0.1 Cria\u00e7\u00e3o do documento Luciano de Freitas 26/9/2023 0.2 Adi\u00e7\u00e3o das li\u00e7\u00f5es aprendidas na Unidade 1 Artur Rodrigues 25/10/2023 0.3 Adi\u00e7\u00e3o das li\u00e7\u00f5es aprendidas na Unidade 2 Luciano de Freitas"},{"location":"doc-visao/5.licoes-aprendidas/#unidade-1","title":"Unidade 1","text":"

Nesta primeira unidade, com base nos feedbacks recebidos e atividades propostas, podemos extrair algumas li\u00e7\u00f5es aprendidas importantes no projeto. A equipe foi capaz de desenvolver o in\u00edcio do projeto de software, com a cria\u00e7\u00e3o do documento do produto, que abrange a vis\u00e3o geral do produto. Al\u00e9m disso, foi poss\u00edvel realizar a primeira itera\u00e7\u00e3o do projeto, com a cria\u00e7\u00e3o da p\u00e1gina de documenta\u00e7\u00e3o e a defini\u00e7\u00e3o das tecnologias a serem utilizadas. A equipe tamb\u00e9m foi capaz de realizar a primeira reuni\u00e3o com o cliente, onde foram discutidos os problemas e requisitos do sistema. Por fim, a equipe foi capaz de realizar a primeira retrospectiva, onde foram discutidos os pontos positivos e negativos da primeira miss\u00e3o.

Em rela\u00e7\u00e3o a comunica\u00e7\u00e3o e intera\u00e7\u00e3o entre os membros, \u00e9 not\u00e1vel que, por parte da maioria dos participantes do projeto, o feedback \u00e9 positivo e a comunica\u00e7\u00e3o est\u00e1 sendo efetiva. Por\u00e9m, alguns ajustes ainda devem ser feitos para que o projeto possa ser desenvolvido da forma mais eficiente poss\u00edvel. Al\u00e9m disso, o grupo vem se mostrando proativo nas entregas e as tarefas est\u00e3o bem divididas, o que demonstra organiza\u00e7\u00e3o e alinhamento nesse in\u00edcio de produ\u00e7\u00e3o.

Sendo assim, a equipe teve uma primeira miss\u00e3o de bastante aprendizado e de grande import\u00e2ncia para o desenvolvimento do projeto. A equipe conseguiu realizar as atividades propostas e, com isso, foi poss\u00edvel ter uma vis\u00e3o mais clara do que ser\u00e1 o projeto e quais ser\u00e3o os pr\u00f3ximos passos a serem tomados.

"},{"location":"doc-visao/5.licoes-aprendidas/#unidade-2","title":"Unidade 2","text":"

A segunda unidade foi um momento de entendimento de como estruturar as atividades de engenharia de requisitos (ER) em uma metodologia \u00e1gil j\u00e1 conhecida. A equipe observou ao longo da unidade a necessidade de uma etapa de pr\u00e9-planejamento do projeto, que consistiu no foco na realiza\u00e7\u00e3o de todas as atividades ER para defini\u00e7\u00e3o do backlog inicial, antes de iniciar os rituais e pr\u00e1ticas \u00e1geis. Tamb\u00e9m foi poss\u00edvel ter o entendimento que as entregas das metodologias \u00e1geis n\u00e3o se davam somente com a codifica\u00e7\u00e3o do produto, mas tamb\u00e9m com a documenta\u00e7\u00e3o e a realiza\u00e7\u00e3o de atividades de ER.

Por conta das novas descobertas ao longo do projeto, muitos questionamentos e d\u00favidas surgiram ao longo da unidade, principalmente no relacionamento entre as atividades de ER e as metodologias \u00e1geis. Por\u00e9m, aos poucos a equipe conseguiu sanar as d\u00favidas e realizar as atividades propostas.

"},{"location":"doc-visao/5.licoes-aprendidas/#unidade-3","title":"Unidade 3","text":"

Na Unidade 3 o grupo foi capaz de se aprofundar nos conceitos fundamentais do Product Backlog Building (PBB), Behavior Driven Developmente (BDD) e User Story Mapping (USM). Durante esse per\u00edodo de estudo, indentificamos a import\u00e2ncia crucial dessas pr\u00e1ticas no desenvolvimento de um software.

Com o PBB, compreendemos a essencialidade de construir e manter um backlog de produto din\u00e2mico e bem-priorizado. Isso n\u00e3o apenas nos permite adaptar os requisitos do produto, mas tamb\u00e9m facilita a identifica\u00e7\u00e3o de prioridades para o desenvolvimento. O BDD nos proporcionou uma nova perspectiva na defini\u00e7\u00e3o de comportamento do sistema. Por fim, o User Story Mapping (USM) nos mostrou como mapear e visualizar hist\u00f3rias de usu\u00e1rios, permitindo uma compreens\u00e3o mais clara das necessidades requisitadas.

Durante a Unidade 3, o grupo enfrentou desafios ao aplicar esses conceitos em cen\u00e1rios pr\u00e1ticos, mas gradativamente conseguimos super\u00e1-los. Vale ressaltar a import\u00e2ncia que a integra\u00e7\u00e3o dessas pr\u00e1ticas tem em aprimorar a comunica\u00e7\u00e3o e colabora\u00e7\u00e3o entre os membros da fac\u00e7\u00e3o.

Em suma, a Unidade 3 foi um marco significativo em nosso aprendizado, proporcionando insights valiosos sobre como utilizar o PBB, BDD e USM de maneira integrada para um processo de desenvolvimento de software mais eficaz e alinhado com as necessidades do cliente. Esses conceitos se revelaram ferramentas essenciais para garantir uma entrega mais eficiente, alinhada e centrada no usu\u00e1rio.

"},{"location":"doc-visao/5.licoes-aprendidas/#unidade-4","title":"Unidade 4","text":""},{"location":"doc-visao/5.licoes-aprendidas/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"
  1. Material da disciplina disponivel no aprender
"},{"location":"entregas/1.entrega-unidade1/","title":"Unidade 1","text":"Apresenta\u00e7\u00e3o da Vis\u00e3o Geral de Produto e Projeto"},{"location":"entregas/1.entrega-unidade1/#video-de-apresentacao","title":"V\u00eddeo de apresenta\u00e7\u00e3o","text":"

A entrega da Unidade 1 est\u00e1 presente no v\u00eddeo abaixo, mas tamb\u00e9m pode ser acessada aqui.

"},{"location":"entregas/2.entrega-unidade2/","title":"Unidade 2","text":"Pr\u00e9-planejamento: Engenharia de Requisitos"},{"location":"entregas/2.entrega-unidade2/#video-de-apresentacao","title":"V\u00eddeo de apresenta\u00e7\u00e3o","text":"

A entrega da Unidade 2 est\u00e1 presente no v\u00eddeo abaixo, mas tamb\u00e9m pode ser acessada aqui.

"},{"location":"entregas/2.entrega-unidade2/#verificacao-e-validacao-nutriguide-faccao-skywalkers","title":"Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o - Nutriguide (Fac\u00e7\u00e3o Skywalkers)","text":"

A atividade de verifica\u00e7\u00e3o e valida\u00e7\u00e3o dos requisitos foi feita para o projeto NutriGuide, da fac\u00e7\u00e3o Skywalkers, cuja documenta\u00e7\u00e3o pode ser acessada aqui.

"},{"location":"entregas/unidade-03/1.entrega-unidade3/","title":"Apresenta\u00e7\u00e3o","text":"Apresenta\u00e7\u00e3o do PBB, BDD, USM, DoR e DoD desenvolvidos sobre a fac\u00e7\u00e3o GBL"},{"location":"entregas/unidade-03/1.entrega-unidade3/#video-de-apresentacao","title":"V\u00eddeo de apresenta\u00e7\u00e3o","text":"

A entrega da Unidade 3 est\u00e1 presente no v\u00eddeo abaixo, mas tamb\u00e9m pode ser acessada aqui.

"},{"location":"entregas/unidade-03/2.pbb/","title":"PBB","text":""},{"location":"entregas/unidade-03/2.pbb/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/11/2023 0.1 Cria\u00e7\u00e3o do documento Jo\u00e3o Barreto

O Product Backlog Building (PBB) \u00e9 uma abordagem empregada no \u00e2mbito da gest\u00e3o \u00e1gil de projetos de software. Trata-se de uma estrat\u00e9gia para a constante elabora\u00e7\u00e3o e aprimoramento do Backlog do Produto, uma lista din\u00e2mica e priorizada que engloba todos os requisitos, funcionalidades, aprimoramentos e corre\u00e7\u00f5es essenciais para um produto. O PBB implica na cria\u00e7\u00e3o e atualiza\u00e7\u00e3o iterativa do backlog, incorporando novos elementos \u00e0 medida que s\u00e3o identificados, eliminando ou aperfei\u00e7oando aqueles que se tornam mais claros ou menos relevantes com o tempo, e priorizando-os com base no valor de neg\u00f3cio que proporcionam ao produto. Essa abordagem tem como objetivo manter o backlog constantemente alinhado com as demandas do produto e do cliente, viabilizando uma adapta\u00e7\u00e3o e evolu\u00e7\u00e3o mais eficazes ao longo do ciclo de desenvolvimento.

"},{"location":"entregas/unidade-03/2.pbb/#o-que-e-a-healthnet","title":"O que \u00e9 a HealthNet?","text":"

A HealthNet \u00e9 uma rede de cl\u00ednicas e hospitais que est\u00e1 passando por dificuldades no gerenciamento de seus dados. Os problemas e necessidades da HealthNet podem ser vistos de forma mais detalhada por meio deste link

"},{"location":"entregas/unidade-03/2.pbb/#pbb-guardioes-da-galaxia","title":"PBB - Guardi\u00f5es da Gal\u00e1xia","text":"

Com base no documento apresentado no t\u00f3pico acima, foi elaborado um PBB que atendesse as necessidades da HealthNet. Abaixo segue o quadro no Miro com esse PBB:

"},{"location":"entregas/unidade-03/3.pbb-revisao/","title":"PBB","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/11/2023 0.1 Cria\u00e7\u00e3o do documento Artur e Jo\u00e3o

O Product Backlog Building (PBB) \u00e9 uma t\u00e9cnica utilizada no contexto de gerenciamento \u00e1gil de projetos de software. Ele \u00e9 uma estrat\u00e9gia para a constru\u00e7\u00e3o e refinamento cont\u00ednuo do Product Backlog, uma lista din\u00e2mica e priorizada de todos os requisitos, funcionalidades, melhorias e corre\u00e7\u00f5es necess\u00e1rias para um produto. O PBB envolve a cria\u00e7\u00e3o e atualiza\u00e7\u00e3o iterativa do backlog, adicionando novos itens conforme s\u00e3o identificados, removendo ou refinando aqueles que se tornam mais claros ou menos relevantes ao longo do tempo e priorizando-os de acordo com o valor de neg\u00f3cio que oferecem ao produto. Essa t\u00e9cnica visa manter o backlog constantemente alinhado com as necessidades do produto e do cliente, permitindo uma melhor adapta\u00e7\u00e3o e evolu\u00e7\u00e3o durante o ciclo de desenvolvimento.

"},{"location":"entregas/unidade-03/3.pbb-revisao/#pbb-de-feedback","title":"PBB de Feedback","text":"

Os Crit\u00e9rios de Verifica\u00e7\u00e3o foram feitos com base na documenta\u00e7\u00e3o do problema e sua respectiva descri\u00e7\u00e3o. Segue abaixo uma lista dos crit\u00e9rios utilizados:

[ X ] Cont\u00e9m o nome do produto no PBB [ X ] Os problemas do cliente foram listados corretamente [ X ] As expectativas atendem aos problemas apresentados [ X ] As personas representam os perfis que utilizam o Health de alguma forma [ X ] \u00c9 definido o que as personas fazem e o que elas esperam [ X ] As funcionalidades s\u00e3o capazes de identificar a\u00e7\u00f5es e/ou intera\u00e7\u00f5es das personas com o produto [ X ] As funcionalidades resolvem os problemas das personas [ X ] As funcionalidades trazem benef\u00edcios para as personas [ X ] Os PBIs representam todas as funcionalidades [ X ] Cada PBI representa uma a\u00e7\u00e3o do usu\u00e1rio no produto [ X ] As PBIs foram priorizadas com rela\u00e7\u00e3o ao uso e ao valor de neg\u00f3cio [ X ] Os PBIs seguem uma sequ\u00eancia l\u00f3gica de organiza\u00e7\u00e3o [ X ] As USs est\u00e3o estruturadas no formato: \u201cEu, como persona, posso a\u00e7\u00e3o para valor de neg\u00f3cio

Em um contexto geral, o grupo atendeu \u00e0s necessidades do problema proposto. Por\u00e9m, existem algumas observa\u00e7\u00f5es a serem apontadas:

"},{"location":"entregas/unidade-03/3.pbb-revisao/#personas","title":"Personas","text":"

As atividades e objetivos das personas devem possuir uma granularidade menor, para que elas tenham uma maior especificidade e claridade.

"},{"location":"entregas/unidade-03/3.pbb-revisao/#user-stories","title":"User Stories","text":"

Abaixo seguem observa\u00e7\u00f5es para melhoria das User Stories:

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us01-como-gerenciador-de-consultas-posso-ser-capaz-de-agendar-consultas-com-diferentes-especialistas-para-que-eu-possa-ter-uma-visao-unificada-das-agendas-e-escolher-horarios-convenientes","title":"US01 - Como gerenciador de consultas, Posso ser capaz de agendar consultas com diferentes especialistas Para que eu possa ter uma vis\u00e3o unificada das agendas e escolher hor\u00e1rios convenientes.","text":"

Crit\u00e9rio de aceita\u00e7\u00e3o se refere a outra persona.

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us03-como-gerenciador-de-consultas-quero-ter-a-capacidade-de-acessar-um-painel-de-controle-que-exiba-as-agendas-de-todos-os-medicos-para-nao-ter-conflito-de-horario","title":"US03 - Como gerenciador de consultas, quero ter a capacidade de acessar um painel de controle que exiba as agendas de todos os m\u00e9dicos, para n\u00e3o ter conflito de hor\u00e1rio.","text":"

Crit\u00e9rios de aceita\u00e7\u00e3o est\u00e3o muitos espec\u00edficos e a User Story tamb\u00e9m \u00e9 muito espec\u00edfica e o para n\u00e3o \u00e9 a solu\u00e7\u00e3o direta de visualizar as agendas de todos os m\u00e9dicos

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us04-como-gerenciador-de-consultas-quero-receber-alertas-que-identifiquem-automaticamente-conflitos-de-agendamento-para-evitar-que-pacientes-tenham-que-ser-reagendados-devido-a-sobreposicoes","title":"US04 - Como gerenciador de consultas, quero receber alertas que identifiquem automaticamente conflitos de agendamento, Para evitar que pacientes tenham que ser reagendados devido a sobreposi\u00e7\u00f5es.","text":"

N\u00e3o seria melhor o sistema evitar uma marcagem de consulta em cima de outra? Essa US mais parece crit\u00e9rio de aceita\u00e7\u00e3o da US 1

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us05-como-recepcionista-eu-quero-ser-capaz-de-registrar-informacoes-dos-pacientes-no-sistema-para-manter-um-registro-organizado-dos-pacientes-que-visitam-a-healthnet","title":"US05 - Como recepcionista, eu quero ser capaz de registrar informa\u00e7\u00f5es dos pacientes no sistema, para manter um registro organizado dos pacientes que visitam a Healthnet.","text":"

Crit\u00e9rios de aceita\u00e7\u00e3o \u00f1 especificam quais informa\u00e7\u00f5es s\u00e3o cadastradas

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us09-como-paciente-posso-receber-notificacoes-de-consultas-proximas-para-tornar-mais-conveniente-a-comunicacao-com-pacientes","title":"US09 - Como paciente, posso receber notifica\u00e7\u00f5es de consultas pr\u00f3ximas para tornar mais conveniente a comunica\u00e7\u00e3o com pacientes.","text":"

N\u00e3o seria crit\u00e9iro de aceita\u00e7\u00e3o da US 8?

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us10-como-paciente-posso-visualizar-o-resultado-de-exames-realizados-para-que-possa-me-manter-informado-sobre-minha-saude","title":"US10 - Como paciente, posso visualizar o resultado de exames realizados para que possa me manter informado sobre minha sa\u00fade.","text":"

O 2\u00ba crit\u00e9rio de aceita\u00e7\u00e3o se refere a exame ou consulta? Porque s\u00e3o coisas diferentes

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us11-como-paciente-posso-receber-lembretes-sobre-medicamento-prescritos-para-que-possa-me-lembrar-de-toma-los","title":"US11 - Como paciente, posso receber lembretes sobre medicamento prescritos para que possa me lembrar de tom\u00e1-los.","text":"

N\u00e3o seria crit\u00e9rio de aceita\u00e7\u00e3o da US 13???

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us16-como-medico-posso-verificar-alergias-a-medicamentos-para-evitar-danos-a-saude-do-paciente","title":"US16 - Como m\u00e9dico, posso verificar alergias a medicamentos para evitar danos \u00e0 sa\u00fade do paciente.","text":"

US relacionada verificar alergias a medicamentos, por\u00e9m a maioria dos crit\u00e9rios est\u00e3o relacionados a cria\u00e7\u00e3o de prescri\u00e7\u00e3o de medicamento.

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us18-como-medico-posso-inserir-observacoes-sobre-o-paciente-para-acrescentar-informacoes-relevantes","title":"US18 - Como m\u00e9dico, posso inserir observa\u00e7\u00f5es sobre o paciente para acrescentar informa\u00e7\u00f5es relevantes.","text":"

Essas observa\u00e7\u00f5es sobre o paciente n\u00e3o s\u00e3o inseridas no prontu\u00e1rio m\u00e9dico?

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us23-como-farmaceutica-posso-cadastrar-prescricoes-atraves-da-digitalizacao-para-agilizar-e-reduzir-erros-no-cadastro-destes-documentos","title":"US23 - Como farmac\u00eautica Posso cadastrar prescri\u00e7\u00f5es atrav\u00e9s da digitaliza\u00e7\u00e3o Para agilizar e reduzir erros no cadastro destes documentos.","text":"

Gerar um json interfere na regra de neg\u00f3cio ?

"},{"location":"entregas/unidade-03/3.pbb-revisao/#us25-como-farmaceutica-posso-integrar-o-sistema-com-outras-farmacias-internas-para-melhorar-o-compartilhamento-de-informacoes","title":"US25 - Como farmac\u00eautica Posso integrar o sistema com outras farm\u00e1cias internas Para melhorar o compartilhamento de informa\u00e7\u00f5es.","text":"

integrar o sistema com outras farm\u00e1cias \u00e9 um requisito de alto n\u00edvel que deveria ser quebrado em v\u00e1rias hist\u00f3rias de usu\u00e1rio

"},{"location":"entregas/unidade-03/4.criterios-revisao/","title":"Ver&Val - Crit\u00e9rios de Aceita\u00e7\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/11/2023 0.1 Cria\u00e7\u00e3o do documento Artur

Somente esse crit\u00e9rio n\u00e3o \u00e9 suficiente para compreender e validar essa US. Faltaram crit\u00e9rios relacionados a: - quais infos tem em uma consulta a ser agendada - quando \u00e9 poss\u00edvel ou n\u00e3o agendar uma consulta - como deve ser feita o agendamento dessas consultas O crit\u00e9rio apresentado precisa trazer informa\u00e7\u00f5es de quais s\u00e3o os tipos de especialistas.

A hist\u00f3ria parece ser muito grande, acho que seria interessante quebrar em duas hist\u00f3rias: uma relacionada a acessar a lista de pacientes da cl\u00ednica ou algo do tipo, e outra relacionada a acessar o hist\u00f3rico de um paciente. Pouqu\u00edssimos crit\u00e9rios de aceita\u00e7\u00e3o para a hist\u00f3ria Tem que ter crit\u00e9rios relacionados a como o gerenciador consegue:

  • selecionar um paciente para visualizar o hist\u00f3rico dele
  • quais as infos exatas que ser\u00e3o mostradas nesse hist\u00f3rico
  • o que tem nesse resumo das consultas

Essas duas US seguem no mesmo modelo das outras duas apresentadas anteriormente

Que informa\u00e7\u00f5es o paciente coloca para realizar a consulta? quais tipos de consulta ele pode especificar? Trocaria \u201cvisualizar a marca\u00e7\u00e3o\u201d por ter uma confirma\u00e7\u00e3o que a consulta foi marcada

O crit\u00e9rio 3 e 4 s\u00e3o bem legais, pois mostra quando \u00e9 poss\u00edvel e n\u00e3o \u00e9 poss\u00edvel realizar a a\u00e7\u00e3o.

Nos crit\u00e9rios 1 e 2 eu trocaria a vis\u00e3o para ser a do paciente, como: \u201cO paciente deve ser capaz de selecionar se deseja receber notifica\u00e7\u00f5es\u201d \u201cO paciente deve ser capaz de selecionar o tempo de anteced\u00eancia para receber a notifica\u00e7\u00e3o\u201d

Mesma coisa da outra US, seria melhor ter a vis\u00e3o do ator da US do que do sistema. N\u00e3o d\u00e1 pra saber o que ter\u00e1 no resultado do exame, como por exemplo: tem a prescri\u00e7\u00e3o do m\u00e9dico? tem algum medicamento que deve ser tomado? tem algum exame a ser feito? \u00e9 s\u00f3 a confirma\u00e7\u00e3o que a consulta foi feita?

Quais as regras para o paciente receber uma notifica\u00e7\u00e3o? ele tem o poder de n\u00e3o querer receber o lembrete? como que esses lembretes s\u00e3o gerados? \u00e9 a partir da prescri\u00e7\u00e3o do m\u00e9dico?

Quais informa\u00e7\u00f5es t\u00eam no prontu\u00e1rio? O filtro por data em rela\u00e7\u00e3o ao que?

Acho legal deixar claro que as infos do crit\u00e9rio 2 est\u00e1 relacionado a cada medicamento do hist\u00f3rico Poderia ter um crit\u00e9rio para dizer quais informa\u00e7\u00f5es t\u00eam nesse hist\u00f3rico, podendo, por exemplo, quebrar o crit\u00e9rio 1 em dois.

"},{"location":"entregas/unidade-03/5.bdd/","title":"BDD","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/11/2023 0.1 Cria\u00e7\u00e3o do documento Artur e Jo\u00e3o

O Behavior Driven Developmente (BDD) \u00e9 uma abordagem que enfoca o comportamento do software do ponto de vista do usu\u00e1rio final. Ele utiliza exemplos concretos e hist\u00f3rias de usu\u00e1rio descritos em uma linguagem compreens\u00edvel por todos os membros da equipe. Esses exemplos, chamados de cen\u00e1rios, descrevem como o sistema deveria se comportar em situa\u00e7\u00f5es espec\u00edficas.

"},{"location":"entregas/unidade-03/5.bdd/#avalliacao-das-user-stories","title":"Avallia\u00e7\u00e3o das User Stories","text":"

US01) Como gerenciador de consultas, Posso ser capaz de agendar consultas com diferentes especialistas Para que eu possa ter uma vis\u00e3o unificada das agendas e escolher hor\u00e1rios convenientes. Erro: Crit\u00e9rio de aceita\u00e7\u00e3o se refere a outra persona

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Agendar consulta do cardiologista Jo\u00e3o em hor\u00e1rio dispon\u00edvel O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema, o cardiologista Jo\u00e3o ao qual se deseja atribuir uma consulta seja um m\u00e9dico cadastrado no sistema e o dia e hora da consulta estejam dispon\u00edveis na agenda do cardiologista O usu\u00e1rio solicitar o agendamento da reuni\u00e3o O sistema deve marcar a consulta na agenda do cardiologista Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Agendar consulta de cardiologista em hor\u00e1rio indispon\u00edvel O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema, o cardiologista Jo\u00e3o ao qual se atribuir uma consulta seja um m\u00e9dico cadastrado no sistema e o dia e hora da consulta n\u00e3o estejam dispon\u00edveis na agenda do cardiologista O usu\u00e1rio solicitar o agendamento da reuni\u00e3o O sistema deve notificar o usu\u00e1rio que o hor\u00e1rio e dia escolhidos n\u00e3o est\u00e3o dispon\u00edveis para serem agendados Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Conflito de hor\u00e1rios Um especialista tem dois compromissos marcados no mesmo hor\u00e1rio O gerenciador de consultas tenta agendar outro compromisso para o mesmo especialista no hor\u00e1rio conflitante O sistema impede a marca\u00e7\u00e3o, indicando que h\u00e1 um conflito de hor\u00e1rios e sugere um hor\u00e1rio alternativo

US02) Como gerenciador de consultas, quero ter a capacidade de acessar o hist\u00f3rico completo de consultas de cada paciente, Para ter no\u00e7\u00e3o da frequ\u00eancia que o paciente acessa o hospital.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Acessar o hist\u00f3rico de consultas de uma paciente o usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema e o paciente Carlos est\u00e1 cadastrado no sistema O usu\u00e1rio solicitar o hist\u00f3rico de consultas do paciente O sistema deve exibir uma lista com todas as consultas do paciente Carlos, sendo exibido a data da consulta e o tipo de especialista que fez a consulta para diferenciar as consultas exibidas Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Visualiza\u00e7\u00e3o da frequ\u00eancia das consultas de um paciente H\u00e1 um paciente com m\u00faltiplas consultas registradas no sistema em diferentes per\u00edodos o gerenciador de consultas analisa o hist\u00f3rico desse paciente o sistema calcula e exibe corretamente a frequ\u00eancia das consultas desse paciente ao longo do tempo, fornecendo estat\u00edsticas ou resumos que mostram a regularidade ou intervalos entre as visitas Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Hist\u00f3rico de consultas completo e organizado um paciente tem um hist\u00f3rico extenso de consultas em diferentes departamentos ou especialidades o gerenciador de consultas acessa o hist\u00f3rico do paciente o sistema apresenta o hist\u00f3rico de consultas de forma organizada e categorizada por especialidade, facilitando a compreens\u00e3o e a an\u00e1lise do hist\u00f3rico completo do paciente

US03) Como gerenciador de consultas, quero ter a capacidade de acessar um painel de controle que exiba as agendas de todos os m\u00e9dicos, para n\u00e3o ter conflito de hor\u00e1rio. Erro: Crit\u00e9rios de aceita\u00e7\u00e3o est\u00e3o muitos espec\u00edficos e a User Story tamb\u00e9m \u00e9 muito espec\u00edfica e o para n\u00e3o \u00e9 a solu\u00e7\u00e3o direta de visualizar as agendas de todos os m\u00e9dicos

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Visualizar as agendas de todos os m\u00e9dicos O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema O usu\u00e1rio solicitar as agendas de todos os m\u00e9dicos cadastrados O sistema deve exibir uma uma lista com todas as agendas, sendo exibido o nome do m\u00e9dico e sua especialidade para diferenciar as agendas exibidas Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Capacidade de filtrar agendas m\u00e9dicas h\u00e1 muitos m\u00e9dicos cadastrados no sistema O gerenciador de consultas utiliza filtros no painel de controle das agendas o sistema permite filtrar as agendas por especialidade, data ou m\u00e9dico espec\u00edfico, para facilitar a visualiza\u00e7\u00e3o e a an\u00e1lise das agendas Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Exibi\u00e7\u00e3o de disponibilidade geral dos m\u00e9dicos o painel de controle das agendas est\u00e1 acess\u00edvel o gerenciador de consultas verifica as agendas dos m\u00e9dicos o sistema apresenta a disponibilidade geral dos m\u00e9dicos, indicando os hor\u00e1rios em que cada m\u00e9dico est\u00e1 dispon\u00edvel, sem revelar detalhes de compromissos individuais

US04) Como gerenciador de consultas, quero receber alertas que identifiquem automaticamente conflitos de agendamento, Para evitar que pacientes tenham que ser reagendados devido a sobreposi\u00e7\u00f5es. N\u00e3o seria melhor o sistema evitar uma marcagem de consulta em cima de outra? Essa US mais parece crit\u00e9rio de aceita\u00e7\u00e3o da US 1

US05) Como recepcionista, eu quero ser capaz de registrar informa\u00e7\u00f5es dos pacientes no sistema, para manter um registro organizado dos pacientes que visitam a Healthnet. Crit\u00e9rios de aceita\u00e7\u00e3o \u00f1 especificam quais informa\u00e7\u00f5es s\u00e3o cadastradas

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Registro de um paciente n\u00e3o cadastrado com os dados corretos O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema e a paciente Roberta n\u00e3o esteja cadastrada no sistema O usu\u00e1rio cadastrar os dados da paciente em um formul\u00e1rio e solicitar que o sistema salve os dados da nova paciente O sistema deve notificar ao usu\u00e1rio que a opera\u00e7\u00e3o foi realizada com sucesso Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Tentativa de registro de um paciente n\u00e3o cadastrado com o CPF inv\u00e1lido O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema e o paciente Cl\u00e1udio n\u00e3o esteja cadastrada no sistema e forne\u00e7a um CPF que n\u00e3o existe para cadastro O usu\u00e1rio cadastrar os dados da paciente em um formul\u00e1rio e solicitar que o sistema salve os dados do novo paciente O sistema deve notificar ao usu\u00e1rio que a opera\u00e7\u00e3o foi realizada com sucesso Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Tentativa de registro de um paciente previamente cadastrado O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema e o paciente Afonso j\u00e1 esteja cadastrada no sistema O usu\u00e1rio cadastrar os dados da paciente em um formul\u00e1rio e solicitar que o sistema salve os dados do paciente O sistema deve notificar ao usu\u00e1rio que a opera\u00e7\u00e3o n\u00e3o pode ser realizada pois j\u00e1 existe um registro desse paciente

US06) Como recepcionista, eu quero ser capaz de atualizar as informa\u00e7\u00f5es dos pacientes no sistema, para manter seus registros precisos e atualizados.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Atualiza\u00e7\u00e3o do endere\u00e7o de um paciente O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema, a paciente Lorena j\u00e1 esteja cadastrada no sistema e a paciente percebeu que o endere\u00e7o errado foi atribu\u00eddo a ela O usu\u00e1rio fornecer o endere\u00e7o certo ao sistema e solicitar que o sistema atualize os dados da paciente O sistema deve notificar ao usu\u00e1rio que a opera\u00e7\u00e3o foi realizada com sucesso Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Tentativa de atualiza\u00e7\u00e3o do CPF de um paciente O usu\u00e1rio Rafael \u00e9 um gerenciador de consulta cadastrado no sistema, o paciente Leonardo j\u00e1 esteja cadastrado no sistema e o paciente percebeu que o CPF foi atribu\u00eddo a ele mas na hora de fornecer o CPF certo ele inverte os dois \u00faltimos d\u00edgitos de seu CPF (tornando o CPF inv\u00e1lido) O usu\u00e1rio fornecer o CPF supostamente certo ao sistema e solicitar que o sistema atualize os dados da paciente O sistema deve notificar ao usu\u00e1rio que a opera\u00e7\u00e3o n\u00e3o pode ser realizada com sucesso pois o CPF \u00e9 inv\u00e1lido Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Registro de hist\u00f3rico de procedimentos m\u00e9dicos anteriores o recepcionista est\u00e1 atualizando o registro de um paciente o recepcionista adiciona informa\u00e7\u00f5es sobre procedimentos m\u00e9dicos anteriores do paciente o sistema registra esses procedimentos no hist\u00f3rico do paciente de forma clara e organizada Cen\u00e1rio 4 Dado que Quando Ent\u00e3o Valida\u00e7\u00e3o e confirma\u00e7\u00e3o das atualiza\u00e7\u00f5es o recepcionista atualiza as informa\u00e7\u00f5es de um paciente as altera\u00e7\u00f5es s\u00e3o finalizadas e salvas no sistema o sistema confirma a atualiza\u00e7\u00e3o bem-sucedida e exibe uma mensagem de confirma\u00e7\u00e3o, assegurando que as informa\u00e7\u00f5es foram registradas corretamente

US07) Como recepcionista, eu quero ser capaz de solicitar o hist\u00f3rico do paciente no sistema, para fornecer informa\u00e7\u00f5es relevantes aos profissionais de sa\u00fade.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Solicitar hist\u00f3rico de paciente cadastrada A usu\u00e1rio-recepcionista Maria \u00e9 uma recepcionista cadastrada no sistema e ela est\u00e1 atendendo a paciente Laura que acabou de chegar ao hospital para tratar uma gripe e \u00e9 uma paciente cadastrada no sistema A usu\u00e1rio Maria fornecer o CPF da paciente ao sistema na parte de busca de hist\u00f3rico O sistema deve exibir o hist\u00f3rico da paciente Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Tentativa de solicitar hist\u00f3rico de paciente n\u00e3o cadastrado A usu\u00e1rio-recepcionista Maria \u00e9 uma recepcionista cadastrada no sistema e ela est\u00e1 atendendo o paciente Elias que acabou de chegar ao hospital para tratar uma virose e n\u00e3o est\u00e1 cadastrada no sistema, al\u00e9m de que ele n\u00e3o se lembre se j\u00e1 foi em outras unidades desse hospital ou n\u00e3o A usu\u00e1rio Maria fornecer o CPF da paciente ao sistema na parte de busca de hist\u00f3rico O sistema deve exibir uma notifica\u00e7\u00e3o informando que o CPF n\u00e3o est\u00e1 cadastrado no sistema

US08) Como paciente, posso realizar o agendamento de consultas on-line para tornar mais conveniente o processo de agendamento.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Agendar consulta em hor\u00e1rio e dia livres O paciente Guilherme \u00e9 um paciente cadastrado no sistema e ele deseja marcar uma consulta com um neurologista O usu\u00e1rio encontrar na agenda do neurologista Sebasti\u00e3o um hor\u00e1rio e dia vagos e agendar uma consulta nesse hor\u00e1rio e dia O sistema deve exibir uma notifica\u00e7\u00e3o informando que o agendamento foi feito com sucesso Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Tentativa de agendar consulta em hor\u00e1rio e dia n\u00e3o livres O paciente Gabriel \u00e9 um paciente cadastrado no sistema e ele deseja marcar uma consulta com a endocrinologista M\u00e1rcia em uma hor\u00e1rio e dia que n\u00e3o est\u00e3o dispon\u00edveis O usu\u00e1rio encontrar na agenda da m\u00e9dica um hor\u00e1rio e dia que n\u00e3o est\u00e3o vagos e pedir ao sistema que agende uma consulta nesse hor\u00e1rio e dia O sistema deve exibir uma notifica\u00e7\u00e3o informando que a opera\u00e7\u00e3o n\u00e3o foi realizada com sucesso pois o hor\u00e1rio n\u00e3o est\u00e1 dispon\u00edvel Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Lembrete de consulta Miguel \u00e9 um paciente cadastrado no sistema, ele marcou uma consulta com a endocrinologista M\u00e1rcia no dia 13/11/2023 \u00e0s 08:00 e ele informou ao sistema que deve receber um lembrete da consulta 1 dia antes For 08:00 do dia 12/11/2023 O sistema deve enviar ao usu\u00e1rio um lembrete da consulta

US09) Como paciente, posso receber notifica\u00e7\u00f5es de consultas pr\u00f3ximas para tornar mais conveniente a comunica\u00e7\u00e3o com pacientes. Erro: N\u00e3o seria crit\u00e9iro de aceita\u00e7\u00e3o da US 8?

US10) Como paciente, posso visualizar o resultado de exames realizados para que possa me manter informado sobre minha sa\u00fade. Erro: O 2\u00ba crit\u00e9rio de aceita\u00e7\u00e3o se refere a exame ou consulta? Porque s\u00e3o coisas diferentes

US11) Como paciente, posso receber lembretes sobre medicamento prescritos para que possa me lembrar de tom\u00e1-los. N\u00e3o seria crit\u00e9rio de aceita\u00e7\u00e3o da US 13???

US12) Como paciente, posso visualizar o meu hist\u00f3rico de prontu\u00e1rios para que eu possa acompanhar minhas informa\u00e7\u00f5es de sa\u00fade.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Visualizar prontu\u00e1rio O paciente Rodrigo, que est\u00e1 cadastrado no sistema, deseja ver seu hist\u00f3rico de consultas onde n\u00e3o foram encontrados prontuarios Ele solicitar ao sistema o prontu\u00e1rio m\u00e9dico O sistema deve informar que n\u00e3o foram encontrados prontu\u00e1rios Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Visualizar prontu\u00e1rio O paciente Rodrigo, que est\u00e1 cadastrado no sistema, deseja ver seu hist\u00f3rico de consultas Ele solicitar ao sistema o prontu\u00e1rio m\u00e9dico O sistema deve exibir todos suas consultas

US13) Como paciente, posso visualizar o meu hist\u00f3rico de medicamentos prescritos para que eu posse manter controle dos meus medicamentos.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Visualizar hist\u00f3rico de medicamentos O paciente Rodrigo, que est\u00e1 cadastrado no sistema, deseja ver seu hist\u00f3rico de medicamentos Ele solicitar ao sistema o seu hist\u00f3rico de medicamentos O sistema deve exibir todos os medicamentos do paciente, os que devem ser tomados atualmente e os que j\u00e1 tiveram que ser tomados Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Visualizar hist\u00f3rico de medicamentos O paciente Rodrigo, que est\u00e1 cadastrado no sistema, deseja ver seu hist\u00f3rico de medicamentos que n\u00e3o retorna resultados Ele solicitar ao sistema o seu hist\u00f3rico de medicamentos O sistema deve informar que n\u00e3o foram encontrados dados Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Lembrete de medicamento Miguel \u00e9 um paciente cadastrado no sistema, o m\u00e9dico de Miguel determinou que ele tomasse um comprimido de 600 mg ibuprofeno a cada 8 horas por cinco dias e que Miguel registrou no sistema que come\u00e7ou a tomar o rem\u00e9dio 11:00 For o hor\u00e1rio determinado para Miguel tomar o rem\u00e9dio O sistema deve enviar ao usu\u00e1rio um lembrete de ingest\u00e3o do medicamento

US14) Como m\u00e9dico, posso buscar informa\u00e7\u00f5es do paciente para realizar um atendimento melhor.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Exibir prontu\u00e1rio do paciente O m\u00e9dico, Dr. Jo\u00e3o, est\u00e1 autenticado no sistema e o sistema possui o prontu\u00e1rio do paciente Clara cadastrado O m\u00e9dico acessa a se\u00e7\u00e3o de prontu\u00e1rios do sistema e seleciona o Clara na lista de pacientes dispon\u00edveis O sistema deve apresentar detalhes do prontu\u00e1rio do Clara, incluindo informa\u00e7\u00f5es pessoais, hist\u00f3rico m\u00e9dico, alergias e outras informa\u00e7\u00f5es relevantes Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Exibir exames realizados pelo paciente o m\u00e9dico, Dr. Jo\u00e3o, est\u00e1 autenticado no sistema e o sistema possui registros de exames realizados para o Clara o m\u00e9dico acessa a se\u00e7\u00e3o de prontu\u00e1rios do sistema e seleciona o Clara na lista de pacientes dispon\u00edveis o sistema deve apresentar uma lista de exames m\u00e9dicos realizados pelo Clara, incluindo resultados e datas de realiza\u00e7\u00e3o. Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Busca de paciente por nome o m\u00e9dico possui acesso ao sistema de registros de pacientes o m\u00e9dico busca informa\u00e7\u00f5es de um paciente por seu nome sistema permite que o m\u00e9dico insira o nome do paciente na barra de busca ou campo designado Cen\u00e1rio 4 Dado que Quando Ent\u00e3o Busca de paciente por CPF o m\u00e9dico possui acesso ao sistema de registros de pacientes o m\u00e9dico busca informa\u00e7\u00f5es de um paciente por seu CPF o sistema permite que o m\u00e9dico insira o CPF do paciente na barra de busca ou campo designado

US15) Como m\u00e9dico, posso criar prescri\u00e7\u00f5es para receitar medicamentos para o paciente.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Criar prescri\u00e7\u00e3o m\u00e9dica o m\u00e9dico, Dr. Jo\u00e3o, est\u00e1 autenticado no sistema E o sistema possui informa\u00e7\u00f5es sobre o paciente Clara o m\u00e9dico acessa a fun\u00e7\u00e3o de cria\u00e7\u00e3o de prescri\u00e7\u00e3o e seleciona Maria Silva como o paciente atual e insere medicamentos espec\u00edficos na prescri\u00e7\u00e3o, juntamente com as dosagens apropriadas e adiciona informa\u00e7\u00f5es textuais relevantes sobre a prescri\u00e7\u00e3o o sistema deve armazenar a prescri\u00e7\u00e3o m\u00e9dica para a paciente Clara. Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Imprimir prescri\u00e7\u00e3o o m\u00e9dico, Dr. Jo\u00e3o, est\u00e1 autenticado no sistema e possui uma prescri\u00e7\u00e3o m\u00e9dica previamente criada para a paciente Clara o m\u00e9dico acessa a fun\u00e7\u00e3o de impress\u00e3o de prescri\u00e7\u00e3o, seleciona a prescri\u00e7\u00e3o desejada o sistema deve permitir a impress\u00e3o da prescri\u00e7\u00e3o m\u00e9dica para que possa ser entregue \u00e0 paciente Clara. Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Armazenamento de Prescri\u00e7\u00e3o M\u00e9dica o m\u00e9dico acessa o sistema de registros de pacientes para prescrever medicamentos o m\u00e9dico cria uma nova prescri\u00e7\u00e3o m\u00e9dica para um paciente espec\u00edfico o sistema armazena a prescri\u00e7\u00e3o no perfil do paciente, registrando-a no banco de dados do sistema de registros m\u00e9dicos

US16) Como m\u00e9dico, posso verificar alergias a medicamentos para evitar danos \u00e0 sa\u00fade do paciente. Erro: US relacionada verificar alergias a medicamentos, por\u00e9m a maioria dos crit\u00e9rios est\u00e3o relacionados a cria\u00e7\u00e3o de prescri\u00e7\u00e3o de medicamento.

US17) Como m\u00e9dico, posso verificar intera\u00e7\u00f5es medicamentosas para evitar efeitos adversos.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Verificar intera\u00e7\u00f5es medicamentosas na prescri\u00e7\u00e3o m\u00e9dica: o m\u00e9dico, Dr. Jo\u00e3o, est\u00e1 autenticado no sistema E est\u00e1 na tela de cria\u00e7\u00e3o de prescri\u00e7\u00e3o para a paciente Clara o m\u00e9dico adiciona medicamentos \u00e0 prescri\u00e7\u00e3o e o sistema verifica se h\u00e1 intera\u00e7\u00f5es medicamentosas entre os medicamentos na prescri\u00e7\u00e3o o sistema deve destacar os medicamentos que possuem intera\u00e7\u00f5es medicamentosas. Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Impedir a cria\u00e7\u00e3o da prescri\u00e7\u00e3o com intera\u00e7\u00f5es medicamentosas o m\u00e9dico, Dr. Jo\u00e3o, est\u00e1 autenticado no sistema e est\u00e1 na tela de cria\u00e7\u00e3o de prescri\u00e7\u00e3o para a paciente Clara e o sistema identifica intera\u00e7\u00f5es medicamentosas entre os medicamentos na prescri\u00e7\u00e3o. o m\u00e9dico tenta finalizar a prescri\u00e7\u00e3o e a prescri\u00e7\u00e3o cont\u00e9m medicamentos com intera\u00e7\u00f5es medicamentosas o sistema deve impedir a conclus\u00e3o da prescri\u00e7\u00e3o e notificar o m\u00e9dico sobre as intera\u00e7\u00f5es medicamentosas.

US18) Como m\u00e9dico, posso inserir observa\u00e7\u00f5es sobre o paciente para acrescentar informa\u00e7\u00f5es relevantes. Erro: Essas observa\u00e7\u00f5es sobre o paciente n\u00e3o s\u00e3o inseridas no prontu\u00e1rio m\u00e9dico?

US19) Como farmac\u00eautica Posso buscar medicamentos cadastrados no sistema Para fazer verifica\u00e7\u00f5es e visualizar informa\u00e7\u00f5es de forma clara.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Buscar medicamentos no sistema a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica digita um termo de pesquisa (com at\u00e9 50 caracteres) na caixa de pesquisa e o sistema retorna os medicamentos que correspondem ao termo de pesquisa, sugerindo op\u00e7\u00f5es relevantes em tempo real os medicamentos encontrados devem ser exibidos em ordem alfab\u00e9tica para facilitar a visualiza\u00e7\u00e3o. Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Exibir mensagem de medicamento n\u00e3o encontrado a farmac\u00eautica, L\u00edvia, realizou uma busca por medicamentos no sistema o sistema n\u00e3o encontra medicamentos correspondentes ao termo de pesquisa o sistema deve exibir uma mensagem informando \u00e0 farmac\u00eautica que nenhum medicamento foi encontrado.

US20) Como farmac\u00eautica Posso verificar a rela\u00e7\u00e3o entre um medicamento e poss\u00edveis alergias Para garantir o bem estar de todos os pacientes.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Selecionar medicamento e prontu\u00e1rio para verificar alergias a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica acessa a funcionalidade de verifica\u00e7\u00e3o de alergias e seleciona um medicamento cadastrado no sistema e seleciona o prontu\u00e1rio de um paciente ou inserir manualmente alergias que o paciente possui o sistema deve permitir a verifica\u00e7\u00e3o da rela\u00e7\u00e3o entre o medicamento e as alergias do paciente. Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Exibir mensagem de alergias e poss\u00edveis rea\u00e7\u00f5es a farmac\u00eautica, L\u00edvia, verificou a rela\u00e7\u00e3o entre um medicamento e as alergias do paciente o paciente possui alergia a algum componente no medicamento o sistema deve exibir uma mensagem informando quais componentes o paciente possui alergia e quais as poss\u00edveis rea\u00e7\u00f5es al\u00e9rgicas que ele pode sofrer.

US21) Como farmac\u00eautica Posso verificar as intera\u00e7\u00f5es entre medicamentos Para garantir que pacientes n\u00e3o usem medicamentos com formula\u00e7\u00f5es conflitantes.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Selecionar medicamento para verificar intera\u00e7\u00f5es a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica acessa a funcionalidade de verifica\u00e7\u00e3o de intera\u00e7\u00f5es entre medicamentos e seleciona um medicamento cadastrado no sistema o sistema deve permitir a verifica\u00e7\u00e3o das intera\u00e7\u00f5es entre o medicamento selecionado e outros medicamentos. Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Exibir mensagem de aus\u00eancia de medicamentos incompat\u00edveis a farmac\u00eautica, L\u00edvia, verificou as intera\u00e7\u00f5es entre um medicamento e outros medicamentos no sistema n\u00e3o h\u00e1 medicamentos com formula\u00e7\u00f5es incompat\u00edveis o sistema deve exibir uma mensagem informando que n\u00e3o h\u00e1 medicamentos incompat\u00edveis.

US22) Como farmac\u00eautica Posso verificar se um medicamento prescrito \u00e9 o mesmo entregue ao paciente Para garantir que os pacientes recebam a medica\u00e7\u00e3o correta.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Verificar correspond\u00eancia entre medicamento prescrito e retirado do estoque a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica recebe uma prescri\u00e7\u00e3o de medicamento e retira o medicamento correspondente do estoque e seleciona a op\u00e7\u00e3o de verificar correspond\u00eancia entre o medicamento prescrito e o retirado do estoque o sistema deve comparar se o medicamento retirado do estoque \u00e9 o mesmo que foi prescrito. Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Exibir mensagem de n\u00e3o correspond\u00eancia a farmac\u00eautica, L\u00edvia, verificou a correspond\u00eancia entre o medicamento prescrito e o retirado do estoque o medicamento retirado do estoque n\u00e3o corresponde ao prescrito o sistema deve exibir uma mensagem informando \u00e0 farmac\u00eautica que a medica\u00e7\u00e3o retirada n\u00e3o \u00e9 a mesma prescrita.

US23) Como farmac\u00eautica Posso cadastrar prescri\u00e7\u00f5es atrav\u00e9s da digitaliza\u00e7\u00e3o Para agilizar e reduzir erros no cadastro destes documentos. Erro: Gerar um json interfere na regra de neg\u00f3cio ?

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Cadastrar prescri\u00e7\u00f5es por digitaliza\u00e7\u00e3o a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica acessa a funcionalidade de cadastrar prescri\u00e7\u00f5es E escolhe a op\u00e7\u00e3o de cadastrar por digitaliza\u00e7\u00e3o e digitalizar a prescri\u00e7\u00e3o do paciente o sistema deve processar a digitaliza\u00e7\u00e3o e cadastrar a prescri\u00e7\u00e3o no sistema Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Exibir mensagem de erro no cadastro a farmac\u00eautica, L\u00edvia, tentou cadastrar uma prescri\u00e7\u00e3o por digitaliza\u00e7\u00e3o ocorre algum erro no processo de digitaliza\u00e7\u00e3o ou cadastro o sistema deve exibir uma mensagem informando \u00e0 farmac\u00eautica sobre o erro no cadastro da prescri\u00e7\u00e3o.

US24) Como farmac\u00eautica Posso cadastrar prescri\u00e7\u00f5es manualmente Para manter o sistema atualizado caso a digitaliza\u00e7\u00e3o falhe.

Cen\u00e1rio 1 Dado que Quando Ent\u00e3o Cadastrar prescri\u00e7\u00f5es manualmente a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica acessa a funcionalidade de cadastrar prescri\u00e7\u00f5es manualmente e preenche o campo de nome do medicamento (digitando \"Dipirona\") e preenche o campo de nome do m\u00e9dico (digitando \"Maria Rocha Silva\") e insere as demais informa\u00e7\u00f5es necess\u00e1rias da prescri\u00e7\u00e3o e conclui o processo de cadastro o sistema deve cadastrar a prescri\u00e7\u00e3o no sistema. Cen\u00e1rio 2 Dado que Quando Ent\u00e3o Cadastrar prescri\u00e7\u00f5es com mais de 50 caracteres no campo nome do medicamento a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica acessa a funcionalidade de cadastrar prescri\u00e7\u00f5es manualmente, preenche o campo de nome do medicamento (digitando \"Cloridrato de N-metil-N(3-metil-1-oxobutil)-DL-aspartato de 2-aminoetanol\"), preenche o campo de nome do m\u00e9dico (digitando \"Maria da Silva\") caracteres e conclui o processo de cadastro o sistema n\u00e3o deve permitir que a prescri\u00e7\u00e3o seja cadastrada e reportar uma mensagem de erro dizendo que o campo nome do medicamento deve ter no m\u00e1ximo 50 caracteres. Cen\u00e1rio 3 Dado que Quando Ent\u00e3o Cadastrar prescri\u00e7\u00f5es com mais de 50 caracteres no campos nome do m\u00e9dico e nome do medicamento a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica acessa a funcionalidade de cadastrar prescri\u00e7\u00f5es manualmente, preenche o campo de nome do medicamento (digitando \"Ibuprofeno\"), preenche o campo de nome do m\u00e9dico (digitando \"Evangeline Beatrice Priscilla Alexandra Harrington-Smith.\") caracteres e conclui o processo de cadastro o sistema n\u00e3o deve permitir que a prescri\u00e7\u00e3o seja cadastrada e reportar uma mensagem de erro dizendo que o campo nome do m\u00e9dico deve ter no m\u00e1ximo 50 caracteres. Cen\u00e1rio 4 Dado que Quando Ent\u00e3o Cadastrar prescri\u00e7\u00f5es com mais de 50 caracteres no campo nome do m\u00e9dico a farmac\u00eautica, L\u00edvia, est\u00e1 autenticada no sistema a farmac\u00eautica acessa a funcionalidade de cadastrar prescri\u00e7\u00f5es manualmente, preenche o campo de nome do medicamento (digitando \"Cloridrato de N-metil-N(3-metil-1-oxobutil)-DL-aspartato de 2-aminoetanol\"), preenche o campo de nome do m\u00e9dico (digitando \"Evangeline Beatrice Priscilla Alexandra Harrington-Smith.\") e conclui o processo de cadastro o sistema n\u00e3o deve permitir que a prescri\u00e7\u00e3o seja cadastrada e reportar uma mensagem de erro dizendo que os campos nome do m\u00e9dico e nome do medicamento devem ter no m\u00e1ximo 50 caracteres.

US25) Como farmac\u00eautica Posso integrar o sistema com outras farm\u00e1cias internas Para melhorar o compartilhamento de informa\u00e7\u00f5es. Erro: integrar o sistema com outras farm\u00e1cias \u00e9 um requisito de alto n\u00edvel que deveria ser quebrado em v\u00e1rias hist\u00f3rias de usu\u00e1rio

"},{"location":"entregas/unidade-03/6.usm/","title":"User Story Mapping","text":"

Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/11/2023 0.1 Cria\u00e7\u00e3o do documento Artur, Jo\u00e3o e Vict\u00f3rio 22/11/2023 0.2 Atualiza\u00e7\u00e3o da USM Vict\u00f3rio

Neste t\u00f3pico ser\u00e1 apresentado o User Story Mappping da ComunEventos.

"},{"location":"entregas/unidade-03/6.usm/#o-que-e-a-comuneventos","title":"O que \u00e9 a ComunEventos?","text":"

A ComunEventos \u00e9 uma empresa que possui como miss\u00e3o desenvolver uma plataforma online para otimizar a organiza\u00e7\u00e3o e promo\u00e7\u00e3o de eventos comunit\u00e1rios, permitindo que seus membros se re\u00fanam em eventos que visem os interesses de ambos.

"},{"location":"entregas/unidade-03/6.usm/#problemas-a-serem-resolvidos","title":"Problemas a serem resolvidos","text":"

O intuito da plataforma \u00e9 resolver problemas organizacionais de eventos comunit\u00e1rios, sendo os principais:

  • Utiliza\u00e7\u00e3o de m\u00faltiplas ferramentas, nem sempre projetadas para eventos, o que dificulta a organiza\u00e7\u00e3o e sobrecarrega os membros, que precisam criar e divulgar o evento e comunicar com os participantes.
  • Or\u00e7amento baixo para contrata\u00e7\u00e3o de plataformas especializadas para eventos.
  • Falta de uma plataforma simplificada e unificada para a realiza\u00e7\u00e3o de todas as etapas da inscri\u00e7\u00e3o dos participantes em um \u00fanico lugar.
  • Dificuldades no processo de colabora\u00e7\u00e3o com os membros que acontece de forma f\u00edsica ou por canais de comunica\u00e7\u00e3o, nem sempre padronizados, prejudicando os organizadores que nem sempre conseguem acessar todas as solicita\u00e7\u00f5es recebidas.
"},{"location":"entregas/unidade-03/6.usm/#beneficios","title":"Benef\u00edcios","text":"

A implementa\u00e7\u00e3o dessa plataforma acarreta em in\u00fameros benef\u00edcios, como:

  • Integra\u00e7\u00e3o das ferramentas utilizadas pela ComunEventos em uma \u00fanica plataforma
  • Diminui\u00e7\u00e3o dos custos de contrata\u00e7\u00e3o de plataformas de eventos, uma vez que elas ser\u00e3o dispensadas
  • Melhoria no engajamento com os participantes
  • Incentivo a colabora\u00e7\u00e3o local, com parcerias e volunt\u00e1rios, devido a facilita\u00e7\u00e3o do processo
  • Incentivo a realiza\u00e7\u00e3o de eventos que atendam as diversas necessidades
"},{"location":"entregas/unidade-03/6.usm/#para-quem","title":"Para quem?","text":"

Os beneficiados por essa plataforma seriam:

  • Organizadores
  • Participantes
  • Fornecedores locais
  • Patrocinadores
  • Volunt\u00e1rios
"},{"location":"entregas/unidade-03/6.usm/#usm-construido","title":"USM constru\u00eddo","text":"

Abaixo, est\u00e1 apresentado o USM proposto para a resolu\u00e7\u00e3o do problema. As fotos em melhor qualidade podem ser acessadas clicando em USM - Parte 1 e USM - Parte 2

As hist\u00f3rias de usu\u00e1rio extra\u00eddas do USM est\u00e3o registradas na tabela a seguir:

US Enunciado US01 Eu, como Organizador, desejo cadastrar um evento para ter um registro dos eventos que eu organizo US02 Eu, como Organizador, desejo adicionar um organizador a um evento que os outros organizadores do evento possam participar da ger\u00eancia desse evento pelo sistema US03 Eu, como Organizador, desejo criar lista de contato para um evento para registrar os poss\u00edveis contatos que podem ter interesse em ajudar o evento US04 Eu, como Organizador, desejo enviar e-mail de divulga\u00e7\u00e3o de um evento para lista de contatos para divulgar o evento aos que podem querer ajud\u00e1-lo US05 Eu, como Organizador, desejo cadastrar tarefa para um evento para ter um registro de todas as tarefas que precisam ser feitas antes e durante a realiza\u00e7\u00e3o do evento US06 Eu, como Organizador, desejo cadastrar sess\u00e3o de treinamento para ter um registro das sess\u00f5es de treinamento necess\u00e1rias para realiza\u00e7\u00e3o de certas tarefas um evento US07 Eu, como Organizador, desejo associar uma sess\u00e3o de treinamento a uma tarefa para categorizar cada sess\u00e3o de treinamento pela tarefa que ela capacita o volunt\u00e1rio a realizar US08 Eu, como Organizador, desejo cadastrar fornecedor para ter um registro dos fornecedores de um evento que pode fornecer para meus eventos US09 Eu, como Organizador, desejo cadastrar patrocinador para ter um registro de um patrocinador que pode patrocinar meus eventos US10 Eu, como Organizador, desejo assinalar volunt\u00e1rio a um evento para distribuir de forma organizada as pessoas aprovadas para serem volunt\u00e1rios entre meus eventos US11 Eu, como Organizador, desejo assinalar fornecedor a um evento para fazer o registro de um fornecedor confirmado do meu evento US12 Eu, como Organizador, desejo assinalar patrocinador a um evento para fazer o registro de um patrocinador confirmado do meu evento US13 Eu, como Organizador, desejo enviar e-mail a patrocinador de um evento para conseguir enviar alinhamentos sobre o evento na mesma plataforma que gerencio o evento US14 Eu, como Organizador, desejo enviar e-mail a fornecedor de um evento para conseguir enviar alinhamentos sobre o evento na mesma plataforma que gerencio o evento US15 Eu, como Organizador, desejo enviar mensagem a volunt\u00e1rio para fazer alinhamentos espec\u00edficos com um certo volunt\u00e1rio US16 Eu, como Organizador, desejo enviar uma mensagem para todos os volunt\u00e1rios de um evento para fazer comunicados gerais para todos os volunt\u00e1rios de um evento facilmente US17 Eu, como Organizador, desejo enviar mensagem a participante para fazer alinhamentos espec\u00edficos com um certo participante US18 Eu, como Organizador, desejo enviar uma mensagem para todos os participantes de um evento para fazer comunicados gerais para todos os participantes de um evento facilmente US19 Eu, como Organizador, desejo visualizar lista de pessoas inscritas como participantes de um evento para monitorar a quantidade de participantes inscritos de um evento US20 Eu, como Organizador, desejo visualizar lista de pessoas inscritas para concorrer a vaga de volunt\u00e1rio de um evento para monitorar a quantidade de pessoas com interesse em se voluntariar a um evento US21 Eu, como Participante-Volunt\u00e1rio, desejo visualizar lista com os pr\u00f3ximos eventos para verificar se existe algum evento que eu tenha interesse de participar como Participante ou Volunt\u00e1rio US22 Eu, como Participante-Volunt\u00e1rio, desejo visualizar detalhes de um evento para ter acesso a mais detalhes de um evento pelo qual eu tenho interesse US23 Eu, como Participante-Volunt\u00e1rio, desejo enviar mensagem para o organizador do evento para tirar d\u00favidas sobre o evento US24 Eu, como Participante-Volunt\u00e1rio-Organizador, desejo compartilhar post do evento nas redes sociais para divulgar o evento ou compartilhar minha experi\u00eancia no evento US25 Eu, como Organizador, desejo registrar um investimento em um evento para monitorar a entrada de dinheiro no evento US26 Eu, como Organizador, desejo registrar uma despesa de um evento para monitorar os gastos do evento US27 Eu, como Organizador, desejo visualizar fluxo de caixa de um evento para monitorar a situa\u00e7\u00e3o financeira do meu evento US28 Eu, como Organizador, desejo visualizar resultados dos formul\u00e1rios de feedbacks dos participantes para conseguir visualizar o n\u00edvel de satisfa\u00e7\u00e3o dos participantes com o evento e ver o que pode melhorar US29 Eu, como Organizador, desejo visualizar quantidade de dinheiro arrecado das inscri\u00e7\u00f5es dos participantes que foram pagas para monitorar o dinheiro arrecadado com as inscri\u00e7\u00f5es de participantes US30 Eu, como Participante, desejo pagar inscri\u00e7\u00e3o em de um evento para confirmar minha inscri\u00e7\u00e3o nos eventos que exigem pagamentos US31 Eu, como Participante, desejo preencher formul\u00e1rio de feedback para poder informar diretamente aos organizadores do evento meus elogios e cr\u00edticas ao evento US32 Eu, como Volunt\u00e1rio, desejo visualizar as tarefas dispon\u00edveis no evento para poder escolher qual delas eu desejo realizar US33 Eu, como Volunt\u00e1rio, desejo escolher uma tarefas dispon\u00edvel no evento para que eu possa assumir a responsabilidade por uma tarefa que quero realizar antes ou durante o evento US34 Eu, como Volunt\u00e1rio, desejo visualizar os hor\u00e1rios de treinamento para que possa planejar meu tempo de acordo com os treinos que devo realizar para me capacitar para uma tarefa US35 Eu, como Volunt\u00e1rio, desejo baixar certificado de treinamento para que eu possa ter um certificado da minha capacita\u00e7\u00e3o para determinada tarefa US36 Eu, como Participante-Volunt\u00e1rio, desejo filtrar lista dos pr\u00f3ximos eventos para que eu possa encontrar eventos que me interessam facilmente US37 Eu, como Participante-Volunt\u00e1rio, desejo preencher formul\u00e1rio de inscri\u00e7\u00e3o de um evento para que possa comprar um ingresso para um evento que desejo ser participante ou fornecer informa\u00e7\u00f5es para os organizadores avaliarem se v\u00e3o me chamar para um evento que desejo me voluntariar

"},{"location":"entregas/unidade-03/7.dor_dod/","title":"Ver&Val DoR & DoD - Fac\u00e7\u00e3o GBL","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/11/2023 0.1 Cria\u00e7\u00e3o do documento Vict\u00f3rio"},{"location":"entregas/unidade-03/7.dor_dod/#definition-of-ready-dor","title":"Definition Of Ready (DoR)","text":""},{"location":"entregas/unidade-03/7.dor_dod/#verificacao","title":"Verifica\u00e7\u00e3o:","text":"
  • Ter mais verifica\u00e7\u00f5es a respeito das hist\u00f3rias e menos sobre os requisitos, pois o DoR vai ser aplicado principalmente a n\u00edvel de US.
  • As US devem ser verificadas se est\u00e3o declaradas de forma correta (pode ser utilizada alguma t\u00e9cnica, como o INVEST ou DEEP)
  • Quem possui crit\u00e9rios de aceite s\u00e3o as hist\u00f3rias, acho que \u00e9 interessante deixar isso claro
"},{"location":"entregas/unidade-03/7.dor_dod/#validacao","title":"Valida\u00e7\u00e3o:","text":"
  • \u00c9 interessante ter uma valida\u00e7\u00e3o mais objetiva dos requisitos em rela\u00e7\u00e3o ao prazo e entendimento da equipe
  • Quais s\u00e3o os crit\u00e9rios de prioriza\u00e7\u00e3o?
  • Os crit\u00e9rios de aceite tamb\u00e9m devem ser validados com o cliente
"},{"location":"entregas/unidade-03/7.dor_dod/#definition-of-done-dod","title":"Definition Of Done (DoD)","text":""},{"location":"entregas/unidade-03/7.dor_dod/#verificacao_1","title":"Verifica\u00e7\u00e3o:","text":"
  • Tudo em conformidade
"},{"location":"entregas/unidade-03/7.dor_dod/#validacao_1","title":"Valida\u00e7\u00e3o:","text":"
  • Como avaliar que \u00e9 um incremento tang\u00edvel para o produto? Acho que pode ser mais objetivo
"},{"location":"entregas/unidade-03/7.dor_dod/#conclusao","title":"Conclus\u00e3o","text":"

Dada as considera\u00e7\u00f5es, o crit\u00e9rios para o DoR e DoD foram feitos de maneira correta.

"},{"location":"entregas/unidade-04/1.entrega-unidade4/","title":"Apresenta\u00e7\u00e3o e Valida\u00e7\u00e3o do Cliente","text":"Apresenta\u00e7\u00e3o Final"},{"location":"entregas/unidade-04/1.entrega-unidade4/#video-de-apresentacao","title":"V\u00eddeo de Apresenta\u00e7\u00e3o","text":"

A entrega da Unidade 4 est\u00e1 presente no v\u00eddeo abaixo, mas tamb\u00e9m pode ser acessada aqui.

"},{"location":"entregas/unidade-04/1.entrega-unidade4/#reuniao-de-validacao-com-o-cliente","title":"Reuni\u00e3o de Valida\u00e7\u00e3o com o Cliente","text":"

A reuni\u00e3o de valida\u00e7\u00e3o com o cliente est\u00e1 presente no v\u00eddeo abaixo, mas tamb\u00e9m pode ser acessada aqui.

"},{"location":"entregas/unidade-04/2.especificacao-caso-de-uso/","title":"Introdu\u00e7\u00e3o","text":"

O Processo Unificado emprega casos de uso como uma maneira de declarar e especificar requisitos. Nesse contexto, \u00e9 importante destacar que, antes de detalhar os casos de uso, foi essencial realizar a elicita\u00e7\u00e3o dos requisitos que seriam posteriormente declarados. Esse processo inicial de levantamento de requisitos desempenha um papel fundamental na constru\u00e7\u00e3o de uma base s\u00f3lida para a especifica\u00e7\u00e3o detalhada dos casos de uso no decorrer do desenvolvimento.

"},{"location":"entregas/unidade-04/2.especificacao-caso-de-uso/#casos-de-uso","title":"Casos de Uso","text":"CDU Objetivo Requisito funcional Caso de Uso Resultado Observ\u00e1vel CDU-01 Visualizar conte\u00fado digital de viagem Visualizar conte\u00fado digital de viagem Visualizar conte\u00fado digital de viagem artigos, fotografias e v\u00eddeos sobre a viagem CDU-02 Pesquisar destino Pesquisar destino Pesquisar destino informa\u00e7\u00f5es do destino pesquisado CDU-03 Visualizar informa\u00e7\u00f5es detalhadas de destino Visualizar informa\u00e7\u00f5es detalhadas de destino Visualizar informa\u00e7\u00f5es detalhadas de destino melhores per\u00edodos para visitar, atra\u00e7\u00f5es culturais, culin\u00e1ria local, e dicas de viagem para um destino CDU-04 Buscar acomoda\u00e7\u00e3o de destino Buscar acomoda\u00e7\u00e3o de destino Buscar acomoda\u00e7\u00e3o de destino Deletar despesas CDU-05 Visualizar conte\u00fados da acomoda\u00e7\u00e3o Visualizar conte\u00fados da acomoda\u00e7\u00e3o Visualizar conte\u00fados da acomoda\u00e7\u00e3o fotos, descri\u00e7\u00f5es detalhadas e avalia\u00e7\u00f5es de outros usu\u00e1rios da acomoda\u00e7\u00e3o CDU-06 Verificar disponibilidade de acomoda\u00e7\u00e3o Verificar disponibilidade de acomoda\u00e7\u00e3o Verificar disponibilidade de acomoda\u00e7\u00e3o dias dispon\u00edveis para reserva da acomoda\u00e7\u00e3o CDU-07 Reservar acomoda\u00e7\u00e3o Reservar acomoda\u00e7\u00e3o Reservar acomoda\u00e7\u00e3o comprovante de reserva de acomoda\u00e7\u00e3o CDU-08 Contactar acomoda\u00e7\u00e3o Contactar acomoda\u00e7\u00e3o Contactar acomoda\u00e7\u00e3o resposta do anfitri\u00e3o/hotel com informa\u00e7\u00f5es sobre a acomoda\u00e7\u00e3o CDU-09 Pesquisar atividades locais em destinos Pesquisar atividades locais em destinos Pesquisar atividades locais em destinos Pesquisar atividades locais em destinos CDU-10 Verificar disponibilidade de atividade local Verificar disponibilidade de atividade local Verificar disponibilidade de atividade local dias e vagas dispon\u00edveis para realizar a atividade local CDU-11 Reservar atividade local Reservar atividade local Reservar atividade local comprovante de reserva de atividade local CDU-12 Pagar reserva de atividade local Pagar reserva de atividade local Pagar reserva de atividade local comprovante de pagamento de reserva de atividade local CDU-13 Organizar itiner\u00e1rio Adicionar plano de viagem, excluir plano de viagem, acessar itiner\u00e1rio e receber aviso de altera\u00e7\u00e3o no itiner\u00e1rio Adicionar plano de viagem, excluir plano de viagem, acessar itiner\u00e1rio e receber aviso de altera\u00e7\u00e3o no itiner\u00e1rio Registro de novo plano de viagem, Exclus\u00e3o de um plano de viagem e notifica\u00e7\u00e3o de sucesso da opera\u00e7\u00e3o, Voos, alugu\u00e9is de carro e outros planos de uma viagem e Mensagem notificando uma mudan\u00e7a no itiner\u00e1rio devido a mudan\u00e7as de hor\u00e1rio de voo ou mudan\u00e7as clim\u00e1ticas CDU-14 Visualizar informa\u00e7\u00f5es de contatos de emerg\u00eancia Visualizar informa\u00e7\u00f5es de contatos de emerg\u00eancia Visualizar informa\u00e7\u00f5es de contatos de emerg\u00eancia Lista de contatos de emerg\u00eancia CDU-15 Receber recomenda\u00e7\u00f5es de locais Receber recomenda\u00e7\u00f5es de locais Receber recomenda\u00e7\u00f5es de locais Lista de restaurantes, pontos tur\u00edsticos e eventos na localiza\u00e7\u00e3o atual do usu\u00e1rio CDU-16 Ter acesso a mapa Ter acesso a mapa Ter acesso a mapa Mapa indicando localiza\u00e7\u00e3o do usu\u00e1rio e locais pr\u00f3ximos CDU-17 Receber sugest\u00f5es de atividades pr\u00f3ximas Receber sugest\u00f5es de atividades pr\u00f3ximas Receber sugest\u00f5es de atividades pr\u00f3ximas Mensagem avisando de eventos ocorrendo pr\u00f3ximos ao usu\u00e1rio CDU-18 Avaliar acomoda\u00e7\u00f5es e atividades Avaliar acomoda\u00e7\u00f5es e atividades Avaliar acomoda\u00e7\u00f5es e atividades Registro da avalia\u00e7\u00e3o com ou sem coment\u00e1rio do viajante CDU-19 Receber recomenda\u00e7\u00f5es de destinos e ofertas Receber recomenda\u00e7\u00f5es de destinos e ofertas Receber recomenda\u00e7\u00f5es de destinos e ofertas Mensagem sugerindo destinos condizentes com o perfil do usu\u00e1rio ou de uma oferta de uma viagem CDU-20 Cadastrar acomoda\u00e7\u00e3o Cadastrar acomoda\u00e7\u00e3o Cadastrar acomoda\u00e7\u00e3o Registro de fotos e informa\u00e7\u00f5es detalhadas da acomoda\u00e7\u00e3o CDU-21 Visualizar avalia\u00e7\u00e3o da acomoda\u00e7\u00e3o Visualizar avalia\u00e7\u00e3o da acomoda\u00e7\u00e3o Visualizar avalia\u00e7\u00e3o da acomoda\u00e7\u00e3o Avalia\u00e7\u00e3o e coment\u00e1rios da acomoda\u00e7\u00e3o de acordo com os clientes CDU-22 Responder viajantes Responder viajantes Responder viajantes Envio de mensagem a um viajante CDU-23 Visualizar itiner\u00e1rio de reservas da acomoda\u00e7\u00e3o Visualizar itiner\u00e1rio de reservas da acomoda\u00e7\u00e3o Visualizar itiner\u00e1rio de reservas da acomoda\u00e7\u00e3o Itiner\u00e1rio com os dias e hor\u00e1rios lotados e dispon\u00edveis dos quartos CDU-24 Receber notifica\u00e7\u00f5es de reservas da acomoda\u00e7\u00e3o Receber notifica\u00e7\u00f5es de reservas da acomoda\u00e7\u00e3o Receber notifica\u00e7\u00f5es de reservas da acomoda\u00e7\u00e3o Mensagem notificando uma reservas na acomoda\u00e7\u00e3o e o registro da reserva no itiner\u00e1rio de disponibilidade dos quartos CDU-25 Cadastrar atividade Cadastrar atividade Cadastrar atividade Registro de fotos e informa\u00e7\u00f5es detalhadas da atividade CDU-26 Visualizar avalia\u00e7\u00e3o da atividade Visualizar avalia\u00e7\u00e3o da atividade Visualizar avalia\u00e7\u00e3o da atividade Avalia\u00e7\u00e3o e coment\u00e1rios da atividade de acordo com os clientes CDU-27 Responder viajantes Responder viajantes Responder viajantes Envio de mensagem a um viajante CDU-28 Visualizar itiner\u00e1rio de reservas da atividade Visualizar itiner\u00e1rio de reservas da atividade Visualizar itiner\u00e1rio de reservas da atividade Itiner\u00e1rio com os dias e hor\u00e1rios lotados e dispon\u00edveis das atividades CDU-29 Receber notifica\u00e7\u00f5es de reservas da atividade Receber notifica\u00e7\u00f5es de reservas da atividade Receber notifica\u00e7\u00f5es de reservas da atividade Mensagem notificando uma reserva na atividade e o registro da reserva no itiner\u00e1rio de disponibilidade das vagas da atividade CDU-30 Receber notifica\u00e7\u00e3o de pagamento de uma atividade Receber notifica\u00e7\u00e3o de pagamento de uma atividade Receber notifica\u00e7\u00e3o de pagamento de uma atividade Mensagem notificando um pagamento de uma vaga de uma atividade e mudan\u00e7a do status do pagamento de um cliente na lista de clientes com reserva para uma vaga em uma atividade"},{"location":"entregas/unidade-04/2.especificacao-caso-de-uso/#especificacao-dos-casos-de-uso","title":"Especifica\u00e7\u00e3o dos Casos de Uso","text":""},{"location":"entregas/unidade-04/2.especificacao-caso-de-uso/#cdu-01-visualizar-conteudo-digital-da-viagem","title":"CDU-01 Visualizar conte\u00fado digital da viagem","text":"N\u00famero do Caso de Uso CDU-01 Nome do Caso de Uso Gerenciar cadastro de Usu\u00e1rio Vers\u00e3o 1.0 Data de Cria\u00e7\u00e3o 20/11/2023 Respons\u00e1vel Juan Pablo e Jo\u00e3o Lucas Breve Descri\u00e7\u00e3o Este caso de uso permite que um usu\u00e1rio visualize o conte\u00fado digital associado a uma viagem registrada no sistema. Fluxo B\u00e1sico de Eventos Passo Descri\u00e7\u00e3o 2.1 O usu\u00e1rio acessa a se\u00e7\u00e3o de viagens ou conte\u00fado digital no sistema. 2.2 O sistema lista as viagens dispon\u00edveis para o usu\u00e1rio. 2.3 O usu\u00e1rio seleciona a viagem desejada para visualizar o conte\u00fado digital associado. 2.4 O sistema exibe o conte\u00fado digital espec\u00edfico da viagem selecionada (fotos, v\u00eddeos, notas, etc.). \u00c1rea de Funcionalidade: Cadastro de Usu\u00e1rio A1 Primeiro Fluxo Alternativo Se n\u00e3o houver nenhuma viagem dispon\u00edvel para o usu\u00e1rio, o sistema exibe uma mensagem indicando a falta de viagens registradas. A2 Segundo Fluxo Alternativo Se a viagem selecionada n\u00e3o possuir conte\u00fado digital associado, o sistema informa que n\u00e3o h\u00e1 conte\u00fado dispon\u00edvel para essa viagem. Fluxos de Exce\u00e7\u00e3o N\u00famero Descri\u00e7\u00e3o 4.1 FE1 - Se ocorrer um erro ao tentar acessar o conte\u00fado digital da viagem, o sistema exibe uma mensagem de erro e sugere ao usu\u00e1rio tentar novamente mais tarde. Pr\u00e9-Condi\u00e7\u00f5es N\u00famero Descri\u00e7\u00e3o 5.1 O usu\u00e1rio est\u00e1 autenticado no sistema. 5.2 Existe pelo menos uma viagem registrada para o usu\u00e1rio. P\u00f3s-Condi\u00e7\u00f5es N\u00famero Descri\u00e7\u00e3o 6.1 O usu\u00e1rio visualizou o conte\u00fado digital da viagem selecionada. Pontos de Extens\u00e3o N\u00famero Descri\u00e7\u00e3o 7.1 N\u00e3o h\u00e1 pontos de extens\u00e3o definidos para este caso de uso. Requisitos Especiais N\u00famero Descri\u00e7\u00e3o 8.1 O sistema deve garantir a privacidade e seguran\u00e7a do conte\u00fado digital acessado, limitando o acesso apenas ao usu\u00e1rio autorizado. Informa\u00e7\u00f5es Adicionais --- Nenhuma informa\u00e7\u00e3o adicional fornecida."},{"location":"entregas/unidade-04/2.especificacao-caso-de-uso/#cdu-02-gerenciar-login-de-usuario","title":"CDU-02 Gerenciar login de Usu\u00e1rio","text":"N\u00famero do Caso de Uso CDU-02 Nome do Caso de Uso Gerenciar login de Usu\u00e1rio Vers\u00e3o 1.0 Data de Cria\u00e7\u00e3o 20/11/2023 Respons\u00e1vel Juan Pablo e Jo\u00e3o Lucas Breve Descri\u00e7\u00e3o Este caso de uso permite que um usu\u00e1rio fa\u00e7a login no sistema. Fluxo B\u00e1sico de Eventos Passo Descri\u00e7\u00e3o 2.1 O usu\u00e1rio escolhe a op\u00e7\u00e3o de fazer login (RF2). 2.2 O sistema solicita as credenciais do usu\u00e1rio. 2.3 O usu\u00e1rio fornece as credenciais. 2.4 O sistema valida as credenciais. 2.5 O sistema autentica o usu\u00e1rio e o direciona para a \u00e1rea logada. Fluxos Alternativos \u00c1rea de Funcionalidade: Login de Usu\u00e1rio A1 Primeiro Fluxo Alternativo A1: Se o usu\u00e1rio n\u00e3o tiver uma conta no sistema: - O sistema n\u00e3o autentica o usu\u00e1rio. - O sistema exibe uma mensagem informando que o usu\u00e1rio n\u00e3o possui uma conta no sistema. - O usu\u00e1rio pode escolher criar uma nova conta. Fluxos de Exce\u00e7\u00e3o N\u00famero Descri\u00e7\u00e3o 4.1 FE1 - Se houver falha na autentica\u00e7\u00e3o durante o login, o sistema notifica o usu\u00e1rio e oferece op\u00e7\u00f5es para recupera\u00e7\u00e3o de senha. Pr\u00e9-Condi\u00e7\u00f5es N\u00famero Descri\u00e7\u00e3o 5.1 O sistema est\u00e1 operacional. P\u00f3s-Condi\u00e7\u00f5es N\u00famero Descri\u00e7\u00e3o 6.1 O usu\u00e1rio est\u00e1 autenticado no sistema. Pontos de Extens\u00e3o N\u00famero Descri\u00e7\u00e3o 7.1 N\u00e3o h\u00e1 pontos de extens\u00e3o definidos para este caso de uso. Requisitos Especiais N\u00famero Descri\u00e7\u00e3o 8.1 O sistema deve garantir a seguran\u00e7a das informa\u00e7\u00f5es do usu\u00e1rio durante o login. Informa\u00e7\u00f5es Adicionais --- Nenhuma informa\u00e7\u00e3o adicional fornecida."},{"location":"entregas/unidade-04/2.especificacao-caso-de-uso/#cdu-03-gerenciar-cadastro-de-conta-bancaria","title":"CDU-03 Gerenciar Cadastro de Conta Banc\u00e1ria","text":"N\u00famero do Caso de Uso CDU-03 Nome do Caso de Uso Gerenciar Cadastro de Conta Banc\u00e1ria Vers\u00e3o 1.0 Data de Cria\u00e7\u00e3o 20/11/2023 Respons\u00e1vel Juan Pablo e Jo\u00e3o Lucas Breve Descri\u00e7\u00e3o Este caso de uso permite que um usu\u00e1rio cadastre at\u00e9 tr\u00eas contas banc\u00e1rias associadas ao seu perfil. Fluxo B\u00e1sico de Eventos Passo Descri\u00e7\u00e3o 2.1 O usu\u00e1rio escolhe a op\u00e7\u00e3o de cadastrar conta banc\u00e1ria (RF3). 2.2 O sistema solicita as informa\u00e7\u00f5es da conta banc\u00e1ria. 2.3 O usu\u00e1rio fornece os dados necess\u00e1rios. 2.4 O sistema valida as informa\u00e7\u00f5es e associa a conta banc\u00e1ria ao usu\u00e1rio. Fluxos Alternativos \u00c1rea de Funcionalidade: Cadastro de Conta Banc\u00e1ria A1 Primeiro Fluxo Alternativo A1.1 Um Subfluxo Alternativo A2 Segundo Fluxo Alternativo - A2: Se o usu\u00e1rio tentar cadastrar uma conta banc\u00e1ria de um banco que n\u00e3o \u00e9 suportado pelo sistema: - O sistema n\u00e3o permite o cadastro da conta banc\u00e1ria. - O sistema exibe uma mensagem informando que o banco n\u00e3o \u00e9 suportado pelo sistema. Fluxos de Exce\u00e7\u00e3o N\u00famero Descri\u00e7\u00e3o 4.1 FE1 - Se houver falha na valida\u00e7\u00e3o das informa\u00e7\u00f5es do cadastro, o sistema notifica o usu\u00e1rio sobre os campos inv\u00e1lidos. Pr\u00e9-Condi\u00e7\u00f5es N\u00famero Descri\u00e7\u00e3o 5.1 O sistema est\u00e1 operacional. P\u00f3s-Condi\u00e7\u00f5es N\u00famero Descri\u00e7\u00e3o 6.1 As informa\u00e7\u00f5es do cadastro e as contas banc\u00e1rias associadas foram registradas no sistema. Pontos de Extens\u00e3o N\u00famero Descri\u00e7\u00e3o 7.1 N\u00e3o h\u00e1 pontos de extens\u00e3o definidos para este caso de uso. Requisitos Especiais N\u00famero Descri\u00e7\u00e3o 8.1 O sistema deve garantir a seguran\u00e7a das informa\u00e7\u00f5es do usu\u00e1rio durante o cadastro. Informa\u00e7\u00f5es Adicionais --- Nenhuma informa\u00e7\u00e3o adicional fornecida."},{"location":"entregas/unidade-04/2.especificacao-caso-de-uso/#historico-de-versao","title":"Hist\u00f3rico de vers\u00e3o","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Data 1.0 Jo\u00e3o Barreto Cria\u00e7\u00e3o Inicial do Documento 11/12/2023"},{"location":"entregas/unidade-04/3.ver%26valUCs/","title":"Ver&Val - Crit\u00e9rios de Aceita\u00e7\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 11/12/2023 0.1 Cria\u00e7\u00e3o do documento Vict\u00f3rio

O Diagrama de Casos de Uso feito pela fac\u00e7\u00e3o GBL encontra-se clicando aqui

Valida\u00e7\u00e3o

  • Restaurante tem somente um caso de uso bem estabelecido e acredito que n\u00e3o precisaria desse ator dentro da aplica\u00e7\u00e3o, pois n\u00e3o foi comentado nada sobre a necessidade de abranger os restaurantes dos destinos tur\u00edsticos
  • Empresa A\u00e9rea tem casos de uso que n\u00e3o s\u00e3o objetivos do ator dentro da aplica\u00e7\u00e3o, como: alugar carros e oferecer recomenda\u00e7\u00f5es. Al\u00e9m disso, n\u00e3o foi comentado no texto a necessidade de uma empresa a\u00e9rea se cadastrar no sistema
  • Guia Tur\u00edstico n\u00e3o tem o objetivo de filtra

Verifica\u00e7\u00e3o

Pergunta Checklist Obs Todos os atores s\u00e3o nomeados? Sim Os atores est\u00e3o representados como bonecos? Sim Os casos de uso est\u00e3o representados como elipses? Sim A estrutura de escrita dos UC est\u00e3o descritos adequadamente? (Verbo + objeto) Sim Foram organizados hierarquicamente? Sim Todos os atores possuem objetivos? Sim Os casos de uso representam um valor de neg\u00f3cio definido? Sim Os casos de uso possuem um retorno observ\u00e1vel Sim"},{"location":"sprints/pre-planejamento/sprint0/","title":"Sprint 0 - Defini\u00e7\u00e3o do problema e solu\u00e7\u00e3o","text":"

Per\u00edodo: 03/09/2023 - 09/09/2023

"},{"location":"sprints/pre-planejamento/sprint0/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint0/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint1/","title":"Sprint 1 - Defini\u00e7\u00e3o do produto","text":"

Per\u00edodo: 10/09/2023 - 16/09/2023

"},{"location":"sprints/pre-planejamento/sprint1/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint1/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint2/","title":"Sprint 2 - Defini\u00e7\u00e3o do projeto e alinhamento do produto","text":"

Per\u00edodo: 17/09/2023 - 23/09/2023

"},{"location":"sprints/pre-planejamento/sprint2/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint2/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint3/","title":"Sprint 3 - Finalizar Vis\u00e3o do Produto e Projeto","text":"

Per\u00edodo: 24/09/2023 - 30/09/2023

"},{"location":"sprints/pre-planejamento/sprint3/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint3/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint4/","title":"Sprint 4 - Defini\u00e7\u00e3o dos Requisitos do Produto","text":"

Per\u00edodo: 01/10/2023 - 07/10/2023

"},{"location":"sprints/pre-planejamento/sprint4/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint4/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint5/","title":"Sprint 5 - Defini\u00e7\u00e3o do Backlog SAFE do Produto","text":"

Per\u00edodo: 08/10/2023 - 14/10/2023

"},{"location":"sprints/pre-planejamento/sprint5/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint5/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint6/","title":"Sprint 6 - Prioriza\u00e7\u00e3o dos requisitos e defini\u00e7\u00e3o do MVP","text":"

Per\u00edodo: 15/10/2023 - 21/10/2023

"},{"location":"sprints/pre-planejamento/sprint6/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint6/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint7e8/","title":"Sprints 7 e 8 - Valida\u00e7\u00e3o do Backlog SAFE + Refatora\u00e7\u00e3o e valida\u00e7\u00e3o do MVP","text":"

Per\u00edodo: 22/10/2023 - 04/11/2023

"},{"location":"sprints/pre-planejamento/sprint7e8/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint7e8/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint9/","title":"Sprint 9 - Defini\u00e7\u00e3o dos crit\u00e9rios de aceita\u00e7\u00e3o das hist\u00f3rias","text":"

Per\u00edodo: 05/11/2023 - 11/11/2023

"},{"location":"sprints/pre-planejamento/sprint9/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/pre-planejamento/sprint9/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/pre-planejamento/sprint9/#sprint-retrospective","title":"Sprint Retrospective","text":""},{"location":"sprints/scrum/sprint10/","title":"Sprint 10 - Defini\u00e7\u00e3o dos crit\u00e9rios de DOR e DOD","text":"

Per\u00edodo: 12/11/2023 - 18/11/2023

"},{"location":"sprints/scrum/sprint10/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/scrum/sprint10/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/scrum/sprint10/#sprint-retrospective","title":"Sprint Retrospective","text":""},{"location":"sprints/scrum/sprint11/","title":"Sprint 11 - US01, US02, US49, US50","text":"

Per\u00edodo: 19/11/2023 - 25/11/2023

"},{"location":"sprints/scrum/sprint11/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/scrum/sprint11/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/scrum/sprint11/#sprint-retrospective","title":"Sprint Retrospective","text":""},{"location":"sprints/scrum/sprint12/","title":"Sprint 12 - US51, US52, US54, US57, US58","text":"

Per\u00edodo: 26/11/2023 - 02/12/2023

"},{"location":"sprints/scrum/sprint12/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/scrum/sprint12/#sprint-review","title":"Sprint Review","text":""},{"location":"sprints/scrum/sprint13/","title":"Sprint 13 - US60, US61, US53, US55, US56","text":"

Per\u00edodo: 03/12/2023 - 09/12/2023

"},{"location":"sprints/scrum/sprint13/#sprint-planning","title":"Sprint Planning","text":""},{"location":"sprints/scrum/sprint13/#sprint-review","title":"Sprint Review","text":""}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..0f8724e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..fb8bd28 Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/sprints/pre-planejamento/sprint0/index.html b/sprints/pre-planejamento/sprint0/index.html new file mode 100644 index 0000000..5c4ca7d --- /dev/null +++ b/sprints/pre-planejamento/sprint0/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 0 - Definição do problema e solução - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 0 - Definição do problema e solução

+

Período: 03/09/2023 - 09/09/2023

+

Sprint Planning

+

Sprint Planning da sprint 0

+

Sprint Review

+

Sprint Review da sprint 0

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint1/index.html b/sprints/pre-planejamento/sprint1/index.html new file mode 100644 index 0000000..7fd14fe --- /dev/null +++ b/sprints/pre-planejamento/sprint1/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 1 - Definição do produto - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 1 - Definição do produto

+

Período: 10/09/2023 - 16/09/2023

+

Sprint Planning

+

Sprint Planning da sprint 1

+

Sprint Review

+

Sprint Review da sprint 1

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint2/index.html b/sprints/pre-planejamento/sprint2/index.html new file mode 100644 index 0000000..b118b78 --- /dev/null +++ b/sprints/pre-planejamento/sprint2/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 2 - Definição do projeto e alinhamento do produto - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 2 - Definição do projeto e alinhamento do produto

+

Período: 17/09/2023 - 23/09/2023

+

Sprint Planning

+

Sprint Planning da sprint 2

+

Sprint Review

+

Sprint Review da sprint 2

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint3/index.html b/sprints/pre-planejamento/sprint3/index.html new file mode 100644 index 0000000..3804ab2 --- /dev/null +++ b/sprints/pre-planejamento/sprint3/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 3 - Finalizar Visão do Produto e Projeto - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 3 - Finalizar Visão do Produto e Projeto

+

Período: 24/09/2023 - 30/09/2023

+

Sprint Planning

+

Sprint Planning da sprint 3

+

Sprint Review

+

Sprint Review da sprint 3

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint4/index.html b/sprints/pre-planejamento/sprint4/index.html new file mode 100644 index 0000000..b8683fc --- /dev/null +++ b/sprints/pre-planejamento/sprint4/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 4 - Definição dos Requisitos do Produto - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 4 - Definição dos Requisitos do Produto

+

Período: 01/10/2023 - 07/10/2023

+

Sprint Planning

+

Sprint Planning da sprint 4

+

Sprint Review

+

Sprint Review da sprint 4

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint5/index.html b/sprints/pre-planejamento/sprint5/index.html new file mode 100644 index 0000000..bce32f3 --- /dev/null +++ b/sprints/pre-planejamento/sprint5/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 5 - Definição do Backlog SAFE do Produto - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 5 - Definição do Backlog SAFE do Produto

+

Período: 08/10/2023 - 14/10/2023

+

Sprint Planning

+

Sprint Planning da sprint 5

+

Sprint Review

+

Sprint Review da sprint 5

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint6/index.html b/sprints/pre-planejamento/sprint6/index.html new file mode 100644 index 0000000..6b336d9 --- /dev/null +++ b/sprints/pre-planejamento/sprint6/index.html @@ -0,0 +1,1566 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 6 - Priorização dos requisitos e MPV - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 6 - Priorização dos requisitos e definição do MVP

+

Período: 15/10/2023 - 21/10/2023

+

Sprint Planning

+

Sprint Planning da sprint 6

+

Sprint Review

+

Sprint Review da sprint 6

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint7e8/index.html b/sprints/pre-planejamento/sprint7e8/index.html new file mode 100644 index 0000000..1c738a5 --- /dev/null +++ b/sprints/pre-planejamento/sprint7e8/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprints 7 e 8 - Validação do Backlog SAFE + Refatoração e validação do MVP - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprints 7 e 8 - Validação do Backlog SAFE + Refatoração e validação do MVP

+

Período: 22/10/2023 - 04/11/2023

+

Sprint Planning

+

Sprint Planning das sprints 7 e 8

+

Sprint Review

+

Sprint Review das sprints 7 e 8

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/pre-planejamento/sprint9/index.html b/sprints/pre-planejamento/sprint9/index.html new file mode 100644 index 0000000..acb4094 --- /dev/null +++ b/sprints/pre-planejamento/sprint9/index.html @@ -0,0 +1,1586 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 9 - Definição dos critérios de aceitação das histórias - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 9 - Definição dos critérios de aceitação das histórias

+

Período: 05/11/2023 - 11/11/2023

+

Sprint Planning

+

Sprint Planning - sprint 9

+

Sprint Review

+

Sprint Review - sprint 9

+

Sprint Retrospective

+

Sprint Retrospective - sprint 9

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/scrum/sprint10/index.html b/sprints/scrum/sprint10/index.html new file mode 100644 index 0000000..0e3817a --- /dev/null +++ b/sprints/scrum/sprint10/index.html @@ -0,0 +1,1586 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 10 - Definição dos critérios de DOR e DOD - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 10 - Definição dos critérios de DOR e DOD

+

Período: 12/11/2023 - 18/11/2023

+

Sprint Planning

+

Sprint Planning sprint 10

+

Sprint Review

+

Sprint Review sprint 10

+

Sprint Retrospective

+

Sprint Retrospective sprint 10

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/scrum/sprint11/index.html b/sprints/scrum/sprint11/index.html new file mode 100644 index 0000000..33f4f36 --- /dev/null +++ b/sprints/scrum/sprint11/index.html @@ -0,0 +1,1586 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 11 - US01, US02, US49, US50 - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 11 - US01, US02, US49, US50

+

Período: 19/11/2023 - 25/11/2023

+

Sprint Planning

+

Sprint Planning sprint 11

+

Sprint Review

+

Sprint Review sprint 11

+

Sprint Retrospective

+

Sprint Retrospective sprint 11

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/scrum/sprint12/index.html b/sprints/scrum/sprint12/index.html new file mode 100644 index 0000000..916aa6a --- /dev/null +++ b/sprints/scrum/sprint12/index.html @@ -0,0 +1,1566 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 12 - US51, US52, US54, US57, US58 - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 12 - US51, US52, US54, US57, US58

+

Período: 26/11/2023 - 02/12/2023

+

Sprint Planning

+

Sprint Planning sprint 12

+

Sprint Review

+

Sprint Review sprint 12

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sprints/scrum/sprint13/index.html b/sprints/scrum/sprint13/index.html new file mode 100644 index 0000000..81da95b --- /dev/null +++ b/sprints/scrum/sprint13/index.html @@ -0,0 +1,1566 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprint 13 - US60, US61, US53, US55, US56 - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Sprint 13 - US60, US61, US53, US55, US56

+

Período: 03/12/2023 - 09/12/2023

+

Sprint Planning

+

Sprint Planning sprint 13

+

Sprint Review

+

Sprint Review sprint 13

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/stylesheets/extra.css b/stylesheets/extra.css new file mode 100644 index 0000000..01c839a --- /dev/null +++ b/stylesheets/extra.css @@ -0,0 +1,12 @@ +td { + vertical-align: middle !important; +} + +img[src*="#comunication-logo"] { + width: 100px !important; +} + +h5 { + text-transform: none !important; + font-size: medium !important; +} diff --git a/us/index.html b/us/index.html new file mode 100644 index 0000000..632a380 --- /dev/null +++ b/us/index.html @@ -0,0 +1,1950 @@ + + + + + + + + + + + + + + + + + + + + + + + User Stories - MPV - Beach Tennis CoordiMate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

User Stories - MPV

+ +

Histórico de Revisão

+

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
22/11/20230.1Criação do documentoWeslley Barros
22/11/20230.2Atualização dos critérios de aceitaçãoJoão, Luciano, Victório
+

+

US001 - Criar conta de administrador

+

Descrição:

+

Eu, como usuário-coordenador, desejo criar minha conta para administrar a arena

+

Critérios de Aceitação:

+
    +
  • Ao acessar a página de cadastro, o usuário-coordenador deve fornecer as seguintes informações: nome, endereço de e-mail, senha e confirmação de senha.
  • +
  • O sistema deve validar se o endereço de e-mail fornecido é único e ainda não está registrado no sistema.
  • +
  • A senha e a confirmação de senha devem coincidir
  • +
  • O email deve estar no formato "nome@email.com"
  • +
  • Todos os campos devem ser obrigatórios
  • +
  • A senha deve ter no mínimo 6 caracteres
  • +
  • O nome deve ter no mínimo 4 caracteres
  • +
+

US002 - Fazer login como administrador

+

Descrição

+

Eu, como usuário-coordenador, desejo fazer login na minha conta para acessar as funcionalidades exclusivas de coordenador

+

Critérios de Aceitação

+
    +
  • Ao acessar a página de login, o usuário-coordenador deve encontrar campos para inserir o endereço de e-mail e senha.
  • +
  • Os campos e-mail e senha são obrigatórios
  • +
  • O usuário deve receber uma mensagem de aviso, caso o email ou a senha estejam incorretos
  • +
+

US049 - Criar plano de aula

+

Descrição

+

Eu, como usuário-coordenador, desejo criar um plano de aula, para poder administrar as aulas da arena.

+

Critérios de Aceitação

+
    +
  • Ao criar um plano de aula, o usuário-coordenador deve fornecer as informações no título.
  • +
  • O campo título é obrigatório.
  • +
  • O título deverá ter no mínimo 5 caracteres.
  • +
  • O campo objetivos deverá ter, no máximo, 600 caracteres.
  • +
  • O campo observações deverá ter no máximo 500 caracteres.
  • +
  • O sistema deve criar os campos "objetivos" e "observações" vazios.
  • +
+

US050 - Visualizar plano de aula

+

Descrição

+

Eu, como usuário-coordenador, desejo poder visualizar um plano de aula, para procurar por possíveis erros.

+

Critérios de Aceitação

+
    +
  • O sistema deve permitir que o usuário consiga selecionar um plano de aula para conseguir visualizar o título, a descrição, as observações e os drills.
  • +
+

US051 - Excluir plano de aula

+

Descrição

+

Eu, como usuário-coordenador, desejo poder excluir um plano de aula, para apagar planos de aula que estiverem obsoletos

+

Critérios de Aceitação

+
    +
  • Ao selecionar a opção de exclusão, o sistema deve solicitar uma confirmação antes de apagar o plano de aula.
  • +
  • O sistema deve retornar uma mensagem ao usuário confirmando a realização da ação
  • +
+

US052 - Editar plano de aula

+

Descrição

+

Eu, como usuário-coordenador, desejo poder editar um plano de aula, para alterar +planos de aula que estiverem com alguma informação errada:

+

Critérios de Aceitação

+
    +
  • Os campos título, objetivos e observações do plano de aula devem ser editáveis.
  • +
  • O sistema deve impedir o usuário de deixar o campo obrigatório "título" vazio
  • +
  • O título deverá ter, no mínimo, 5 caracteres
  • +
  • O campo objetivos deverá ter, no máximo, 600 caracteres
  • +
  • O campo observações deverá ter no máximo 500 caracteres
  • +
+

US053 - Baixar planos de aula

+

Descrição

+

Eu, como usuário-coordenador, desejo baixar os planos de aulas, para conseguir enviá-los aos responsáveis pela verificação dos planos, que são externos a arena:

+

Critérios de Aceitação

+
    +
  • O sistema deve gerar um arquivo de download contendo as informações completas do plano de aula com título, objetivos, observações e os drills.
  • +
  • Cada drill do plano de aula deve apresentar seu título, descrição, observações e a representação gráfica do treino.
  • +
  • O arquivo de download deve estar em um formato PDF.
  • +
+

US054 - Adicionar Drills

+

Descrição

+

Eu, como usuário-coordenador, desejo adicionar um ou mais drills a um plano de +aula para declarar os diferentes drills presentes em um plano de aula

+

Critérios de Aceitação

+
    +
  • Devem ser informados os campos título, descrição e observações dos drills para adicioná-los ao plano de aula.
  • +
  • O campo "Título" é obrigatório.
  • +
  • O título deverá ter entre 5 e 30 caracteres
  • +
  • A descrição do drill deverá ter, no mínimo, 100 caracteres.
  • +
  • O campo observações deverá ter no máximo 500 caracteres
  • +
  • Quando um drill for criado, o sistema deve adicionar de forma automática uma representação gráfica base do treino (só com a rede e a quadra) a esse drill.
  • +
+

US055 - História do Usuário

+

Descrição

+

Eu, como usuário-coordenador, desejo adicionar elementos gráficos a um drill para representar o treino em um exercício/circuito.

+

Critérios de Aceitação

+
    +
  • Deve ser permitir adicionar elementos gráficos como jogadores, cano alterado, arco, cone e setas
  • +
  • Os elementos gráficos não podem ser sobrepostos na representação dos drills
  • +
  • O sistema deve permitir que o usuário adicione, no máximo, 50 elementos gráficos a um drill
  • +
+

US056 - Deletar elementos gráficos

+

Descrição

+

Eu, como usuário coordenador, desejo deletar elementos gráficos de um drill para deletar um elemento adicionado erroneamente.

+

Critérios de Aceitação

+
    +
  • O sistema deve permitir deletar elementos gráficos como jogadores, cano alterado, arco, cone e setas
  • +
+

US057 - Editar drill

+

Descrição

+

Eu, como usuário-coordenador, desejo editar as informações de um drill para corrigir erros.

+

Critérios de Aceitação

+
    +
  • O sistema deve permitir editar os campos título, descrição e observações
  • +
  • O campo título deve ter entre 5 e 30 caracteres
  • +
  • O campo descrição deve ter entre 10 e 500 caracteres
  • +
  • O campo observações deve ter entre 0 e 500 caracteres
  • +
+

US058 - Deletar drill

+

Descrição

+

Eu, como usuário-coordenador, desejo deletar um drill obsoleto para não deixar drills obsoletos em um plano de aula.

+

Critérios de Aceitação

+
    +
  • Ao selecionar a opção de exclusão, o sistema deve solicitar uma confirmação antes de apagar o drill
  • +
  • O sistema deve fornecer uma notificação para o usuário confirmando o sucesso da ação
  • +
+

US060 - Visualizar planos de aula

+

Descrição

+

Eu, como usuário-coordenador, desejo visualizar uma lista com todos os planos de aula para ter uma noção da quantidade de planos feitos.

+

Critérios de Aceitação

+
    +
  • O sistema deve exibir os títulos dos diferentes planos de aula
  • +
  • O sistema deve permitir ao usuário pesquisar planos de aula por uma parte de seus títulos
  • +
  • O sistema deve permitir ao usuário informar um intervalo de tempo em dias (com um dia de início e um dia de fim) e filtrar os planos de aula cuja data de criação se encontram nesse intervalo
  • +
  • O sistema deve permitir que a pesquisa por parte do título e o filtro possam funcionar de maneira simultânea e alternada
  • +
+

US061 - Visualizar drills

+

Descrição

+

Eu, como usuário-coordenador, desejo visualizar uma lista com todos os drills de um plano de aula para ter uma noção da quantidade de drills nesse plano

+

Critérios de Aceitação

+
    +
  • O sistema deve permitir que o usuário-coordenador visualize os drills de um plano de aula específico
  • +
  • O sistema deve exibir os títulos dos diferentes drills
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file