From 66a3a8ae7fe622efbf186582062ce1b6f9d158c7 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Fri, 5 May 2023 16:16:13 -0400 Subject: [PATCH 01/17] Add `ShinyResizeObserver` class and fix sidebar resizing during transition --- srcts/src/components/_shinyResizeObserver.ts | 132 +++++++++++++++++++ srcts/src/components/sidebar.ts | 36 +++-- 2 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 srcts/src/components/_shinyResizeObserver.ts diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts new file mode 100644 index 000000000..c38d4c7ca --- /dev/null +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -0,0 +1,132 @@ +/** + * A resize observer that ensures Shiny outputs resize during or just after + * their parent container size changes. Useful, in particular, for sidebar + * transitions or for full-screen card transitions. + * + * @class ShinyResizeObserver + * @typedef {ShinyResizeObserver} + */ +class ShinyResizeObserver { + /** + * The actual ResizeObserver instance. + * @private + * @type {ResizeObserver} + */ + private resizeObserver: ResizeObserver; + /** + * An array of elements that are currently being watched by the Resize + * Observer. + * + * @details + * We don't currently have lifecycle hooks that allow us to unobserve elements + * when they are removed from the DOM. As a result, we need to manually check + * that the elements we're watching still exist in the DOM. This array keeps + * track of the elements we're watching so that we can check them later. + * @private + * @type {HTMLElement[]} + */ + private resizeObserverEntries: HTMLElement[]; + + /** + * Watch containers for size changes and ensure that Shiny outputs and + * htmlwidgets within resize appropriately. + * + * @details + * The ShinyResizeObserver is used to watch the containers, such as Sidebars + * and Cards for size changes, in particular when the sidebar state is toggled + * or the card body is expanded full screen. It performs two primary tasks: + * + * 1. Dispatches a `resize` event on the window object. This is necessary to + * ensure that Shiny outputs resize appropriately. In general, the window + * resizing is throttled and the output update occurs when the transition + * is complete. + * 2. If an output with a resize method on the output binding is detected, we + * directly call the `.onResize()` method of the binding. This ensures that + * htmlwidgets transition smoothly. In static mode, htmlwidgets does this + * already. + * + * @note + * This resize observer also handles race conditions in some complex + * fill-based layouts with multiple outputs (e.g., plotly), where shiny + * initializes with the correct sizing, but in-between the 1st and last + * renderValue(), the size of the output containers can change, meaning every + * output but the 1st gets initialized with the wrong size during their + * renderValue(). Then, after the render phase, shiny won't know trigger a + * resize since all the widgets will return to their original size (and thus, + * Shiny thinks there isn't any resizing to do). The resize observer works + * around this by ensuring that the output is resized whenever its container + * size changes. + * @constructor + */ + constructor() { + this.resizeObserverEntries = []; + this.resizeObserver = new ResizeObserver((entries) => { + const resizeEvent = new Event("resize"); + window.dispatchEvent(resizeEvent); + + const resized = [] as HTMLElement[]; + + for (const entry of entries) { + if (!(entry.target instanceof HTMLElement)) continue; + if (!entry.target.querySelector(".shiny-bound-output")) continue; + + entry.target.querySelectorAll(".shiny-bound-output").forEach((el) => { + if (!(el instanceof HTMLElement)) return; + if (resized.includes(el)) return; + + const { binding, onResize } = $(el).data("shinyOutputBinding"); + if (!binding || !binding.resize) return; + + // trigger immediate resizing of outputs with a resize method + onResize(el); + // only once per output and resize event + resized.push(el); + }); + + // set plot images to 100% width/height temporarily during the transition + entry.target + .querySelectorAll('.shiny-plot-output img:not([width="100%"])') + .forEach((el) => { + if (!(el instanceof HTMLImageElement)) return; + el.setAttribute("width", "100%"); + el.setAttribute("height", "100%"); + }); + } + }); + } + + /** + * Observe an element for size changes. + * @param {HTMLElement} el - The element to observe. + */ + observe(el: HTMLElement): void { + this.resizeObserver.observe(el); + this.resizeObserverEntries.push(el); + } + + /** + * This method checks that we're not continuing to watch elements that no + * longer exist in the DOM. If any are found, we stop observing them and + * remove them from our array of observed elements. + * + * @private + * @static + */ + flush(): void { + if (this.resizeObserverEntries.length == 0) return; + + // Find the elements in the ResizeObserver that no longer exist in the DOM + const missing = this.resizeObserverEntries.filter((el) => { + return !document.body.contains(el); + }); + + // Remove the non-existent elements from the ResizeObserver + missing.forEach((el) => { + this.resizeObserver.unobserve(el); + const idxEl = this.resizeObserverEntries.indexOf(el); + this.resizeObserverEntries.splice(idxEl, 1); + }); + } +} + +export { ShinyResizeObserver }; diff --git a/srcts/src/components/sidebar.ts b/srcts/src/components/sidebar.ts index d06eebaa6..4c0638e91 100644 --- a/srcts/src/components/sidebar.ts +++ b/srcts/src/components/sidebar.ts @@ -1,8 +1,5 @@ -import { - InputBinding, - registerBinding, - doWindowResizeOnElementResize, -} from "./_utils"; +import { InputBinding, registerBinding } from "./_utils"; +import { ShinyResizeObserver } from "./_shinyResizeObserver"; /** * Methods for programmatically toggling the state of the sidebar. These methods @@ -66,6 +63,16 @@ class Sidebar { * @type {SidebarComponents} */ private layout: SidebarComponents; + + /** + * A Shiny-specific resize observer that ensures Shiny outputs in the main + * content areas of the sidebar resize appropriately. + * @private + * @type {ShinyResizeObserver} + * @static + */ + private static shinyResizeObserver = new ShinyResizeObserver(); + /** * Creates an instance of a collapsible bslib Sidebar. * @constructor @@ -90,6 +97,10 @@ class Sidebar { this._initSidebarCounters(); this._initDesktop(); + // Start watching the main content area for size changes to ensure Shiny + // outputs resize appropriately during sidebar transitions. + Sidebar.shinyResizeObserver.observe(this.layout.main); + container.removeAttribute("data-bslib-sidebar-init"); const initScript = container.querySelector( ":scope > script[data-bslib-sidebar-init]" @@ -170,13 +181,17 @@ class Sidebar { * Initialize all collapsible sidebars on the page. * @public * @static + * @param {boolean} [flushResizeObserver=true] When `true`, we remove + * non-existent elements from the ResizeObserver. This is required + * periodically to prevent memory leaks. To avoid over-checking, we only flush + * the ResizeObserver when initializing sidebars after page load. */ - public static initCollapsibleAll(): void { + public static initCollapsibleAll(flushResizeObserver = true): void { if (document.readyState === "loading") { if (!Sidebar.onReadyScheduled) { Sidebar.onReadyScheduled = true; document.addEventListener("DOMContentLoaded", () => { - Sidebar.initCollapsibleAll(); + Sidebar.initCollapsibleAll(false); }); } return; @@ -188,6 +203,8 @@ class Sidebar { return; } + if (flushResizeObserver) Sidebar.shinyResizeObserver.flush(); + const containers = document.querySelectorAll(initSelector); containers.forEach((container) => new Sidebar(container as HTMLElement)); } @@ -309,7 +326,7 @@ class Sidebar { method = "toggle"; } - const { container, main, sidebar } = this.layout; + const { container, sidebar } = this.layout; const isClosed = this.isClosed; if (["open", "close", "toggle"].indexOf(method) === -1) { @@ -325,9 +342,6 @@ class Sidebar { return; } - // Make sure outputs resize properly when the sidebar is opened/closed - doWindowResizeOnElementResize(main); - if (method === "open") { // unhide sidebar immediately when opening, // otherwise the sidebar is hidden on transitionend From 41712c609aaf14a098b63edb87ddc0f8f44f9038 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Fri, 5 May 2023 16:27:54 -0400 Subject: [PATCH 02/17] Mark updated elements with their RO owners To avoid contention between outputs within both cards and sidebars --- srcts/src/components/_shinyResizeObserver.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index c38d4c7ca..567d24db9 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -77,10 +77,16 @@ class ShinyResizeObserver { const { binding, onResize } = $(el).data("shinyOutputBinding"); if (!binding || !binding.resize) return; + // if this output is owned by another observer, skip it + const owner = (el as any).shinyResizeObserver + if (owner && owner !== this) return; + // trigger immediate resizing of outputs with a resize method onResize(el); // only once per output and resize event resized.push(el); + // mark this output as owned by this shinyResizeObserver instance + (el as any).shinyResizeObserver = this; }); // set plot images to 100% width/height temporarily during the transition From 22300456db379f24515d19bd63bea348d1159e6d Mon Sep 17 00:00:00 2001 From: gadenbuie Date: Fri, 5 May 2023 20:48:04 +0000 Subject: [PATCH 03/17] `yarn build` (GitHub Actions) --- inst/components/sidebar.min.js | 2 +- inst/components/sidebar.min.js.map | 8 ++++---- srcts/src/components/_shinyResizeObserver.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/inst/components/sidebar.min.js b/inst/components/sidebar.min.js index 476c5bed1..48d625bf6 100644 --- a/inst/components/sidebar.min.js +++ b/inst/components/sidebar.min.js @@ -1,3 +1,3 @@ /*! bslib 0.4.2.9000 | (c) 2012-2023 RStudio, PBC. | License: MIT + file LICENSE */ -"use strict";(()=>{var p=window.Shiny?Shiny.InputBinding:class{};function b(a,e){window.Shiny&&Shiny.inputBindings.register(new a,"bslib."+e)}function g(a){if($(a).data("window-resize-observer"))return;let e=new Event("resize"),t=new ResizeObserver(()=>{window.dispatchEvent(e)});t.observe(a),$(a).data("window-resize-observer",t)}var i=class{constructor(e){if(i.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(i.classes.COLLAPSE)}static getInstance(e){return i.instanceMap.get(e)}static initCollapsibleAll(){if(document.readyState==="loading"){i.onReadyScheduled||(i.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{i.initCollapsibleAll()}));return}let e=`.${i.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(e))return;document.querySelectorAll(e).forEach(n=>new i(n))}_initEventListeners(){var n;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(n=t.querySelector(".collapse-icon"))==null||n.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${i.classes.LAYOUT}> .main > .${i.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(s){return s=s?s.parentElement:null,s&&s.classList.contains("main")&&(s=s.parentElement),s&&s.classList.contains(i.classes.LAYOUT)?s:null}let l=[e],d=r(e);for(;d;)l.unshift(d),d=r(d);let u={left:0,right:0};l.forEach(function(s,y){s.style.setProperty("--bslib-sidebar-counter",y.toString());let f=s.classList.contains("sidebar-right")?u.right++:u.left++;s.style.setProperty("--bslib-sidebar-overlap-counter",f.toString())})}_initDesktop(){var n;let{container:e}=this.layout;if(((n=e.dataset.bslibSidebarOpen)==null?void 0:n.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,main:n,sidebar:r}=this.layout,l=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=l?"open":"close"),!(l&&e==="close"||!l&&e==="open")&&(g(n),e==="open"&&(r.hidden=!1),t.classList.add(i.classes.TRANSITIONING),t.classList.toggle(i.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:n}=this.layout;e.classList.remove(i.classes.TRANSITIONING),t.hidden=this.isClosed,n.ariaExpanded=this.isClosed?"false":"true"}},o=i;o.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},o.onReadyScheduled=!1,o.instanceMap=new WeakMap;var c=class extends p{find(e){return $(e).find(`.${o.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=o.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let n=t?"open":"close";this.receiveMessage(e,{method:n})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(n){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let n=o.getInstance(e.parentElement);n&&n.toggle(t.method)}};b(c,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=o;})(); +"use strict";(()=>{var p=window.Shiny?Shiny.InputBinding:class{};function g(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");window.dispatchEvent(t);let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&(r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(!(o instanceof HTMLElement)||i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let n=o.shinyResizeObserver;n&&n!==this||(d(o),i.push(o),o.shinyResizeObserver=this)}),r.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o instanceof HTMLImageElement&&(o.setAttribute("width","100%"),o.setAttribute("height","100%"))}))})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}flush(){if(this.resizeObserverEntries.length==0)return;this.resizeObserverEntries.filter(t=>!document.body.contains(t)).forEach(t=>{this.resizeObserver.unobserve(t);let i=this.resizeObserverEntries.indexOf(t);this.resizeObserverEntries.splice(i,1)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new s(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(n){return n=n?n.parentElement:null,n&&n.classList.contains("main")&&(n=n.parentElement),n&&n.classList.contains(s.classes.LAYOUT)?n:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(n,y){n.style.setProperty("--bslib-sidebar-counter",y.toString());let h=n.classList.contains("sidebar-right")?d.right++:d.left++;n.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var b=class extends p{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};g(b,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); //# sourceMappingURL=sidebar.min.js.map diff --git a/inst/components/sidebar.min.js.map b/inst/components/sidebar.min.js.map index f46cf9f01..7340f98da 100644 --- a/inst/components/sidebar.min.js.map +++ b/inst/components/sidebar.min.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../../srcts/src/components/_utils.ts", "../../srcts/src/components/sidebar.ts"], - "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "import {\n InputBinding,\n registerBinding,\n doWindowResizeOnElementResize,\n} from \"./_utils\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n */\n public static initCollapsibleAll(): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll();\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, main, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n // Make sure outputs resize properly when the sidebar is opened/closed\n doWindowResizeOnElementResize(main);\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], - "mappings": "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", - "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "doWindowResizeOnElementResize", "el", "resizeEvent", "ro", "_Sidebar", "container", "initScript", "el", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "main", "isClosed", "doWindowResizeOnElementResize", "Sidebar", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] + "sources": ["../../srcts/src/components/_utils.ts", "../../srcts/src/components/_shinyResizeObserver.ts", "../../srcts/src/components/sidebar.ts"], + "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target.querySelectorAll(\".shiny-bound-output\").forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n });\n\n // set plot images to 100% width/height temporarily during the transition\n entry.target\n .querySelectorAll('.shiny-plot-output img:not([width=\"100%\"])')\n .forEach((el) => {\n if (!(el instanceof HTMLImageElement)) return;\n el.setAttribute(\"width\", \"100%\");\n el.setAttribute(\"height\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n if (this.resizeObserverEntries.length == 0) return;\n\n // Find the elements in the ResizeObserver that no longer exist in the DOM\n const missing = this.resizeObserverEntries.filter((el) => {\n return !document.body.contains(el);\n });\n\n // Remove the non-existent elements from the ResizeObserver\n missing.forEach((el) => {\n this.resizeObserver.unobserve(el);\n const idxEl = this.resizeObserverEntries.indexOf(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], + "mappings": "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", + "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "ShinyResizeObserver", "entries", "resizeEvent", "resized", "entry", "el", "binding", "onResize", "owner", "idxEl", "_Sidebar", "container", "initScript", "el", "flushResizeObserver", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "isClosed", "Sidebar", "ShinyResizeObserver", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] } diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index 567d24db9..62e0d1f29 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -78,7 +78,7 @@ class ShinyResizeObserver { if (!binding || !binding.resize) return; // if this output is owned by another observer, skip it - const owner = (el as any).shinyResizeObserver + const owner = (el as any).shinyResizeObserver; if (owner && owner !== this) return; // trigger immediate resizing of outputs with a resize method From 2654175fde985908ba204ea66b58c7aca97747e0 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Mon, 8 May 2023 13:08:56 -0400 Subject: [PATCH 04/17] Bail early when handling resize if not in Shiny --- srcts/src/components/_shinyResizeObserver.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index 62e0d1f29..c07ccf43e 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -64,6 +64,9 @@ class ShinyResizeObserver { const resizeEvent = new Event("resize"); window.dispatchEvent(resizeEvent); + // the rest of this callback is only relevant in Shiny apps + if (!window.Shiny) return; + const resized = [] as HTMLElement[]; for (const entry of entries) { From 5c84d40017e6c63f49be3717dde39b333d2d150a Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Mon, 8 May 2023 13:10:55 -0400 Subject: [PATCH 05/17] Mark owner a little earlier --- srcts/src/components/_shinyResizeObserver.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index c07ccf43e..c9529d435 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -83,13 +83,13 @@ class ShinyResizeObserver { // if this output is owned by another observer, skip it const owner = (el as any).shinyResizeObserver; if (owner && owner !== this) return; + // mark this output as owned by this shinyResizeObserver instance + (el as any).shinyResizeObserver = this; // trigger immediate resizing of outputs with a resize method onResize(el); // only once per output and resize event resized.push(el); - // mark this output as owned by this shinyResizeObserver instance - (el as any).shinyResizeObserver = this; }); // set plot images to 100% width/height temporarily during the transition From 7bbc95b696ad5a985d5d8533571723f1a19cd1f9 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Mon, 8 May 2023 13:24:41 -0400 Subject: [PATCH 06/17] Use type parameters to simplify `.querySelectorAll().forEach()` calls --- srcts/src/components/_shinyResizeObserver.ts | 39 ++++++++++---------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index c9529d435..4583450fe 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -73,32 +73,33 @@ class ShinyResizeObserver { if (!(entry.target instanceof HTMLElement)) continue; if (!entry.target.querySelector(".shiny-bound-output")) continue; - entry.target.querySelectorAll(".shiny-bound-output").forEach((el) => { - if (!(el instanceof HTMLElement)) return; - if (resized.includes(el)) return; + entry.target + .querySelectorAll(".shiny-bound-output") + .forEach((el) => { + if (resized.includes(el)) return; - const { binding, onResize } = $(el).data("shinyOutputBinding"); - if (!binding || !binding.resize) return; + const { binding, onResize } = $(el).data("shinyOutputBinding"); + if (!binding || !binding.resize) return; - // if this output is owned by another observer, skip it - const owner = (el as any).shinyResizeObserver; - if (owner && owner !== this) return; - // mark this output as owned by this shinyResizeObserver instance - (el as any).shinyResizeObserver = this; + // if this output is owned by another observer, skip it + const owner = (el as any).shinyResizeObserver; + if (owner && owner !== this) return; + // mark this output as owned by this shinyResizeObserver instance + (el as any).shinyResizeObserver = this; - // trigger immediate resizing of outputs with a resize method - onResize(el); - // only once per output and resize event - resized.push(el); - }); + // trigger immediate resizing of outputs with a resize method + onResize(el); + // only once per output and resize event + resized.push(el); + }); - // set plot images to 100% width/height temporarily during the transition + // set plot images to 100% width temporarily during the transition entry.target - .querySelectorAll('.shiny-plot-output img:not([width="100%"])') + .querySelectorAll( + '.shiny-plot-output img:not([width="100%"])' + ) .forEach((el) => { - if (!(el instanceof HTMLImageElement)) return; el.setAttribute("width", "100%"); - el.setAttribute("height", "100%"); }); } }); From 48ff82f9202d398a0147bb27e162a126fec0afd6 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Mon, 8 May 2023 13:29:48 -0400 Subject: [PATCH 07/17] Add `unobserve()` method --- srcts/src/components/_shinyResizeObserver.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index 4583450fe..d60273075 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -114,6 +114,18 @@ class ShinyResizeObserver { this.resizeObserverEntries.push(el); } + /** + * Stop observing an element for size changes. + * @param {HTMLElement} el - The element to stop observing. + */ + unobserve(el: HTMLElement): void { + const idxEl = this.resizeObserverEntries.indexOf(el); + if (idxEl < 0) return; + + this.resizeObserver.unobserve(el); + this.resizeObserverEntries.splice(idxEl, 1); + } + /** * This method checks that we're not continuing to watch elements that no * longer exist in the DOM. If any are found, we stop observing them and @@ -132,9 +144,7 @@ class ShinyResizeObserver { // Remove the non-existent elements from the ResizeObserver missing.forEach((el) => { - this.resizeObserver.unobserve(el); - const idxEl = this.resizeObserverEntries.indexOf(el); - this.resizeObserverEntries.splice(idxEl, 1); + this.unobserve(el); }); } } From 8f56efa8c6358fed64fca449cb1afb66d53a5470 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Mon, 8 May 2023 13:31:23 -0400 Subject: [PATCH 08/17] yarn build --- inst/components/sidebar.min.js | 2 +- inst/components/sidebar.min.js.map | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inst/components/sidebar.min.js b/inst/components/sidebar.min.js index 48d625bf6..b45b34b5b 100644 --- a/inst/components/sidebar.min.js +++ b/inst/components/sidebar.min.js @@ -1,3 +1,3 @@ /*! bslib 0.4.2.9000 | (c) 2012-2023 RStudio, PBC. | License: MIT + file LICENSE */ -"use strict";(()=>{var p=window.Shiny?Shiny.InputBinding:class{};function g(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");window.dispatchEvent(t);let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&(r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(!(o instanceof HTMLElement)||i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let n=o.shinyResizeObserver;n&&n!==this||(d(o),i.push(o),o.shinyResizeObserver=this)}),r.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o instanceof HTMLImageElement&&(o.setAttribute("width","100%"),o.setAttribute("height","100%"))}))})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}flush(){if(this.resizeObserverEntries.length==0)return;this.resizeObserverEntries.filter(t=>!document.body.contains(t)).forEach(t=>{this.resizeObserver.unobserve(t);let i=this.resizeObserverEntries.indexOf(t);this.resizeObserverEntries.splice(i,1)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new s(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(n){return n=n?n.parentElement:null,n&&n.classList.contains("main")&&(n=n.parentElement),n&&n.classList.contains(s.classes.LAYOUT)?n:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(n,y){n.style.setProperty("--bslib-sidebar-counter",y.toString());let h=n.classList.contains("sidebar-right")?d.right++:d.left++;n.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var b=class extends p{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};g(b,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); +"use strict";(()=>{var p=window.Shiny?Shiny.InputBinding:class{};function g(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&(r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let n=o.shinyResizeObserver;n&&n!==this||(o.shinyResizeObserver=this,d(o),i.push(o))}),r.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o.setAttribute("width","100%")}))})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){if(this.resizeObserverEntries.length==0)return;this.resizeObserverEntries.filter(t=>!document.body.contains(t)).forEach(t=>{this.unobserve(t)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new s(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(n){return n=n?n.parentElement:null,n&&n.classList.contains("main")&&(n=n.parentElement),n&&n.classList.contains(s.classes.LAYOUT)?n:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(n,y){n.style.setProperty("--bslib-sidebar-counter",y.toString());let h=n.classList.contains("sidebar-right")?d.right++:d.left++;n.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var b=class extends p{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};g(b,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); //# sourceMappingURL=sidebar.min.js.map diff --git a/inst/components/sidebar.min.js.map b/inst/components/sidebar.min.js.map index 7340f98da..e8a0e478d 100644 --- a/inst/components/sidebar.min.js.map +++ b/inst/components/sidebar.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../srcts/src/components/_utils.ts", "../../srcts/src/components/_shinyResizeObserver.ts", "../../srcts/src/components/sidebar.ts"], - "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target.querySelectorAll(\".shiny-bound-output\").forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n });\n\n // set plot images to 100% width/height temporarily during the transition\n entry.target\n .querySelectorAll('.shiny-plot-output img:not([width=\"100%\"])')\n .forEach((el) => {\n if (!(el instanceof HTMLImageElement)) return;\n el.setAttribute(\"width\", \"100%\");\n el.setAttribute(\"height\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n if (this.resizeObserverEntries.length == 0) return;\n\n // Find the elements in the ResizeObserver that no longer exist in the DOM\n const missing = this.resizeObserverEntries.filter((el) => {\n return !document.body.contains(el);\n });\n\n // Remove the non-existent elements from the ResizeObserver\n missing.forEach((el) => {\n this.resizeObserver.unobserve(el);\n const idxEl = this.resizeObserverEntries.indexOf(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], - "mappings": "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", + "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n });\n\n // set plot images to 100% width temporarily during the transition\n entry.target\n .querySelectorAll(\n '.shiny-plot-output img:not([width=\"100%\"])'\n )\n .forEach((el) => {\n el.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n if (this.resizeObserverEntries.length == 0) return;\n\n // Find the elements in the ResizeObserver that no longer exist in the DOM\n const missing = this.resizeObserverEntries.filter((el) => {\n return !document.body.contains(el);\n });\n\n // Remove the non-existent elements from the ResizeObserver\n missing.forEach((el) => {\n this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], + "mappings": "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", "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "ShinyResizeObserver", "entries", "resizeEvent", "resized", "entry", "el", "binding", "onResize", "owner", "idxEl", "_Sidebar", "container", "initScript", "el", "flushResizeObserver", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "isClosed", "Sidebar", "ShinyResizeObserver", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] } From 778da4e8de6973a0984c398a62b95f1656138f2a Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Tue, 9 May 2023 09:18:30 -0400 Subject: [PATCH 09/17] Apply suggestions from code review Co-authored-by: Carson Sievert --- srcts/src/components/_shinyResizeObserver.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index d60273075..749206b77 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -51,7 +51,7 @@ class ShinyResizeObserver { * initializes with the correct sizing, but in-between the 1st and last * renderValue(), the size of the output containers can change, meaning every * output but the 1st gets initialized with the wrong size during their - * renderValue(). Then, after the render phase, shiny won't know trigger a + * renderValue(). Then, after the render phase, shiny won't know to trigger a * resize since all the widgets will return to their original size (and thus, * Shiny thinks there isn't any resizing to do). The resize observer works * around this by ensuring that the output is resized whenever its container @@ -135,16 +135,8 @@ class ShinyResizeObserver { * @static */ flush(): void { - if (this.resizeObserverEntries.length == 0) return; - - // Find the elements in the ResizeObserver that no longer exist in the DOM - const missing = this.resizeObserverEntries.filter((el) => { - return !document.body.contains(el); - }); - - // Remove the non-existent elements from the ResizeObserver - missing.forEach((el) => { - this.unobserve(el); + this.resizeObserverEntries.forEach((el) => { + if (!document.body.contains(el)) this.unobserve(el); }); } } From e050182cc89e16e9c83f5ce43269ff67ecc3ceba Mon Sep 17 00:00:00 2001 From: gadenbuie Date: Tue, 9 May 2023 13:25:07 +0000 Subject: [PATCH 10/17] `yarn build` (GitHub Actions) --- inst/components/sidebar.min.js | 2 +- inst/components/sidebar.min.js.map | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inst/components/sidebar.min.js b/inst/components/sidebar.min.js index b45b34b5b..9b030c04b 100644 --- a/inst/components/sidebar.min.js +++ b/inst/components/sidebar.min.js @@ -1,3 +1,3 @@ /*! bslib 0.4.2.9000 | (c) 2012-2023 RStudio, PBC. | License: MIT + file LICENSE */ -"use strict";(()=>{var p=window.Shiny?Shiny.InputBinding:class{};function g(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&(r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let n=o.shinyResizeObserver;n&&n!==this||(o.shinyResizeObserver=this,d(o),i.push(o))}),r.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o.setAttribute("width","100%")}))})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){if(this.resizeObserverEntries.length==0)return;this.resizeObserverEntries.filter(t=>!document.body.contains(t)).forEach(t=>{this.unobserve(t)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new s(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(n){return n=n?n.parentElement:null,n&&n.classList.contains("main")&&(n=n.parentElement),n&&n.classList.contains(s.classes.LAYOUT)?n:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(n,y){n.style.setProperty("--bslib-sidebar-counter",y.toString());let h=n.classList.contains("sidebar-right")?d.right++:d.left++;n.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var b=class extends p{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};g(b,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); +"use strict";(()=>{var p=window.Shiny?Shiny.InputBinding:class{};function g(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&(r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let n=o.shinyResizeObserver;n&&n!==this||(o.shinyResizeObserver=this,d(o),i.push(o))}),r.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o.setAttribute("width","100%")}))})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){this.resizeObserverEntries.forEach(e=>{document.body.contains(e)||this.unobserve(e)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new s(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(n){return n=n?n.parentElement:null,n&&n.classList.contains("main")&&(n=n.parentElement),n&&n.classList.contains(s.classes.LAYOUT)?n:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(n,y){n.style.setProperty("--bslib-sidebar-counter",y.toString());let h=n.classList.contains("sidebar-right")?d.right++:d.left++;n.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var b=class extends p{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};g(b,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); //# sourceMappingURL=sidebar.min.js.map diff --git a/inst/components/sidebar.min.js.map b/inst/components/sidebar.min.js.map index e8a0e478d..f51e103a0 100644 --- a/inst/components/sidebar.min.js.map +++ b/inst/components/sidebar.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../srcts/src/components/_utils.ts", "../../srcts/src/components/_shinyResizeObserver.ts", "../../srcts/src/components/sidebar.ts"], - "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n });\n\n // set plot images to 100% width temporarily during the transition\n entry.target\n .querySelectorAll(\n '.shiny-plot-output img:not([width=\"100%\"])'\n )\n .forEach((el) => {\n el.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n if (this.resizeObserverEntries.length == 0) return;\n\n // Find the elements in the ResizeObserver that no longer exist in the DOM\n const missing = this.resizeObserverEntries.filter((el) => {\n return !document.body.contains(el);\n });\n\n // Remove the non-existent elements from the ResizeObserver\n missing.forEach((el) => {\n this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], - "mappings": "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", + "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know to trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n });\n\n // set plot images to 100% width temporarily during the transition\n entry.target\n .querySelectorAll(\n '.shiny-plot-output img:not([width=\"100%\"])'\n )\n .forEach((el) => {\n el.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n this.resizeObserverEntries.forEach((el) => {\n if (!document.body.contains(el)) this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], + "mappings": "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", "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "ShinyResizeObserver", "entries", "resizeEvent", "resized", "entry", "el", "binding", "onResize", "owner", "idxEl", "_Sidebar", "container", "initScript", "el", "flushResizeObserver", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "isClosed", "Sidebar", "ShinyResizeObserver", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] } From 57f4c9d8a8167de82a1703cce9083f923479d943 Mon Sep 17 00:00:00 2001 From: gadenbuie Date: Tue, 9 May 2023 13:26:08 +0000 Subject: [PATCH 11/17] Resave data (GitHub Action) --- R/sysdata.rda | Bin 190538 -> 190488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/R/sysdata.rda b/R/sysdata.rda index c001f94cd55715fdd3631884be3b06df5be78694..f97a55dff014ae3212431aff966d295b18350aca 100644 GIT binary patch literal 190488 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%0ARYUiQ1z6qJG9VrQVs3o6LU|DrhNKJ4 z5`l{ho*?oVn!dkGWTqZ_e^z3B-yWsd>q#v*^Z&uEJ7S}Dw)LIxL4;O<06##$zwfJT zVDnI@VEI8suHUhb;<53a2bvGG5<16w8Y>qlmVW-wQ1aG}zrcoG2h{#QDR_Y%kd!ZL z4Ms`>(}EYDqikenad-cTYzvDeYkh%=Z;1$B@F}l!vC3>wSs^Ru2>lw~{JX1DKjZ%H z`sL(u?$TZ;IiR+ce=s_frxuUwQ}z~p{I)#UE1M8{X5;1Si3Z7~7LnB@C+!BmuYS5u z=BwzB%`HTCLMNizy?)=#nt~N@9K&khPTVjylAe9*eTh5@ruAE@oWfruu&*@l>2hCY=?y)Vj*w`rPH0*}2Q8W4_EthX3 z)*71R(*D4S)%^lO3v$r?EBnyM@wHEQm$$6mV!P=X6MGjWpuDf87NRSfaZ8$)YhQ4kYvKFOOG833Mr6x|EDq!!u8G;g4zo6 zLW0O>1_O*?NY=eD^#dERB#ZxIf0^*1zvmH`vU)Db`*l~yS)(tk3x*Kv=YzOiLCAm- zP+5YBy5QNf!6E4&L39o*q?flnHL<+=P)L;CHgrkeIw?hBIfO>s>4V&yX*z*|Rx*JT zAIwHR#)muwxC{s^nBw?6;)1eM!-7(W(e8%iEYCXj&K5{?OwNbK+m!?D3S)FjBS!); z*au&&=o!ddqO}3kY3&dOdY`f#?Nc96g`P~xwsWG`GY6p^KKOa_e8Wxt`UTF0Kknf17X{QlRPpSYncnxnnLj!gK-`85{i$J?IhQ@WW^Mxbtc3jYgZr7x`KtB^R?OaFlO#Jq-X6oMBaO$ zLeVfc2v3?Z!I?WLKnW(Z05nXa(*a%}{C1a7=_a1>9Sc#>p%9=33|&&6Eokm5u5v-E zZKz7&B9LK91RKIM4}UIIK=g%de*m$}Tz+-m zPEHq^*4@9bdeBQjrGKb3Im#@LipX}-KACwKmjjn@^^X@&`ARvEUq_v&D*Z`}^Q9@r zIsibI(OwDDB3}lNaL+v|aZ6*A4299D)UE|(rF#5x5SpCs>VmqfJ)-v%iHD!b^Xcit z9CZ44@Adlr9{de9)CcdFf&1^%_Wy3dVsY!0w_nt$OW=lM%kV7d_`HhweQ;wzhv#t$ zPMzGaIE;wNmJh~&hnd7?LDlUl+0xpUu44B}39vnD$kgu|_mQehR2<9Is-SQvpnV_X zG5F5am(2zM{uxBdDU)(|eF9fXchJmF{%=mr1B5z1(AFZB$ z^#9)fzy80!*B^ZAPt|Te;x5*>Z_r&{ySx(mrTxbJKU!Qq(ZMgq&u(SJa?>Nx1H>EA z(}}qspClajL(qY`A$bF)&&?DPbt>1t>H5o$Z15aO|rh(yIe{-yDF95Io>>aLH;;tXkBgg^CG{`@&{6M4+=Act@Q|t_(JEf=FD2mdsfTtq2(43mLO3-O_xYcbcv>?i!VX{b zIFz5!3t-7lz#%v6U)tZ%fowDTpxNmOfh#8-xJf_l*wI(x6bIYT$=kbsj?uLbcDDN9 zQLCHeQA7=4*+nSmX-yZq(Q@OvRu}n~HUplQ-l8H1LQ?q4LG0>MtFd@R1CV_5<2)oZ z#u+4Gq=N9AeEev<7O7WTe3#e>_BW7a^grl_WsNR>HdbAzP8A@if?+3i-#-wi8Aca| zM~lq`xxxsHV-k$*>hhgLmwM+xP67VGI4nvPL&=aDRzRH7O*w&?m=oM~3uxgC&EX4Q z^;gTiG(<)h=sXZpgRO&1s}{9{;t%dI9>^F=_Z6RF(QiSo70C1n2sUfC?19b@g-jkS z$l3=XEB>(=>`jB2M=gT_awH`3G)%1@JSM3P92x1 zfx`ND27NA|qW_MFHZ<-=kgOv_G!qa}Qr;5sQb7j3pP<_FLPNA!kBqWd=0-uo^YaD) z3_N~d80b$74+jr|iyUH9?)R0yFoE_YV}47}f&3PVqGbf4Q7m0KUqRCC^bI`FZH0!I zm*_X*OqJ<%@5Z^X4-Nd7%8d9B>68ic{bIQ43BvI*<=almSPkU&QQYG1Poh}I?z4s3 zKVqofI#@A99dN%@1tc7R`^To70AZOB;OzTTbxKv+yNEOOyT7mV^4TZ@WQ zx6~zV&LYH?QR%tu1xw?-9kazKcUK~{=`Ea6enb+G3Le!wiAb5C{V#sP6VQ4C2O0OY zJHD5$h%;C!3j$aG!2aMrQjGbE!Hll|IX>KFw8k;_dRI7};U_2>km-KUI^T&f<*y1} z`*gd=0gY;);1&w!i^z^TyGR9H{P@COQEW#vHY4B}aB)GYBJ<(Mv*gCJrPGivwNlJG*Z4Pyi^Q=#G zK5a;Xce#x_8bzL$JBs~$A@gj`@1qul^{D8_9zC|4iQ;W7($Lp_{3$QY_0=G3)PmN& zk?i*CBTt&BT|$7;;lh8X0cN4OdZqq)pPBW_9G2!R67~1vyw~1VfIJ}=c`8RZ>E2+U zNL%lNtyCr^RgefT(t>HpZwL0EeE)Ul!+=?FK}oS+lZ zvIguj_4E7n^oq13-=nPe`u6yD+-ZRw-=V*@AaV1rTyL{)|1e$;p2B|QA}sg0&`m&P zLF2g}2pUH%^>ce?^ttGR3OW_h0x7|Ql#{)3pv}ZhpyA7=pu)+0((s}LNM1c118(F- z_Cc&61hABX2dWRG9Oa<0f#%AS&|RktOU7Tp6T^aEyQY}Pd`o-sUubX=g#M)B>rcg- zcW@kbmU0S;f8J+3kyRI349On|cH&?AKI(;0H(BHcF|hbWxW}b&+aSnDel@Wr&yzX# zV?3GZdGL4hd*uJl3s6|=AU6gU5OPb)zvL2GlHMBZ(|Cf+E);$tNR-w20(jnl?V*BO zyw`3C^o|b3`$j|;FO2huLc~x=Z&t(_{!n&G2y92>jkN~C$CnSgz@4Sd{_a9O<6-cB zU__ju z^mU+vyJI|0$B)C0ns^|1&o><7;f?dw-yXlq|084%iw!`3{6&-g(?cpC!9}(g0i&7+ zKy7;d#>0XO74(@9STTygmSx}#$f4*Gh2n$M8Wh8d3uqw0@U1~F$V(Bq9&nKfbCvAa zRAKyn(0Ck>RpVem4h#7Bu;I`AvBxpX#~7G`MRRik(mofdJi+`0n%)n_#dEGcNuiCw zL3iFjK*vG@joO8W{ur|OS9;zWwB4%tC=9-U>qZpV*ZuBfDD!2CX)$-~Lh%*65 zB~N2HW&Qh34QcT>X-f_N* z-+xldH!!&x`Tuy7s`oNa@vCTgM;jI_qqU?Pr|3&;NH6!Fp_LKitaPkF6pUjSGKtj% zUhW?-Vy1%R(qV>uy5W5ccW!`F@tFTAyw({5er8PCz0inSIJDoCePd6Mys+vVymC;J zqN)-nQ!EcXUU{ZN4zj)w=1ZVPdbZQa*=$*kZA)MpyddsFvqf*tC>zb$qM-7=g8~j@ z_Y~3${_qP)ZDza!$ZC&DD81WZfH;y!U)$3Yo)8-Oc$ec1Is}yN2Za)xYA+HEc4M&Ya6-*A!tOGmAbD4j17FU`#AKi|JNr=t|11 zFR4yszo))%>_d#+m`b>Q_6{wb{n*{P_Ui6P!pzV4htwlet#KGIW1W&_c4891(LDsD zvco4K_&l=7LF9aTWxrlc+E`w3L2}iwv(UVAAmIelpkzr}M--*l4a77iSy_P3RO>{3 zt4^{k#|4Q5kV=ESCs%c1%SEwH=DRX~{|fHPF?XdoyY(eX_}j_OZj zwA-%GkhUHiBy3?@DFH(Ul4)`wzNSBaqaM+q;Cr)p7f90(Npq46 z5uCi#{z#AX%fJZ!M9jQ+!hSAXkY)(lFtmeu3nr>I;A0Y?*1$BNx6mOVX%!&It?1wH z&k#%&Nr4Ad*|Ze+d2%}-si_5YLSLWT zU#(xP|9QO^q^ID1`u*w^9upFNmz2@E-gf@q_d#ej)PjM(m>e>qx243jTtN^Ii8$jR zZePhF7H0tbEq}-eRXns4-wJ{Z=}9e!q0SU!We5%Od>bQDZ|z zGPq>|NIxhH}SNmg$??ASJK82Be! zVL>vEJVvj)O5zWtD}{5yix5i88xoj;P`L`fSRr!6^bPpFf3Qjl3sGSPQ0>-clwLLl zw+bdiM{x-+>wPjA;RMODYcpM)$~Z@`6vp zEZU&O+64VbWvn~Uc?5lS;>L*()EYfxnQx%LbwR>iYEw?@R=x!2WkecLboBpEJxMiN zbrkphos$7W$a~2lhmu+h@@Yxg66LRG9yU8C9*ec1e>#>^E;KRo`eE!MmucV+erhhE z4CRu7F!d~R1IskECQ%ZaHH9+^h$`kr*9zg$s?Pc9$mY>ahJt1s!n~BC{^S{ucZrk< zWvf={WVgb%Z*LCxsO<_n(r7ySMeQ?LunXJ$l0O0PBIhCF+5)r{!uzCJZ*g(n?B^wF zrFKM&@S?wiDg>{GV$7SxsZQldonlz0|9b+8w}ojFj#81qPFIgAddCc{C) z2d$(LuOX^>aZQ@Y)BBj1m;x~5zvSg9!^^K)R=|<(4_B(hk|K(fX+sCtGf-x^5S*hMSmFtjfza~I_;S*l##g8{BUU`1l&7La0x zkQk`G|MWeOuV)f&LdO&!$T$$Hnm71gk(z`F{m79g8|hZH8&Y_FCS37mwuZDN@Jonz zu9`FwefCKL??J8WUYQyAVZ$YJu{9=S;1WYkFBtNp%*zU1ND(gQ%dNa#Q2e$f7%QN* zgBYIz*<~6x-_fNNTGGmb%V;Tbul%d$bUui3nCzT5Hj#BRH~+^tZ*wvz&$5#2eHP z9xDiQd4V-{s1En(aJIPs?ezkiZ1E8cV;INP6sm_QID=u!b2wZni$D+Cui4GC;}u1r zfj%4w7LXuQ^dP^YpWWHVYG_uJc3O7+Qzv9T)6lfTaqSv!rA+6Y1mBg?dw1Ht-DAT3 zg$f#jr8(El0A;3Bu#>y&N~wX zNJn?SL^%4C(1zUks9=*8+UQiK6#ED)lkf#c5ftid7_MNJuM$s*DcKThu5J|1yn%?D zGmrC1;Vsv?HiNV1Jwc9rX45K8wpvDH9?H=mqy(YkL)|yXfeL_STN^V5#ox(((EGr1 zLhcyQ<3kXMc(iM`DTUyI`KPGMX!XM~256IF_2^3JVLl4>>3z##l zLwAH53A<+?s>{-)~>9TfGY2<@k|Lyh-u|#Z} zwPz)W5Y?ig5SH;Ej)Rv#i^(G%cCG>HEwOg^v;(+SfboJ{%D9O3&S$;JE z>otRt7&IAK*QW|@JmKeFj?jyxA950YbFIX|bp%)UX!`S}*>|#9z9u3Bujlyr{~zZn zGW*ap@=fhQVr@hy`w?UoOh1}fkw7Yi&?7hE>Mq;tjuuZF4n#a-U>O^$Kd;;bN=v^n zVS<8+AxT5Y9=`mLNbSqC`sg5_=z|N&u*Xq%$*+GWWH8#LrK;!$f)8CXBg~Y@4W8}t-aG@f8Y2p}&7CkT^m`cDOshwGaG7W#Jg;&JA z#+k@38sq-d^bt@?$*fqB2BKHazlvDV)+k2DP%Rx2#*_irVhuhWjGTqH?h}_9YkPIU zTZv>JzOrR*>M zs`b=`At$Eke_GSEgBh|*aIa<*Cv68jV~y-A9B)>$OK^zN_0)l(hN`@H~ZLOt&J z&7oL%m%9b>^dv+v_7)7XWLl|S0DA2sT)YovP)`nnoW*#H@@&{@V~?HqiA z$c6hw{I)?rM3rF#RyTY~-DF9bWXWeU$@pJKXccjch&Va=tQvPAQu0KHzO+9y zWlzQ79&T{&_{o)P{l%?B8;pqtfO z(dKyh=Z+Wa9dxb=WkJV}NH~c!k7icH@MKyckbLnu*DL>HttY8 z=>i+I9-H>?hvHJP13)JgfVRI&+j?Mf?)a34eW74zI!9XaSL|kd%d3W3X0p{dk7HFq z%FHm}4~>W#o2TPls)MgN+PlmeMer*H1dTWay~NzQqx0n+bihG354Xs) zke?CNsVfhkO5OEHzu|hJaG`+;T__CiH!g%N{D)WA+Rd^lliTRKyyQN zbT1yfAYna%+&e;$eb~4iD~pv5C~-z>W7>P=Xk#B;P1LJs?f1`GML>3b+e2^Ny$E`V zodpmIDp8C(qpQ@=WC`{ms}Bg=7S25oGf<@`qIYs%v#Gz_6ZdD=`+U6mfbkqafbqx% z>;4Smw4dOX`Vya9wNYkTP-%v$;hCWELZ&O+lY8X2|l8Sp`qOwAgU+8l>yc=?a=O!hf~!J=%XL z06kLo@$o?NH-xC ze6{A=mXy(|5}I)=NGhf8ZqMFq$Zz6xO;eq{VVXNp7yaX02wK{QOtM0!!3T6aOfml# zDi$Og3A_-jf)JB`GDxsbc1e`RX8~1F+ClhKjVqsQm}x&KsKdM0p?01dPbUUFkj2GsxIPo}{G)F0s>Z zlqXn2w)xj?q38YTp)%bNrc_VKXi=CLBy8o49=BtGwiDb7JxGG5HTonac14;~mB!yG$BJIQzBV{>Dn1(|^0gVMn`FEiEpyc8rG~U#M ztshV|CF|F1eF&XCHQ_92Ul9*}7(Iq#NldK#{8unGf>I9Xy>TxmqW3|$h#k;^$ceEL zf-rhvbq5Pz@_9R-xQylzwS5mEAgzI^P+ozSMP}11UPP8u5K-hgMjGZR)u5@p6`72K zRanJcW@|s$8jH>gJL$%M$dr8?@%7}&X)2J~n$|4vB5`IwGAnOnCGbz&g1mh7VcNn2 zS!8?!c?iF-OXpDI^DI5h-Bc%T-6n{gm;19?N*&rbLxw>HVaug8N*0W9rt~1tCH(>W z-{7pGSz3k&rE>}yALSn#KLW2?e=cdRjCwHvOk8xV;$T73kA+X3WPL#ojGk3W=osbL z?}MEv*A1-O?IygSmcBqLO4R104pZF=eZFOemPsFY>kVNnUH&knQ5>35XTW+^?e@F% z;E|OIoxZ@h65i>Z4@8?z(XYdJMk9B>B>o=Ib5CYTRyWcC;V$H27!U=po1wm~+1L^0 z+r{xtI8|7YUc?jVCBnsg@X!J-_5pAaGpdeCnbh(9cA6<|a-wh}IzTF_Y~MCoMAQ{4 zR*F*+it6Nt5+p2zY7|<#U|I-uqZUY|_h0tX2Yg$Cap=*CdvUv$*T;Vue}W*?*j8nV zcH0Bz$Aj@J%7ByU83Eup!rA2oS>axfR6v2KbxG_CSD^d_;IC5Ab&A+)!sx%IvO!RM zHlL$q?qP9dEk zA7s~(v`QTThav}}?fln&6$gr8Dr&JTeS0M>?Bpi%)mTTWMVaj!`xP(onKqJ}AmO_Y{9 zA9OG9g*9*XNXLp3FH^tSW1g1~hz)A+(utn4>wNoTLG;tlf0le0EBn09Q5?p#a}wWl zMqPe-F875%BIFcr&M5ZLPsXm|%Ar>_^dk*T8Axvfv^qrp4bY&ncLhlCMUO-kSdSNL zA^oZ7IWG&_FW|}j+WowAV{wv9z1T`z_h}@n7amT&dXKP zzbOUh*smLrbK)_u!u#jcy_ z)z|*+&_U}N8n^kQ1rXwbN)BF=0@XW|(z}KadJ0d?bQV0!FZKaEdeV*;4XjZfY`+39 zlbNIh_Wr%79ORp_Ab5ihhsiXD6hq>YJzioTB=WV3%B?EX`ct+ z(Fy&OZk#3M?*d{A-SHx)uh?nvW{=i+3PMXFJTHC(ze#m5ac4m*=VT_R*azB6PH?!Npjj{^L&pquk=@dr+-}ID%hwOi)qggN@qw_EQlI6~hD@!4J|?%}U{Z8qBI==YBJcY4Vf91P z!rra6jQ7nB3rIj&uR;@V3B5&M+E?y|$b5F#c)`OG9DqXY$d^GV)Pf0URFFISPYcAzW-fnSbM1J0u* zhi}yyreG9*((zeP#2AZ#;4KD7EKW1$$NFG8n+r13q+mv9g)0?=nV5ge2B!j_QFoJxBVFo-Hlmh2wsoHIyt*#cO|#Dx!o=`s@##WFSe zLd?YRw5SXi1E5Q*f!nJua(IkjOgd8v6Ixp944C`s?oYHPB~pxdQy$3(TyX~wn7_gR zfVZ#5fH}zMo*|tF9Bm4{bfHH|X!A@%>V-*wxc4M|O|b9pUM!V)dwBHSSJ}sm{jtB6 zfu;|dYsJjIt|fh*ME(zg?OkbEFB>blgTRZb_O|5b@*^WO7uP5 z62&W?h8?{(K|#F($XjXPydMufc708Fe;y*C4(db!UIFqCFq9QHe9Pmj;Ri2U3b==$ zMfJ*-O9pIE&_sA8eRawQ{3g5|Cai{_wm`HPr*0ZZf3RJ_17UEs7KE&iP(=agtR_xD zjRiw1`sn?LNGKlQg2y(>C^cwKfe>CL5!#3$7LkFfbuEt{@Oc54)Mk9={4-bVcL28_ z`aNR(W3kg>4~K?nt$Eu-`ssL7gvg`Jma(iYE!txXJI%m0xg zNC)9RMX5-;atCcMQ(HaCqaH)hVd5$ue}9+GN4;kC!YES@2~|MPDF)a6c?#@l zo=t5<+=6+Gt!p;8PonpXtmF|t8`QT6WPflY;Zd=h?-}!5sK|l61WPB<31lHYOR^@G z%Sb2|`cVp0B}9{Cp?Uw0oyOZseqoDet!3EQzgIA@)RA&@5Jy@`V z1NwvJ^VT$ILjxX7X!22j6M4Za?XkJS!QZ&0=R&1BY;zq%4~!x zR-;o`P`nI=w~1a5)%kzZ0nXMB9OTaU>?F90$X={PsC9gc6Zx;l-W275lTN6GRq-3m zKD`#0dM{V!qE4klFqEJypxDreh#SKtD6!C9&Tirqs4f6`pFivVEq_P){~sQ9DIl(J zOOBi)28Gu@tLCi)^qSTdG10uQV7~q=ln*i87kgji=x{8W zP}oe+Xv4y8N%IMfBq;v^42yvxLZ`o`y2N+>xr9ij1Y9Nsg5;U3n!=(BwDO>a|6^fl zuao2&-C8Br70*W++=%%QWJJ(Y&#u4i{+n;d&5WLv0K+K+Jh+iUz-S&InDj1fLq&iu z&vt1yJRDCcikez+pClxF!h^5CK{q`hOw8&HD@_*=Pv<^yO%(IZ%7enhgFwMIlGW1A5qUO{Th_8~4t1S!}+wWW4TPxa_gULV@_QC>Io}x7RKvEYD>0U+z zx}q6-Ou`X?da9d~FTXqA#WmU2 zq% zlS~L20@@|^g-6ZFOV^{uDfF@C_$RvA&KG^Qt4j^N^JgFNx6+tIt)1W27*8 zjAm{N(3cm>Z=RGpv~lfDl7j~Kt(anjnISr0;Z0)wB*5=toBarSctm`m3KsVH-j*Dx z+SQX{8=iWVn^zJNwS)|`hbAp*)eHXLo*U;~I5Z)R?WkBgfZGuv4HubFV`@4N=xQQ9 z(9se8^rHp8v^9o<`+H}aIQ$`Zr}$u5C(;>;9U$Talp+&>1I(hZwsHK4Rxy9ih%$Tx zB-A-@Luh|y69cp<{y>+b9)Wl9oqFZrdjDbmAs>67)zsC-hS|R6hh$>y$x26Ch<@a? zS3BD*G+;c|)*dN(R?P?AJ+e7+-iO;ewd_DO=t4GZqNN5IO^yLkt4?mXU!~Sw`(&yph zQdpZ}Kd2GL#=Rc2*yO|%z7TnbwNjRiVce3&7ulW3UbwUIhQ!S&Ufh#-0|kD79_F;D z;pCcLpPP%qjYdB{Kl^(=dvZJ^!NQk*Vjl?~pcDsaO`7j)1lq|Y|jAY0pY*NgD z#b5n-Jpb;Bf;n#W|3X65c&Le3vn(*&5^g=2-`XT}qTia@Q6ivpBa!5RWr#U^-a%;)D=%fvq~z4F zDx1L68y7%M(6Ch*zG(lpFQ@GYL4aXRcu>EscvVZ4y=Wbkyodb1>}UnTT8%F`L+&R%xpK?|(wuFw(%AxoTswb|l}0SD4p+kxIp z=oC!oXTFBw5A|8cq67glbP;Bx684g)XG3?w;|j|m!c}-siSXJ zwPbsm5WtyG<_(q_5Z|CNp=(Y*FZe*!WHmyZg5fXfL3Pwuc5p2e z^|>zG8vO^m;LJ-N1TGR+f9ke=)b~SZ8}~@}O7bM~p+|amwMXM_vh#S`0<9q^+VEb} z9>jS@t_GwN&^1v7H4i|yH4k3)b;*DU{|I>fLdvmnU$l*Q&D@2=Jr+*<`h=->3X#(j zSzGHBbW|4}BOv901ws(85XCYI06k0{Mp4nUA3^lFHXYDafwY@Guwd&jPUn#a$Z!3a zq=HaBUaC+M>BIM|mfLkNCe9F9ZI-Ffl6Q5mSa=MbI+&S>Xf)RDB?j~m-$4wZKrEKL znr413k#263n|IwAo;Z01O`yuXxK{$Q^S@Ws56m-Atd{8hr^j{qJE16XCXC%G%|aRh z!9BNnEZG#r(wsgJoP&97T!gh}-hO@bHRcE|!SWthKFPk_4e0>tLN6YpL$O*_gzFn?JOg65u??tTLIpTIT zBy{Jngn})HkPt|Kh!neXMyTCT9KfGaTI5$T8~&|mI?y$g8ez$ghbhtlK88&zs@`pZ z1~jf9bPiUyM21A&jexgblT&7?EV?l%tlSHfCWO;sX^L$7h4-vzLpWsJCos z-%Zpwu+g@1;b_>6yllz(Jco{$ARFo({GhYuoY<1%G=p0#vSg`-(}r=`B+mS&O;oOE zTlZ%7-jk5CN*R+%D11(po9Pa5C{spVh;;=EVpI8h{vn|2@Xb}4*FLN}^1C3volM}y zf0QR$2-1CxD0JPy)R?XPRF=ujO0L*Lyy1j;dHqA;9^`R?+wfWrq?V5@Put2?LG76o z5#B5ceKyfWG!Nq-Vh&N~W~f~QFqW_{^VB8YVmxRLhX=k{!J4}uao-9eJ0O|ke3nR4 zwtfL55(*Y3qZnlzL82!AOY^ZIwrhEmlVT37fb*^-Ptc6BCAAZQgfmS*?z@nRsEc3M zGhPXB(9uFEZ5&y`-Ebp}blo?(5?U)y;*GDW^g@BLo~f`+R1{$ts(qmFn+Nb$Y$ z1~w1{&S1EuJ7`tDg7n?d^^ed=-?b&7=fVh`eNaff0H!iUgh4@ZJSpApAj*OoQqM&v zh(*1WB8M~-=h@<_4IZNZFuagdNBDX1`l16-aifR%`@Emq5dUXdCXgc~Jr#}dkbY)+ zi=fZL4-$b`H13(FA_vj)pvgBp{1QaT1ZH7C^t%lC1o^%0>WB~GsL~Q{i~v|+e5F`2 zt@ed7%#z0TkUvE7b9~>0nbzHOS*!1ZLta83g?-&icu`R%&ff#TT#-R42rVFF?od8s zp}D6YmeE-m)tzyhCVAXb7h34ff$x$wosdpyJ{-N8&JRjOT_4be&m{!B+(hIK^z67f zS|xpOP^v%6Sp&rYVBL`=nFKCb+IgCm;LsT6j*U6D$E}s zVdfrfq`;bi%fS-;cVK};F{8j%z#n0rll`(kXW~#I+6|tNf2tn42EhA6@@i^W55pQk zO7ar*=*uS{$ig3JMdF;E((~$KIL=-CJQzl|mI?XB@MgDNiE8ZgR**I61G{onwt<_% z7^)?D+A36a2EBQ=0bjZb8~rf{v-G=945&RD63``4zmkso3cB_2;IgduJwX_ypo8oP zJXTZE%Q^78v9ux*EEek3F~xD;#c42T8gXyVd%l6W;Z4eS&l>XoY0{Ax_)JzqdgwUCm9p!ZiG7cegw!(1F;$q$cJlRMGtyZD0})!?@V zkI>p*ruGCKv4Nc!v8_WiYFxp6H*f+jKMr~?HiM9C-Ug~vx_Fu>z9h&3ITGwUXiId# zaRd`zeHYpUY05Nhu&};^F2o+cV~1S6VcL<)ZD;i?e4$i0(o^Tendw!^oOEYv zp}u8+&1bV^a?70}fz&Z|mRmy~UA?A^XlbQJD?no$8l-VUt;*qw+N-|GEi9;a!(4D6 zft52qD|Rhi6S#~xc7=X0M{-kQUu(Y=LyfIFo(D}6Rf!h3s@(GHonv=LEhBIi5YCiP z=yL+LnC&4#&N1T42s^J@-7d%1=LWDSOGcI7x+Jd76yBFmp@mTd`K%Q=`i! zKB&7#^1hqg8`CEf3-wJJ!k*wn$1vxPgX! zn^L&Az88Ks?_Tg88gIf~HEU4w4DH~JQ4mLLG>;|UJGA51U-lCCo1hB#r|W*}h%i1a z(ydL(`ld8)Z&;*(-?pVwo^RZ^sXS?ean^iFD|Qbg9K}K@KKzKD&yZW>9=gJN*!;+I z(sut=ob;{-TAl(t>O(gUiAviOH-cEMIhG14`RhRXwQ%yg%Gy|V!$nZY_2_>Bp=ubY zk`U^%3;7cVDd>0PHH|=56T(yEgFRUzXT_i6!xWtnuFKk&8n9XP#K31gc;)fYTOhIP zweka#ESnyVwG+7)5MFTPh9X~z2ymxBx%GE@aIEKm9Qswaj>1+@MA#*)ry>aqN6?|t zK^Jh28|)yNHx9jsITog2%j1a!Ydpw@uSunslhX5l9>9*;5LB5>6FD6!3eQj9qwL|> z3doq`u3J!U3(Nzfzf^y{bJ=`-LX_XIP8Pg&Jx#=C{18v(F^|wPmU>LQg6@uKclolB z=8fJWR&jaqeYQvv-jHwh=!t1AoRD}~?Emr6<%%`<=|O+loWS0L*#=8(?)Rrd$&ye% zyl_F1ZW{r@`}v1GsOqXTmw4#)?EMBkpOFE3f-qb{wQqPVU|C4dUc?-l&G=mipLjop zt?Wl=IbYjB>o?et^ev#ANl7t2pbeMNi)-W-Os!mNP4uOz3~~uu>#FIu^NZsxdbk>0Z4eAYd*Tjg=`+3e5)cKjcL~B&_TNNu7c&)oR6;n ze)Sq_yZr9jl386_v4P(@c}**ufM0zlga2w!xWZk**}MUb}v_8 z+PW^)^GNb7%02Rf=Z{RHi;-vOINogsG~5UDBky9)TE zKE2IJF%A4{CQ)d8a!9sw^AtUe=Mf*su`qC)0;qECMi2Xe$V2&ydSkvDOYFG*IUNQQ=aEP)GW)QhBVxUtEr_0 z+PpWQcnSCoAjDzqj!fAQd5eqClfX{z4Ff}CDGjueSaCwN1iz_#6VUpzHwx4Cs)vLx z*KHms>(889o!@U>h1xa6&9n#k6335Tq?G z{ZOHsy?qKY4Rl4MdzH3zeQ4$uSf>guMB zJ2E=y^Z3C#5KHJv3m*4rRew(t9^|fr&sF4lz(E}DgLk5T*trA^3J{c={Af+Yk&v91 zlha71ZA7t7rzHiCA6u{jw_fQwfwUGsMc5ynxNi83Z`Y%2XcH(t+4R7P=b;J&(RyDR z^_~WSdO!CPv+$9WW=V)?2QMYE>QNDu2PD0I8~IHmmPqaEK;l*Wojy=6f}h6&4)oI* z(kfr1fhM=%#T*rjdf<2riV430{&wJ^ zzcK5E-Ulu(Ujsf+F(1nfeLQXC^*_RG>QW2vLGhUlh>bIgAs}|N=8xZuP7xb$ z?>~S#qaIBnM-*-CeE|6~Ss@2ru=qcHAQa6w16j=yXEbQ<4f1aDrq1D{BD5cF6- zXQUMpRb2C2xL~@2`>N>JgWDIM1pNh2me3Cpv&E$hh>fGVuac~j8OPP)T$0QRWHcMl zXOIKkVMum0C6pPSfR!!N(JBK&Z#^-XXlXyB8ZZSE5jeJih%DITNB62yMo>mF4^Pmz zA-sLi{6l+xuXeo&X%4N4ck`H(dMRE(c$4O3ZbKSl22{A+U`=FX0`dwym&sphsNK=Q zhoxqLvEd;N=>faH!A0VbygeRm%}zYr9=&3{n$&b!$1|rL_UV$+Y?B&X*0v%iIdkyJ zt6o)(jH~_Q9M@NEbVFT(H*}Y7$RA>4H&~w_ooh5M7W42JC^WEJ#)-_SJ66 zODYFVThlxvzWCp59iFUeh8DcTAop_JY@d&B_-5GlujV_-#3tclh9Sd)QH%Zh(qORjda*Z z=si2yE)duaaM_DRBqQLJY6cZ`yv3d5JqcJnBQ8L;coxw!^(mnAgNu63h$83MQ;=>- zT+2oXzkJHZnr47;o=|c?{6b)5qPoZg0)Rv)>09FBg2DzK@{BO1cy1x>`UbB~D14>| z!hGhG-pYlq(CrTqboi|!PrXU{vI_}0fM-wJ=u4?PPRy9%I#ZIZ@VQ#x+Ts(~dDDAs z6D}lh^d4^j)r7NEa~cPU=$7;Nm~TW`nqVz+S=OHIppP^u&h;AmfX;>6!sqbs!NODx zM1uBdLJk+>{BAzI2HR(ed=3NMCNIYSe&Xe*hXQoy7*9tH^W5J9!3kh>cxA#f zBHt+wC@NruAqL}MFD6ZNx3Ifup*5kl(`d|fLB{$`INA?y_4xK*;|&B2(P1g`>JQ%Y zN$5B1+B+a|^AiUc)$R%AFq`6@d;K)Vzil>~g43V3TL#$!;89|Jf7kLe`~P3!1YZ`H zL>@5gZ_9i2bPS10JYD%I5nA*?)WgvPAH9HOzsS0N3md@XfrNb@oS=L9H~FvaW7Hjw zFWC@KTr69ziY@6W+Oh>T2}t<}(gb`42+~ENt{>mbHaYe4n%7)6Bff{hrG*V~ZXfd0 zPVXIO%mevq?k}ubaY`F2z@@X~mwAD7eL(}?l=|5N*EBhL-1E!8KK>AElL0s=0?LD; zuzt-M-(U^uv+9UG(0lNzI)nX$CCvxo7mGMdxPvp@4S6%aFYD>TY<82wO4qaL_w59l zIO*O;^o4~5R9A?D_@pI2^>rIRvM(it1J*R~EFQR!Xty!%iU${P96@eF*T?c7XdxmT z0ef_OW<%W_D0!u(C-xkE;Ko&r!L1HMK^mz4!;vA`7Srlz8~a-Td868gm{&#i<6;s2ejoo;bTARPmXl`P3(w=`^XfiN8=h9>n=`e+u4dBj4*msSRdan)Szr)G(uiat|A` zVYKTiZE3ieHGQjLl?4vfmq5K7+R@9xMI7iZy4Htk@wiNTJC@EGNBoR#Pn#ChDyX`I zyS;LBU!8ri7DtTAmCM}_wz%=3=^vXxIcB}A=0i~PPR_1qYOxx6lyzfDzx6|j*ox4E zyl7YT9|@yo{(Q}w_qgNun5MUMvmUr?N+*3wV_}8k)U2gt91v#xAn@XD&2LhcerT!zj{rBh3<`_@;KVrJ7oG8vu$9|Qi%JZrANk-e!wv%C zUk1M9L7*Cwv`^k0SP&Y}McYjatP4{D={-&Pex@I&R6;Z~gjO`B_w0T%&KpNM_fVHA zXUS#(kE@ry@Pg?mP%Cd~b`2(BKpVB}q3lVKq%w(KTS%iA^_t!@2!7fQjPjMD9m=&R zvDHD&t%JAX$%zq^-tJe}D^avGZU0i{tI}v?B7q^>lOdzBH)xKPrLM;tlxy5xIpAKB z!6SwHA%JC099T^1ythSul6pg(}E>Q=~8TYcp!N%Rd|KPst?+eh{&^rjro! zY7N@q&YyHCr#+HB<25-i1`>Y^1zGzT53STdpNMxlMik< z5M94{S@rfYMe*%T2RgG*ZinlVsS!a|rl5`O!$j^Z&#euZT|mR?N&N8pbYmCgj~LNq zsh)z8f_6&Nd?ab`%$7?+J`gc4pk7Qoq_tRAU}6Z#e9S?-Gs#9~tud?TqBSrghH)ow z$q9FZP!#>5aLfGrM9o`)z(alH9IMQtlWrkwqFX|y#5;#7vHx%XQ0Rxx@;3N5pKr<>Z(5^BC@(55#oX#B1>OLB}#q;mg~>2XFF&$bf&HJ)Wfp*>H*V z9T51Sm?iuET12@2(moQPsvz*3rO^G?@QooK$nvX5K7~5nQ^GPHi2b_~Okpdt<@`-S z{{$66+Wt^}ihy2XBupHsLC7+kdgMocU+V%f|B!ft;q_EQLH?l#dWi7@>qyO7+bV+{ z4J<_H%_OA$F~$SWO;-|ZLtBu~hK zTgCqPkZ6vSqd=GVpdw7{Stc-C;@5nd=D8H%+C?nC@HlSfgJjgB1EDmeIpDC$`Kh9JTB9#$`GBV&nY_XhL69hczxkC82wvlcN)j5Vb72^h@d}5_s$aa^sBDcht1Id<145`&1{n$`@?BvZYzG z>3HEEBM7^T{`P13e6L_W1LQ8ASCGGSCGoukH~v@Ft@-_rPCESNJL;&<$r%SZc_*db z@Dk2Lj@?aFr1?TPdtVziFvN#6IjPZ4rqB0`&|?uhrvocMSQR{)wxHk&N0JJzO|2Cf zh#F-JGfl?5bf$;l-A#6GT|<2D3Sg0Cbie=q#YcMFkCVppu+^5JjU1 zY32Cre?ZWK(Vp`VXrzLEEZ)J%iXkg7*A?___;6(*5_%($tAQ#VhW?LqAlshcRq%yA zo@Dzw?b$*`s2?FwY*Oh=r!>T`SyzzwU0_AuKoHH<`jK9g6Y#4XNO4HAKcMiZxqF_P zhju=suU+pWH6A?y3hu$fP-d4x81h$cjsfE-OoX76Z<3Lvy3;~RgSU62EMz?3R zyQzf+2TgJc=V`FU^sott%?L*cddE;;h`TC6*sUv*Sh_PUxLL@1hNP+MZ*s>W7h85JtjkTi{e=#`@jp-bd(D31wokLa}^boqEM6+NKGKzLxo!Zs07 z)Lci1Z{f{Tv+3?j<4;z%~cg z?_Z~WOzN%QsQlO4fw9co{(u^ue#Szdjk>1P^FI=QTVWP@M#yKdYt_<1uFy2wp)~%C!ce z-#Q$ZkC?UrE4RYB_5sp4sgVi&WB1l9-a*IXDW6K?;~ru##XeHYy+(kvJ__T`$231@ zPud5mH#Z#Vro!Lsl7mjJu3wA6n}q|1VJt}DxezFaTajI`gTIdn|CvEBzPTx%S~>01 z+DP|goXk&2U6l3b`WeupKP_95zpI1%n=}800j&a)2Eu&qE~zuWEl&eTl6Kh9vaas+ zcv@MUq)9;komebEX95h;`r9dLOa0I#|5ecy^X!!+q-n819Jisl5(>Q=|OL+i<>v?fp#YPqugmWykFbr9Z;g5VTFVZ3eC< z6fl}0p-l*)y)&w!f~p7reY4yCejj*z->Eo7Rq|XsE}ZYHbG` z*oTNOfR7SleW7NO6a4>xdZFHu5V!aR(Ph^LoJ&N6tw7w3HBq$Q?7U+2_7NLCv>qY5 zWNoCI70L%HAx~Xe2baWf$`CDjzaw1Ek2H62>SD)>1`3EH)C(w(gWVQ@qr30MC%ctb zjFCCf`6TdCYoO9$N6d7+Fd(Lay#!$tPk4-z>f~E)p!%|weRhyEgB_DRyXe&Nu}h`X zo!~K~qCsAOKn?6VOF<(6Y?g+QXhAxPJt?v~2`Jiz{Fu#S`5~|%ezfRk@7ty_atb;z z2baHqQb}V1_JG4*)KU6(zIgl&sJ{mIs9h1K0Z_&kWQ46e1pg+ zAYljB-zO+c)`LETa6tg{7jTUroSoNN1$(;y+DZnJ=ESg3eMh#vCnB*E139(H$VFcm zh$w*Lf>5NTLq~m)lFEZ;UvcuF36o@?-rt&o7z@xz8a$ACH#V+Dn|>7mt0)>Iu)>3^ zZU`VD*p#Wa(U)J)L1-L6#2%M>M}ru3vz9k!dNNM)&dg+_FAL?`nIuGpGooq@DWM3E z+oSGutFhV&N;RBFxPl+T0jn}~PUgFbT_+EK*B*{ge|w?YRY1f1n<)vL_jqGT-`US} zC4a)6m9@-3xP6L?Dh&_)) zg0{~mfG~Q>)@(Fsqgp2_lj$F7;xVJxO+Rt%796UJ6pko*pxY2L?eoMGhRZq-bUZcK z6IYHm;4AOQ|LXkT(YPK#g(=5i?|@isfy-3^Q$Z9no((;_a^9Bna6%OZCu_BnBv`lN z7-;h!#|8OFV=N-3gu4_%8SB{#Yb6M+ZbJnL-Ua4{A1F(`y1cEu!<>Z0Z{9dqh{L}6 zJku`Ct^HN^^N&cE(7V7NPT~9_mq;@hsUVTg zVjY=I8ODSruD^8tAZE?xy9Qt*`1UZMIhT!Ut0);}IYoUUkl zZR3m{?u-pM>_od42)K=vTkfYIu}UixQ!J3Nouuz@B7rKDl~gyT_HWQC24*0meFP;q zI(~L_N0o1-hkdY<|$t&RBmNRKUyE zlSL8q8}aIj-Hg@Lc|xqI)F0x*?<6QNX{`^xiO%t_y$brN@B+LDJXX#h)WMq6oN6UZD#*s%Hih~>E93mxtN{!@s>=#54{Oed70>!S{XHHIq(DbZl;FC3`YCdMe2f3G zf*6Ykypi+~tE932H+`DA>JLWSK~xWcDI!=D98Zg@ZM1@8UH9h74ockFX^<3*VM!kez=cK zUHGVePs3P>P{grR96^+HIdNk;lIJmfuwxOQ*B8Uf96p}9@ifmiA!~o3?$cbRG{!Qg z$S9X6w+i(s%E*4ES>h;t&@y1M#!iTQGx6lnT?D(0q>r3e#G_1}jjb6WBAawF$3gDl z(>ge`_b_0pf$5l3)wB`U#JPQKL6JVw7%=id`g;On15yVN{Q}KmnDvNb4)s?B0T@tB zsuVoEg>WCwxPk4uAr&2x;)AQi_@40@$P7U9C!y*eszF(LICQ7+5AX2|#0Ydlq8O?5 zLbXz7`8f)S&rK{)QFHD?5%D86`R|v8X^`6KcY8o;lL2OnY{Onbx7{!yDoC zhkNJK4(zCxB6w@jZkrq4-R><&r1camUBv6uHf6U@JpI^o&&Bv<(dV4H;)>-Ovf`}% zJr1+|nx&z!rt?|TZu`!`mq(qVsnc{XmNgjbXxQ)LRcw2;TJ`)Le%AH&mbVadrA~&M zx}Kf6q2gaohJ@2+WF;ZBdY>b@XyYbJPDMzxhADA< zki5SVAy&lSKxy;P69G@(n>tW1tb%lqvw^Se!vs_cdeA+TIT%gzofj}T30Xk$HS$3b zSq(dXhOK(MhK8M2))XGNB4RR?Cl^XjcT*_Rg$Rg_gctC;Cs?_@L; z5NdrWQKt7=7@^iLV$I?S^Q|(-G(+gK0)fHg_V-_ce;Lll+~x+P4q)S5)1p>1AHG2{ z*Jy>!`cT!Q^J*5;n)OB#1l#wF<5y7RIa%d)4A6+L!PYT^scz?R4I(z6%I%1G(f~Rl z*V=Syzg3PqomP_E+GA$VZ^bn9`=*Rb+A22!va*6D+25Pj!x;cHd>QbQj^ zHG4&3)%Uo%s_aP_fX4~l3)ZUcXi4ISWr+%5wF!KeHE@CqC~8i1G$98TSoTA#eJicM z?X#@zl=OrGN|O+8gSrBXJwiC>C~@%`T%*jbW{Yqz{a;Ox8e81ES3aQ699iHuLzF(iq_HOgP zaG}<$J`wHs&^VQu5NfD@Y0N?lUQY}PqME6ly*Lb zzjAEK#xab9sn-HHhd_KYWVc*QK}$kWqiwyZ@^EPAM9;L#)z44LV1i;`3 z(1XXJhe(xN|K$_VT0md=Lw90^{`uV6!_$EK-gf-kdg@cWjd|U?lh@l%DYc7E%jH2} zPEgsUu@9U{5!rPiOgpEdnmz%M4vcV-hsItv3x*G6i4hKnxM6!lU(-7!gLS2V|PCaF3LYy~#SLE&f6K5fnc%Lsl zh+0DEL6KlMT_Uw|h8y$3{NWFH?7ZXSP%@f`X-b_0E~^pyT*hZMZ} z;&Z(O9%&$HD##)E$~-)yBj5KZP4W`Jfv7f8C1dm!&ImNo^@l;NGY(kLRY3Vktp_3o zu%V_P>8xJo9H(N-&YXe}&El6i2Jj>)JR)0=y*%Eaf889hQLgS7;_QafpV&2_uV$MF z(9&qMc=%bOz%4&;lRGBII|(x^NA5%N^{j~(0Z~2zb+$iw5uTomj4{hNrKIbR(uElV ziLCc?SU~oIR?%V!CR|V{0q7a2!=Hv7389jB8xTHg^A6|UwGtpHg`l+<769UoqRIxd zl2U8MSK17bCAHKTEF2_tAwT`HORx)XBgbDmhs9PEF2-2wkXN8MPmVwc~1@#x1k)r{3i$bpe5$ zi+c3GQ|z*|z|w_*jAvf&Z)~yC&mY7gBt8@UmZQuFcDg{^x7#XWOc6g}^k2MNJE2&n z@NJY?ze|}MmWE+%q60gi!-$Uc*HB2FZ}$S?Um4-v2$U|h+Oi1KpJ3tJ8_2Nd#8zVF@C?xVt7yjxyvn__2t9E$6U3KP{DRjq0=KXZ|$Pa9Z4wXhIlw zrbo9sxc8^p6Pls>XMKb)Y7YsEveV9M^4I#!cl1bRFN2=R%?z(1EJi5_9*8 zE@44~cUNSYnb386iH)SOAnkhBv>sB^c^WGN(~qb@d!e-lcEmtW+Aob+3YEM}2iHVj zY{)LyUWu)HJaK#KO>tdP{Xx3&`zhmJtH~0dqC3i5(S?42&mswj#AN7sp0B>0b=N+dZ}0N+?dhcz@ zh%)7X^K2AP)Q2gUP;$|A2ci@RZ@CbjNcHi=f@Tg$dBdE0AZ<&L9b_=ctDM}K@vR3m z9EI)&x($9vJ^-MWthsjPH4QlA&}Z#EoSpT-G;aWIz7-kZEC|lustoQ4n$T&mT)>ZC z1ar;ieMA<2q3g#pkpA?Wzp}fBf96PVxpxlSZ-MG?%wq%VDg7Qt#edV6KiBd8#1DPKniwdbn zvEui?mVB}l?;>Rk0&j^6c;CtnF%r*e=rAS5u)v@c&~7=~fExEzx$5}@)ejPc^?*G~ zg=&6^#egoRv}@J+`8}B6?)G`_XmFyFp3XjEP4pUh;$W+F2t3xy=c*s>Ny#_nC{vCT zmsuF!GEm(RIa15b4uiP_7NtcR_YV?6E+w%9tkl9j$Jt^SosB@5k(+)&K zyMfUv5J>)vxGOyx@}3X=zda6LJ^q{L{5tXL$Bq8{hd(k8PR{uLk8T#kt?IkKS6&yYMy z%|v`A5mH{Lcw0lxzmn)??DgP4Se4~@jkDM1AUvaJRr0ikoXRzV>Ga0tLxl2#5736t zF&eMqR)s+ms`@`;9wV0m_vX7LhNJfCs zH2hW`Y3C@N!J$xEnjfP*d|EAmYV1w;qU9caO0oP2Fv%MT4WdJ6EQZL$rjUL_N4tU? z{m^hp>aJ73gNbvm1QD!>>JAzWIF&wKnwsJa9WGf*ZPqj_hhqW>sc_w347e%&M5?3D zlsU-IY_#0OlK3}=;tCh6Tn`8H9u!ee<+I@j7SKf@oGaU)7rc8+z=N$S)fueA<84#w zx}E<}#1$tY4w~qB!FoiPz4nX{A;PgbxX+|z-AxV5t=_vjVsfEH1|u&HXfeM~Z{5~j zj?xQf3#Y=IC_SKIBJf#w*LS`49o*ERNZcIA?|c66j9QqrWh8s@r@H0xB7(=Kb&0*b z`7(r_C|xq09!P%>!j5>2oh>sVuCv6JmD< z@C)G@AARZ4P@!c(}IS6ygp2%%9{|pPDE^rPgTMwnOlb>PPRAf{N49g(L)|yW{ zodc17YaC1+#&khH6V#3%Z$W4ZupYX}`qB+g)j^1w`b7GbR4iUu2(Y(jf1?^Mr4!dZ ze$c*izdYe)5-UmNO6%gJqZdFjru3#B5Xel>uCK=e6jE@%8Vl7YA-*ZdX~Ab?ymb)B zE??$rjAKpu)%`;F^Zk8)Z}ItY(f9Ju2??jI4SkM&x;W_Y)}#AT#DYGAD<~#%x1#VH z@xFuS<(Rk57;cf%iyV$r#r)T~`lx|=zg5_;a@pmRXueQ0u5k0P9f`#7*obFT3?hhN z>@*OOAyRY8d!um4k&zGg`t{ZPZu%4Se-1PNs?x^$WCANIB3n`ol0@I|Uuf!? zwGZ%vaZaiu!~62Q1LSchK|w5qSRmb|roq3|60iY#z5*f<0Q4+xMo^a@f%0;H=)}#AX5m zn09wT{pli)=)ZQz6$AEteISAToE0BJkPkjl^V?*z^nz(k$$tkG{DN1J>_|Z1l+rQ? zDHcdgUS!_{H~9SVx&6>vAs=Y*>*j}^gM5aF3Uw59;p37uxh|@&4cC(Bogy!;~NYc3g9NjdyO#e)XCBJaW4~Jr|5F5F$N_ z+?>A%9eL+4b}h6Rp2tDo^P7O!sUWp=d}6G`6W@GhOVSI#S<#(kpCo7MWxXHlC@I@o z6jXIVqeN7*TON-$pnb$CJ^}xqJLl0Mh#^}K5h!*M+3-R$5fPq^`uMA4%F(5XUN>t0 z6};4g_;~o&KO+8nT0!sz5Tam_MH#(-?fndO`cbPn{Oii@)N!jd%FG$buG3s@&iyEZ zU0w7{XFN+135(hAq^CIg_BcHJwfOl0SMtCh?8WN$pZLi0uk-wSugRO82pWjc>&|?K z)sQvZ`BoqVL=fgp6APD_wZn6&D5;2@`T~ik&9BlAEtPNH!(J3fiA@I4cJ%GS+3Pgp z`^YJh(O2ca<)4N%Q8nboGaz|wWXP3Zy@)BuCVb7Thv=>u29sayqZ=H?f+`{8{VWLl z(bnBmp}b|{dt8D-S0u#2!S(Ovq7A_l&`=1Np}xUbS>Pc5tqCW=t#SSY>oHx9q89HP z;jMt85uwsr#Dv9ID1VvbGvtJ{>#|a+J&cx!9gubRlxM9zbUmsKu}?vnFVZDfT@oNa zCfJ~9i3J*ujtC(>h=TYL>^kc}!IxqUw=WxV+Db%A5*$jl_slWOgE3mjt<_7Y4>PL* zx(Cvog}2o?_-xIOjfKT-XAhiETp`-CYs!~ zGr`oVC4^W#Oz^#h+%>UwL;0ldc?-nCP9h0$ZHuRZ9^RO{thpT%RTZ#ELge{(RFkBe zeNYA3cj6g!1!jwBcW#@Rt2H#_v0?S918-+VMcg28QBGS3QkPZZyRLLE{TG&ft&{JGEx=Z;Bq<@&+=z^jRw1~+i*n)~Nq8ecW zc|k9b>=ux0L+5QyQ%lHd%Afm68#%Ai&qmbm(KuQc6 z(q|bd@{HQxeOF%Ed%?XZ?MhYyX1--0ie@AtWIecM{rtzjEIP0i@svlpWtyLf9}`M3 zaS!b2aAB(1Mm}5O)*jOn5fS$UW0B+Ho_C)adM@$Oyq+7oibzLhuGoml;}|jdI(QT* zg$rm3j^RNM$PL6J5SKJXaxmftE**SfLD^&e6Fl7mxDBAd6uxB&}fP)3ETP(@U7q)0?W%+ZWto|+uFasY1@q`t*+%3rondDfHwSVf&iIs3ZR-m+1! zvPgOdD70{aQ*!oTVD`$`9&A2-Bscc=Mvg=M8jc$jq7U>z%?QxUJg~tszs*?hLX(io z*Ma0R$qukF8>Df-4^7&y?*S|>LvNOIbP94kp~@xo_}iS8#P3eUTE z*otUAKZfk_K}u7I53N%+L~3I@pw5buC<%L`!&*H&jh^VHpuBt44LWUwZc0;9>IQK| z140Xl7ancCHIXCVZdh3Tl05B!YX{SMkaYfm2&#i>Jfb4&jdMW{uio2MXwrU(X;RNC z(%IqU;a4j1skx1CqeeLhfw%Yn5BL4ri1LCWy8g6Iem!pHM0#m?VM~oNk@N=LcKlJ? z(DD+jg6;sv5FUD9iq^QkfILf*2&x>$pU)RCGH>9|Mph@FfA}C1kV|_itSc^3{4Kjr zlDv>A{@|jI%2Yl%ApJ$;exFtwpM^Y|dEyG7SNtUBv;5>g%T$@_b^2e3xDb4SrjiYQ zG6f$X$+^@MR?L$kMAb{os*mjo(7G4zw>(XQ;n&rAL`1MBA>rkNdE*AUy}~Dqgq6fM z_|}iP*!Vtrn`dktVNxBzkMPkiQ{M+D>bAt{CSZJ{!=HsI-G$N+6|{I|K;jOf;nGY~ zI$a?qf)*1;$@oxSj$lE4aBKoTXWay;wh;{oKVXe<1jH0zi(hM$@fhc$5E48gEmJYz z-0c{>tA1@@L4PwPmykHTF4RF~DR{j1Ap7I(SR-G)f?&}q0N0BUcR@UJo1@Q1sTLTM zOamG&S|8>_`#m41{*PyciXxTS4PeL~P?CfxPF~BhC0_7`t1GN$ufqNOA*0<71L=~F z{9%NEh{vr!9Il6t$7AqtA2`x%DO<-7I(2!U(jQv<>@%#-P0?9*JueR5t(Q@jDqEYN z>>V%ZpCwli(fkcMvCrLOCCA*k%?ydE!;+qfZ;_Jqv=2bAuli*4R)XOknhub1UO^5p zrpz46!$U~ax4Wk5XK4Sl7;vFp@Ws*#>2kh8{UG%~@{{OwZ;zS`62bU*$+p0=1$vhj zL92jN0j-dsPTqtXWZ?qJ!e42=Wn5b@9_EqDi7!ukYTfI z4Exle%np<`wUrOBJ639ihivMphei7Xx}S$KQzSP4uJGc%FL#Oj^;e!;_6Awvvu}|% z_!mkBm$<&bUQY{EJ_BG@i!bI>El@&*2|8l*4f>Z%OE0lE+v08NZs8%|R!zsy(XbWM z)k_0Mx*EIFPATbU^$l|nrPtS(>yNo_8~|HGKox44p%VG54-?IB+JF-Ib(L;HZ$KE1 zscr8*x(h@|vmxWLF!`#VN$Zt&r-`>8)IUey)E3b1Ffv|FRf*&Q$!?JYk?Fn!(Nepk z&FXs5{NJWeu?YL?b#$ld6j__5j^YWdN%QTIku?vyAa^}uLOb3;HcpLsGrR*AK5{iv zUrte^ni{#;A>M^xTe|k&EFl4@z$X+wq5Nv#e6;EsBFVe%*1b`0?EPD~tDmGHl>=xP zDo4Coe^E%OWDA;*d14@w@X&q>uxA3*uBewmnJgA6_2m7)xcVWYC7OjBML!w|Kt_k= z%Aj8GUebkpctFT5fxiMYAm-@jpJvn+v`x;;LW?Nf)K|XkUnsTNCdfj4P2>d0RKEP_ z+K1-UqhSeEt7P=!BMzSNLbfE^Pt`qH6?hGHCGiLwP848`54AW+|5(hzxdpn=5(rU>tTX8&)gd2%C~ z9?%~C+MU4rVW{?KKa5mtu=0#)Z|FuoS3F$6{wuzDVlBY%Ta$=lE%{5~$toGELYrPE za9r~QX9_Hg!g{(Gn<$9$CN|fwvm`bmjvRp}OL3AkOb$zKYEVlIR%`!d^p$^ipg{^f z|8YjfVjm4i@{DB-=qJnr`Bppyh#*ar17fZ?gKq>8Yq#ct@(&ac<(UBagpW}59W^8B z@(B3rsz@e5sVpcW!l>N|u=0vxBp`hvYhG&nWs}h={^*84@n}2{OnMezC4#w0R6&3a z4KEcC3`l3STBs-pG(isJQkHDSmgT?>3dK=1@QN0hj&_SP&{csVaH5CosQtx&2-Y5@ zXFq&(o+HA#a9|GFJR!TH5-zQz>$d`L`lIiA$QL?AxQ>J*AV6}!8&(CnL*$l%Ua_eE zZVYn7*=hDmyEW8@mb4U7Tm$u`Uao0A=H*-7uAhR^_qhp>TBkeDG;s_i8q69Rz$I&d zR@^I-fAfs3@bO zRrllBSb~YiX$UxzEv1Xqw7sCR65*#>G@-nK+?4S_SuA0v>OXrBLizC+F8ZFYq~JTD z#p+W-x3@BC7_rGhFmj>LS*S*@bn_C`FN1jt0pMlmtiM=GDFN^9VTd~n?1S$eZ857ho3oG#R?wf-G zoAznxH)y$~Bb^Uz6JkT`4&junA$%Fb+WYnH4rHCkFyrvz;ENL#a>Mkq? zmCgoYau>+}_9y9pIH8(^7SD-@PFx9&42$6oH=wJ&#($&p;-=)M;ocN_M=A+OJpMg| z0;ablwxFrcI1scJ+ol-yTQiz4ZF_|rQ1Jxj^1$k$LgWM|;&tK!s7r#1)|hYPhMz+% z*oCER4vAa-Wh=D&3tN<#47SNZAJ&og#a<}&@eW`=dY9$Qg>;_F)x?Iw)4WW0(M)vq z1`8We$nuOBsi2F))Kb5u@$P*l`HQeq;w=G+1xn5KFbU`{3i{@@cg-G3*$`ME)ZqL7 zX}yKh4ttlD5$%88rn_NH3XWeoKM<{m+q@5?lo{f&iZ$|vMD$?6HfCD6_j4)^t~9o1 zhZo>iO5*a4RioF`_d-Zq?_K?&LLLE!r|Ao_iZ=RVN%~{bdgwuINUgbo!@ zd&Hi)yBIZeltxCBN|wP{>yE-&pcN5s&j*#uqt`U0L{UO`8uWUgi4K1t$H$lZrT5Zy z@19=>bZfwNnaa%7q=i|Kp+cA%`8Tr9{^324sSL#)si$0Tl0y8)V!@^^407#|hVtsi1BR)|~Hq3XvN+ zX$5P&o*xd*I?It?1flANF{u@j$Xuw5UIDeD5&5KIW@fW z8e=WN3n+Sl{o=$geh3(dIFV{l5eW)KSXvyuLv4DYA&02UU(|VbEGMKX z`s><<&>KF_ zpyfbS>~Q6t8St&}%5?_Pj#G~f3q%xYy118y)~04*<}E^hYL`Sp+kLbex}z|oWdqO@ zoHMUPI@O`w1At1D#Kj>F?UEI2p~=ng znhC!Q+BpxU2H>oaZB+M*j1)d+HSLGZvb3OTy)>VxutbVDs&=!Y%mpXzPM+=Fez z9#B{`#dMs+5gS?EPET{>FbtMd`{-&hol`L5*MS6>)|)}JTp+VW#G!O=y|^xs+?{|Q z*`(?=Xcgm{TFF>o`Oqr_kN2yhr{C@upxYOl<= zb*Go$iwG=j-oXB1X7U_M&Ufe+?H@BBhL!`ms2(<*q?9d)>R0h`Ul{m6t~n~-=x&$BGz-x!ozFLxAM zbf9Q=h;60A`JDrya{p-SRKB&bXQP8Jy)@v2i5+hD9+D0qW=#D9iWN}7GN)Ozzb%?3 z{n+g~WZFIe)+ME+C$h6^cnyeC6vPL?YMYw{2og9tDf!)Rx;-%~h8lta`y`%s;x1=!r7Aijqyb++nG z!IVyN5}ExXMWdgyx(9Um^bF7+l){oH;6v5@EeJIWjDi@><89(Y}Rc0#Re z@bKtKLsXI8g(*DhP_hQ|4Ef`|38zQ(cLL7$MWpHlTllV@g>Cy6hr4`0QlTM=M!1+g zk>!VVr=y@ug2uWSY2k$#P*?Z|atj>LZwf*m zPYtTGE+TYXYIU}&aPpH_QET|?<>e^ym3Ag?=vp%u*@ zLR(Q8w0ceTK|-r>{M!*O<=kSz`35CD)`~3vJkzOza}lehr#i*pT>Kzw2GS z$882aw((9v+@t*v3t0{@C#O`~)i|fA(M@^3a`>Euh~VKP&c@NB`iggQc+5n-JuUUbv9SQ{y5Z z&N`EgDl7Lht;rH|YpLSEcSg6)nVHl53Mgo;Q7L=Es9fpgh&WNKy=}&q?fX4-Nvf7D zQEye}>K2|{Y=PTh3=CLO?AuPlM_vJ{atK>dPihOW`s@}FK?YTylrSVtR5T&zoEksCgh_6aH%5gX;rikTJ4jER2oV>!*W#`LHojJHY^LM zbCBx%+j=?eNeO#)^u0g(@>t9;X3HgrSWb)nIG%#`aw zpEx9$=h!i!!lKdL3svmbmxJ|FS?4cNAAw$u#?Vg>6hxt&USV3mJrBpEncb zWN)W8){9YneKB@96$b|pRs(hfR-6nSy&N-jWsJbqHo%;N1xhS=C{SNUr=O`-rzQdD z7Ni4oZal`?B%NpakQ<1aZMqYzFB-RlZGc^kQJ+>=m-*oHr@q*du` zT9e@*@dj|MNdq5F3?WG+0ksIqrk-?qThlWX3HHDpV|Jkh06#_GJEv5HDIsgUkA{X6 z^!NQ0UDhR2N0x!$fg2X8$EleB!}f*nQT{h(_=#An6$PF{1gJ7(A;4v@f_byplZ4p* z9^4}5W|*Ay0jxt6%cvSj=_|t78`<$O2Q7r@a$q~zop~vNR6xOS67NI2%f9g3gTV&A z%)pZ!(Xj>%hv7ek6kuQn)wTsfSDv7TXl==na^&4|5QW4o0CYf$zfSwyha@N=5R+en zJ?DkkC~fUo2D)?=V=@mdv9f}Ziu~$ZfYcn2-%kYj=EdG?q2q!cBmq`f6`;@W%5>tV zyr$|Mmn0rLvl+|RlnhF+VAn<6N53p&-hgN{bosncdO;V(vbrij6TC|am?%XyB>9;N z9|RSQD$o6=;|EST{ZcL0bQ%EexJT5L#2)gypxBcTT@kYj=U-sfG#2_8egedEjvN@| z0kpLFyBk0lqCx$oI;fWef^in;s-oa_5b4%-(4%Dy?u(;=iMzDw(C;3Al?P3HJs|rR z&|V{?%!H&aC-Ag~wEle%x7&Js1fG+C!|(ed@?npcWtx(0=KwJp#pKq_OyJVe!TP)17Yc!&`&`j5_If3xEN?xU!oIJ0vQ5VBqt@Q`Z1;ls~ zT>+RoEhwie!FA?#M>au0WS$fJv?6RsAItX;mCI9crrRX)(nMB(^1YSNWxc>3AmXo! zOlnt5`{y9=nuBUQL8NQCcuANn5Gr#)$tAAgMl=~{)(cXF=tMIl{Q>mUgPRRjG0k%_ zx;!ugF;S;!Lh7_y?uG`#9Olj{45qruxo~Hv!p@S1)*W`B zUk`&{N;e~`3@ud4Gg4|yOYmA3AmQqEeS9x@3U%N2;tXi%yFkJwWpX?sQoL9rOP2g) zLif#@sAlxhtRPeJ1-(fMw!Crm3q2N;-e~M-CMBqCMq_tyD+e}_y(~0+xwjRSu&x$o zW2(oIc?QvOMtxPkxy2AbH;D7HC4ya4DGG5>z+iApP5_Y6$j#0LYmGX1vREUG)uX1r zdvo5|TzFibdpmrlX5FUs+Lg8K*M91PlD!77HEORqIZ)scc4i5|krR{B1A9@tSi@6S zELHChij_*fsm6kddSd%9rBwvNmcO#C z1@NKn^?uk;cwMxtD*Om_2Fg4(o%^NT1*8v|&Jr(>rxZRA`LXi5oohp4%rbj^35;(M zcRe6neGokE9-vd)?}kOcm5t$D1{>T^{*OoRntG9OFB}>{Lis*IlaRN6rgUb_N zg$B`%@9cwd^h{iSwRC1y7!vzWtyw6|LJet}6*6Bw#lSTxC%PC_nL=7zyt*b?ypWJ) zg~q(-V(&`aQQP0MsSbcEBzuB~VfKZGrn`Tyw=U5rVQ2|Mk<|ph8q9c;7%8`}pDub> zM#RQ&S_@o%6tjIh@#Qiy_(0}h#XiJHdvfNur6F3!E=W#R*T2@$nol#QOe$WfU6+?vDa$5BH&)<}J{OCR=*l#YO*QobHo@_cU{n|k?2PdG5Z-6_~N`(26Sv)+0ual2f zsnni=c5TRYId21gF`=%0XvbkLvaNQ|R*79NZOyppOHSsfQ+pohJa%aY6<~)yo<9^? zxdmX2T>YSe;tsTMW}#(QYtDKc5%)NVR`y4uo+EY86L2Zr?C^&8(-X{xU$eEkd#w0IXH*z4*6CFd^^+?~gEY%jsg}Njebr zFd>x;TqM-+O+$L~A0ASMFh0JBETO>*)BV%G!g?kYKI?9oqC~#fMf$VmI@ExLWT8b2 zLpO>YX;2x%0!Y~gRgBT7EcKY|tb^}$B%R%p9p56z%l4Ykfqi92OoMO_TQ_BaNHGHu z$j_$)?1-|1xRpIOkZkh|-%X%skqE?)MW z!)zMbSJa!S7~%&YC{97?{=KQ`M~-hss;femLg$jzJgoMPb<>8&L56k)^R>m8n*LS8 z%F4f`2IL-P+?Z6T@=!!*hZDr6F2HQFB4MOShbVabT>kwQ&z|bxzxJ8N-ZR8M-8$Zi z&O*rX0YkK*$nqk7Q$i&BOv;Oor9z4bf7bO;$D`mk{{IYn-TaoBf=oz3nIkDLLe#Z} zOROXRa5Hzm){m$O9Rqc@_2v4CoBZhAq4p)UDQGGqvDt*&92kzD?t68XO;D1Ah(CcT zb{z0aE>&b6OWJEezeZ0$z^=qgOhM}SB!>gl2R&~^M~u)Qh=hl7;KJ}D7y!*}>IzpS z>$SFuIr>b(p`gOt3768T%#xO%)+OlwG>(A&cM*Dc`k|K5g#+i|P>+(1Bz4M{5nAT* z^!XgM-m{iM2nZm@*+;=+L;GfbcX)Gxgd!vLrSkYHGotrzr%kWhvT za9=Z!Oqt3#efe}nLhy2>2Q*-=B;(+?-mD4zGjgmtW(>*P`n!? zdPzh38cRQtP?>KSR9TNjbaL;n$FuNz@4Ld%2~hz|L6|anZnFQ__6UxvXe;!e=#zc{ z7%S7x+)@RE8Z?UA>^wIyrVJ@&@Z=facHtod?!J&UC`DUR>C?rLrxGfG5L5;=p%7s{ z0snChRNX1&aDoyLdlt#)CKVB@ocoC?gUA8Z7w8Df2dF`yPXW5$4Y|dsu}dLgxSR_? zB@QN~%D%Qt_s{Q|Ce|@Ey{6j7k38>j9kDK{aLO62t>O3X;7)`^2A8#j4qfzWln7H1 zVh%e^qyvoPIC&OvcdKmb7|NYc!n=M) z3RkBqARh3{StxR&Q{bw))4~Y>x0(;f_WogF3RfBo;#9-B7{Y>~;eb+u!R;>Ab>9o( z_}NA3@@nsg*GAiFLWkaon>9*<*4S9CpS;s~b*)c{;K z67L~qN8)-{;(t8?k{0I`dM#u_Ymq;&I)01Xt4#~{!^{nf?jPZF^-WhzB)g)%d+) zaR$>%-lBhr+T8reFPo5QPh@ID7=KpyuBF0qDDWpC?6*^9ZiCI~!)#de_@NFUCnq`I ztJXw`VT7_><_*Ii9v#1EBouz537!+qSSKfs9)(mly&1_i0}k&^37=Qpeuv%9# z$0GuALYyf??uScSP~M#NR{2R3?9uZwtzN)+0$Lj@-=>z5c_M|8b#K9QOlv;GTRmE__B6(7P2s+=B8# z9zog5D9bGTeFEpeaRp*~KUl^C7|gQt53svOd~1N>t78faH4FuWamuHCo7bdyDp`RA zRa?>qM;E-d7|YoQDA#1u;usTFTyn^e*pznp|EB<-tufvh*0^+;us2AsmKiWz&cqsB zmiP19faaTeoM{Es2%*IC4QMS>V{zu)$6XK?*>zy@oVdg1BliAbfgss{L$f;1wfpmG~{ zx*S^;KJEB0>u4|g!IGAG2t0r}lz1TCf|R(DL(|a)YN#6^HC{Bd4<90fwRlcTQae#D zHeTmN1_mJFh5HaCM)@&&&kdsVh73K#cqIj0LHPdkJ(Ik{BC4Dc(;#!|h`t{QT0!E1 zVX*trxlKusQv14H!lPQeVEDg|Dhx<7u-Cnyl*DRhrwtQ0H7|?aEV*)%WaCP;Wd_>> zgi`r~eHVSe_Xn47+O;9;;F$jqO%-d#2`4XJXf=|3{(IIEt@DtjwZx9xG`vP)oVbxB z{X;K+Nm~$cC*fkY8g_B6UWLBL;0aDArBNiY3(&8&w5m4^5wx_(I2Rh z%G&juyIOgvaU;Kt14z<>RG^KBD@l?(R`54|;6~r|x`l*mw~VScOCZx2#%e*F9V|!# z1Cs2VWX3nG`~0bB)`mox=WGLX@RJaL3lhtimni5bCOy@V>~s~&Nk9SMDNy4ejDj}n z%xd3vP*4d!Xq~#6!k!S7*(c*oGpi?IYruwYs4)9+7oNl=0NOiKMVZ!#JJ~m&<{5#c zR2HNc&_F!=Hs)74az#>J(i%)PeuLf(-JKEelrYVqq*b_&@B}1b3vMK1F0qWRjOX22 zKHPbh}n%8ovl0RAO& zg6W?uDD=YeVdMAKhW1RB&GO!koleD#P{xt<4~Q5vU1YOxhqc(G*Ip;h;$D;@sDvGEyli+IXWBz_?EkX&tjK9N4=7pFR1Nn2 zZcR)6rdzd1e%1YLuO*f#oWuGUbNhxI8dLXR5@_z3S#S43q?m$|M|{b$3C4or&TqVe z{2+Irl=Ryxf$<04=o?_=B0`7dBpGGi*`*IuFWB)69dc^%f?e5zniMaW2td-7=ij80 z?bF@`c>}=09RE08s^|Cc1l%XubEWFSk&!0+4P835CJeXf@cO{zG1aN3R{gWMp$`XN zivg})L_2%OZ291Zk&}rC_5J>>JZuhJC{jZQy&_RojtmPsw3s5%YrM;WB|0M<)bGUw zM?KS_ZpureQ`^wxwv%`4nUFA<_KRG6&PQrZWkCG10e{~_oa{}5O~SNbd}zM)yKPw% zm+n;?o`V!pzvU%o%XFJTMQXX`dwXcE;mhg`sXHz$dpYA2yAB*h3GT8hJ4sIbxY2J~ z4A+rIwf8rRO|r(ioC0|syI^&xm?g@ZV+u$&1=|SqMEWAn9a)+boa(U#G#M|};(gzX zIlCeW%-}O!kQ$60o`XET&^~$cC8G6o7c&@y9~zv3E<|-uYC*@nt*FmL0)7zg4Wv1&n9#k#QGGlo!qCZdGH$8O z3xy~{tuJgdxEJ6s;5|r?qe`X}gleJlp4vR5i^&P|F(Hb&NJH!=l@RTJa&xS>saBt6 z?~SSIux1&EY|A|=`3nU{tYyFXzhD)S`~mLC*TPhN3l%3!5@$f_DzP$tWAL1k9^(RH zy^iwp&+mxpt0|Lu%krb%hAHSVqWqtMZ3dp{Vuo)tfM>RTg9}xF$d!8gJ6TChaapA` zU3vZ>lSUX&RCWZiBAf{C^#;QGejB#Vlkol=!1*Z1(>Kzl{hyMj(Mz9H-;GQ1rhEZY zm>aB6R~$G+x7aZuS9k+%KtjW@yyV(9YH+jBy1zV#0=P zFgt-2r_O)UEG)iwO?p=BMMshb<`s}94_d%uNTsGg%Ti=sO<&>#q&I16I9Ch{4BjAY zO527iA4k=cB9Wg3om6b08~bQ2>w9PN?h|HEfj*U!rv7W4LapVKn~#LU^Y8d!d=2|vmy*G4yF%hayr$Ep4 zuz|@wQ+&qPGA-??7$_q&M*%;8Fv4joc0zVm8x5sH)>#NWg0EDe)w<- z1t&0XRreysYu=r&q)NPYVyc3gRn>>4TO+x<-Zh_WZcHAxpg^IQ(itPV^?GWtsSZCnfuQefetP6Rv-& zg!Fc@NM-v!@9S2UKJ6aW&hyQG6sMuq$VN2^X-_%_wsX7sQE-uA@P`eacu1gTS|*D; z*@Npr4*KV-ZR0#=X+G;@;9=HMr6W8wGtwz*U`qP)<%5oSlOH2|ACuZ#9KVB@>%&VDKPG zdHi2Yv=Hz&An8|Zij=B{2ZpdA=>~q$Y4R}Kl{}i#T_!bBk^<-vI#VrMvL!ljvl_I> ztte+Dwjz)9C?#={_s2LuK4q2+PA)84YBtun5Zg1cUTSFOx`|Q((lg zJLarvO$6_pRzRIL<0{aBAO#3p!5RQ4fCpqYAS4lr7<3jU2o$seZKE*(j+G?hqzPE5 z0)&ehFM#<+N$&{_p`^qy4I#ju$Vf@>`a(fyIna_&1P#$^7GP^eKv)9OT(Sk#oS??p zz%&a@nq+q;${1I!V~#H&Ib{y6grvTiz3J3Gad!Uknwk?t?sJktU`j|&$d(e?X%FVK zxTUED%AKypX`GJxcRd5*Ui%|m^bhg|GzBjRN%1=T4gIc8IM0ZQ1H7rUNH#&&H1Mr$ zWO+m5erbKg8RABb?+yzG;v7C3P?FvU5*rZkxDZubnA5irJ@A?H+pmry!ccJQrs4R5>C5v<4JiLobQYKM*93HhsgW4E(LzeQ^oK~`} z?SjBMbJ6yhU#$E`cj*X|LJL@Rmh-myz=-m9BVP%6^gN=|uA*=ndTFO=7oEi+Jgfsd zepQhK6uYu3{ytI?|vYr$^s6>ZrqIt>FFL8R%wD`Ce(ySkSh6JLmI$sWW za1R9WXngo@)Y|&L2QI;D$IAvG+Mi8G^BMSg$hKdPn$k=2O zskN}4#d13OcA@Xg_)2`!Y>{B+TBV9K;%^}{k1)=LZ4~O>NaW^qk zO=d2jRGft|s+^?ekY4tLNvW^y++x}TC{vz>lpxyvo&b~04hz?Bp8KXD^)@;Bzc?g^ z)^Piw?^dcFzS!VmPHRM&cGAb^EXnD`4(mI8nGpRg$|3HT8DAWuH#?#!i|xw*S_(dw zkJK&+?1YMZjl0>yr{|BS&?YCbzwCuzP=?xz2tg#fCsV>1v<4YoYOA(qIaI1?n^G8y zU4>O5Z)rs7$O}mx1|SxM7i)$Ylfc*zdjqwQ8w@pkqpAC!*Tw?v&ORl5NC?M4B$2=c zi_%37=PEYs=POGb^P$x^zW&tO7n`g0B7OxdFD4}RLt1?mw_H^bsk9l;V5g?vtnHiI zagBgCZ^)G5Nijn8E)*o33}B!#p}<18T04YPG!GjEt27B>qz!$uXVxp4PCbm%59G_! z>1~1K^*N)KT6FZOE1D)Y5!XbzxbD|gb+ycJtc9?GSXeVzvIid--O6;@`?o(-UQ*us#L7mSQOru7(iw}>XQL%s)IM2$ei6vLNp*@HIsAYLDvxiOOG-d7&wQ7 z7M)5|9}*!!sTq(_5bJDU%+(d%0*o8q#)iBYKVrPZ78f*HiCxcH{=dUZ?!P6GSuL8+ z(P>6)vPONK8Yz`pg}3&W(Qh=gA}P zz28sGIejs(QM}8SZH`C?>?;Fw5_tLLjNSXb!OzCg6GkJ9Er!$-)*L7)|1dCA@)8k% zdxe2M4F=K^Seg$VF(MwslF*evS1^Rolj#ULJftPP-Y;7WLl>pQV;`;8r3^t!S#0y% zaE}_0-lHbDTH;A#qM!+b(rJgjQ$?-vMKFvQ8+zNA!eo$%AY>UQ_B#Mgra|x&QKu6y zB90E;x9$&aK`*Fx7M$=4;ShfIP;G8<0I_I5p%b#I%ZT}gI^tr$#X zL{SJzPD#72x+}7}AT%%|2a)8bjl|r?g=J{BGS3h|kA9jJ+*~++FONPVskba7&vy9j3DjYh$~m~lD?F9{cf8O`_8O*Av9mveSi%!yre zk%};j7_C~wiRVGU@(2+MA?Zx;?1d2*H|E_R31{=2WKbIbB*YdVgbxn?r9U&TK4W|= z@sKY(ZY(m1EG(izUI*c0?Vf~A6w@a~PMUGbpxEkU3}Lcj_>h6QpFLHbbT@_ZNDw`D zMpp}7(#jQur6B3%?dnmG?P9VvLk(Hekggpk-u*{=!W} zh!TXv1^xKTmT9*`5CIC?vbC{l)U|h#o_}#7rFi#mUSyVl66j*Qj+g-=P!JuRHT7e2 z^RV8E2+i6=NON@U5D3M&aceDffP798?>pgE`cjevHM@yh>bJelRc*#Z6^|G z#5oOWrNt77qDE7Oq@`Y75pNfOvt_Uwg_|PGDZdaze=J{AfGVJiNLvU6sCQ{9y7M0C zf^l8pyf<$S_r4>J3rnOmt(RPIhLfHo%8?WjB+E@$Q;F9C%u^lu#+cB;H1v~-2mFYY zmtqiv!9nFRGdR|1j+i36dNonzXaKM#Yh;JN&GIBc}MTj>zp|U%m2Z zgesBQie}S0Lsq)6g`!qrwJ7XvUWDYq*jC4BX?ARbcaRVa!|5i#rQud9B5X*_hM!4XDW(r%b6RPERQFvlb`M%aPWsf_@r<_F8>{gsLMCOm*_0-@;1? zT@2W^`e0x))S%NqTOgs#_=P}0S|a{gkTfuYuw7W&jdEa?ht3e%V;dl&f+?4_Ciy`> z{gtZpJO3>B<;M=nd(i^M1f+(2MTWbgT{P@2SgCTck!$lp(tJ*A)d)geHHT|L3yaA( zPd;2Qb4@k`DKGoT3!w-Hg6^C75S6IPhwYz|KH)!(q$k#Vk;5Z|Z6OvGK$KO@WeTI8 zekCw*%(WsECkIhJt&Js5adzQc$PkEGBH%)_U8>UfuPiH`zOhBzYTrZik8g&GbL3=) zuTB=${RBph9*X7Q!OVn%w3VOUb0uo~e7gKbfal$qqih$8NW&`s8jBow%7L0q4; z1y0c&KhOpL^)#v%e)wF#b=vOQnb92p9d#KK2!y;WN=qbd3Jq0od=Toti z==D#;8}-WC4n+v516I5p^!Iw?zbP5eHhS>hVMLVi|D8*~akHC{Fj{f9rjTB!LD?3f zsq5Vb3W?n=%O?+kVD4|q$a%PjZ_|i3D(sRPBETEP{@2L~86fscI?#K~HM^1 zb>*IHWO~p|)C}ei2wX5vH!F~$80_wEDLTo9O&7*7g9${Kh@lDkLyMF=aiNuT@TVFT znmq*Yv@YhdV=j&aGGjtyk>lcljZ4+SRo>9=eLGCX0pn2hfuDe%4Fa$i%DP_dzpNs>lr~Ph1+*8eoK^(=eJ7e7 z7e1Q6X3LX+87ZOr%6cBiU^^NB{FD`I-|ctA#rL-%3Ts#(i?*KVcM5d0*$&I=_%H8$ zi2p~t%;-=>UuZJ6xdo3_gRl|SK_#%w3JW2w-#S++J>zXj0`bIuMqfbGQN%!_{}kbT z$}`vlc*5IPb>3Rmq*7eNB5GMlf~vqsLL<(pxF17%TPzF71xgY9eyL>NC7(n$;)cW^} zFW}7WEnFyLxMAv<7e-`o9Dh;!{}f7xw=Rb~y0xfx#gMt0c{iBWBdk`DHNdqRi9+$Gb8O;*3jran2D3XsCSd9(bs=D1kVULpumxbp&sY(UH+ zxV>8;i@d{B*oiXbDJNvGtu%ohOUr}ruB0-?Ys?TpjWvG|&QFViPap+91w8;I( zkAdX`-#SA=8_09~0rc@bJ#ynEz~qRWnkYhotw>|$dj{Nn(CtBbA?ghQ+=j3Zzl1h_ zE~X|{oWg~CWZ|9*cIkd-A`sl_?czab<*-^((JM-%Ac5e6w(j-t0&;3MqbW5VLP9to zoxg=%nMPt5zNBqSLtzOtP_TKc5tT6ONw{+>{{KBujPCG5drB7s28b7pK`A|pMKR+- zeb!pw(FX+U&*n54ukS$=w&K%AS`D&szk@-xF<^}aFXLKm^K~QL{W=6OtTR}fRwlrRC9#H-Ps2hB>m%#pzpZnwv-thr1!U(8D z0wGK&9IeDX|DnW^g!k(?5d7MlHjxC)Xw_mqd~hepB-G;arzAbFiD&TP-AAC!3&@4Q4g?^89%Yn> z2veO4DrAJHnMn_ca2$z%!G;lFLICCWsFJvTLRP;|Uh;9y^iI5dHIS%W;iQ?cSX#vQ zaa_w3(FDL%yiwaX_8S}bBZd?-gL(wur@Z`cr9#rl9$_gcE62$U&d*Src)=s>_} z&D1@CQXhvvA*GEDobRP=QxKFdO8UH|g0(|>{hAc}&WHKN{i!HU9n`3d;V5mCSs%H) zQ0&v^DDotEy5~w}Qk~5X zqwqRN>p+F=Jt=xDLHYXm!;uM^rAR{d{S%Tt!db}_qh|n?<>^~DO>_}kW z^4rTMJjla~VD6RFQoD!>gDykJ`p)Yn7o`=(uE-p~~6n!l5K-8Vq#%Hiz7%-L!DcR5A zLW+U#73@iPoXN?m4UBoGA%bOOje91QK3(L1>=QpnPPV2o7Y>PP|7G&RqUxo+Pqf&g>)VpqXR9G9_lR&V8>OWJa9Xpe-}JZCkKKD z<_9(&8BjvAt@8-2Ep06f8fYp*c?sHLk^q#5Eg_reg{ImqHZiu_6Nnsjz;!VPEAnz~nFpOK*B@Oj)oF}r@fmWHc?Zi# z8bDoA7gAK{uN_4ueG#HAN_w-hgZ<5DOxh?n7HNXd0nJ7^U9bgod+!9*f69I#`eFp3 zScPG058PM4h)6;NJs~N(cihBSL;ZwX(heicISSD7LnqPoV%6*s9n(Za2VfftPwXlL zy9i)~5FR+j1&N3xkdBUzw?;J&R z{vqO>m|K;aBdhz-*T8?1N)+rhrkj?rL%?H{f2;)5PZ3Wsz`;R9A%KFZ)+dHT8YTUI zIQI~O-^CZ|=!iCKCjSU}UiU9uZp0~4zc!V05TQyAza=iC~AO~ zjz=6`k7v8xUp`H#te=Ld%TVhJS@O$%Lx33Xho+2Noc` z;g%Y3$EVMg+gklV(VEEOoFoR&l%k+Y5eo63VS3sKnC%x=YLrryG$5rqGZ~yjnO`<6 z4Jc72t2dt?A)jn(Eun(FMpzYwc z)hAT5?)uFh6VEGO+|^DK&;aj32wwQaOWqi--!!fPh9)Df^rnH7$5kmp)*Y2Uy!q zL!uB}LAwuyx)9J^@Jh~j?NZ-q9Ag|%czAXv`&7abEZ&=i1D_7JW{wxAVKMN z3TQH0^n)VziDt>67sT=zK?ZDlJ!u+1&+&z@Be2-w;F?{_3&zhR|` z^bLv%_^~t>(i?1QiwC@hJC1eW<$=zUir1vV9~~f zq$UpZIFr>4I0x=Q_=P9;twry3YCo1!g=GBWNeoC+`ja?2_w<5_3P4i0&}ZFc5WU?Aeik`03xs9L7Ynrm z>3}V)ft*Vz=n74GF;Mfwx!wIU(7}}`!M1lGruk?hwLX|oOhz`}jiRq>C@k!ub+xz+LK!@C2At$D=Y*=a zp!;0+H6d7R_pJt^th0c2LSaU3iLu@cu=R)`oQ4E1@Fj&Al8VS}A)j4g`Uka@o2t(2 z9w;1=c8kL#Z+i7dxyI|wEa+g{AoM?B2Y{V)RP8_*@S+VVzOL%GBoKX57&XJXOWb=`-@*F|4 zRm|i-LCpzWrP!L$N(nO8;%5lZ(40mD(m)%~9<&Uc9o`AL9(_=^(mOdnEoV(b;RsrM z#j~XkeCa(e^*x|Uh+9KyWe$^A%#}kD8<>#Y)4@T}dssp{t0gt#KT5*UkdC|HzD1j#5zAEs=)xVbWW_$1Vd>F z3!EGmwlJ#BGE+IsV@TKhqC@u0@|kB}okn-WYk=|i8=y$1_?Pb05wK6BFd@;u&%{{Y zvIR-mAhi4s*!sycSgE^`6lecTFVNRYVmK&%7Eu4N6)U0D*)4sr%kD`uBr3Xs;gkk| z%L+dt2EYcS57XD@EyOtZdl#>Zs&D3?G+4j}%mhJ*iA0d(qKs&NOkeHAv*=1<+82Ui zc&nAl$*n9wl&(a9`EUtoELjrOnZ?3}2p3uuOobakvqF+)0>N(2I~*bS*$915b3tZ9FH0v^Lw1Tt>83KLr&)yK!s8?Cz&+_Cn4}KEgVF0tBC!L1ZXsgMWk14 z3#@$r=X>oAH4!`2>TgqZJwmA_MCwI^|k`ftorBV9h+>cb@||GOzWQ zYEVLV#!$r8wJIr&D}!rU7#YR6xWH-8xlPE;J6ta*;5P$+8 zM7xSIlPNMqBcUAx&{+m5rYVTD06oYmo~dhRM6wiLIXJA0WP|( zYyzUyRRz*@qZy#8!&x+CnhB;7Xvn(e!tz{i#?_PzS#nBgis#hwA2bfhs|^KIUv6wC zI!h?3ZAVG|Q74#|wZs}F6KFd>u!}ob0itI`7}8@Xt#iDuOK_g$#?N0}8$9ONY3ajq z()FJmMdjj|Z`)c#B;!E)?$mkV7K=H;230)|Ou4BriV^L3Swb(i`iR-&K*0m!xPAWs zH>WuF5=UwkYy&KKUl2_V;i&ET`1&*o|jaNofl4=P;#AHHbw-DjdgN6F`28;}AN`0+28XGbeQLKFigNYx_!trT~4mp$*UK6HcpP3O!_5 zueG;F?`EOk)Pi=`%K1)7QEX-jk=443L!^oQMt3~V8w^ix)j3&nL`em$y0X(o%)=G_C50; zkq3ks=NE9{)UIqye4+X03oye79k|&t=RxNrI`}k$)JuUJlrQF; zP+#<;2a@gI*L;-pPobK0+nTjs)ha0kSpB424{c~n`Qn_IL$u&SOEs16lg|QMLzRgq zBnzSjo}HHG(Y*`$e%A+x_(r-NR0$~Ohkpus(SD{Y>0@6 zh=_=Yi9T*cc$B2({9SzTg}$v3xANZx)HywuyXLzQZdwrA%J@OqbIxdDYV5j@H|+&_ zO^Y%r>bIN=T&8FXKHx!>4c)-}xQ4VQKC+YCp`yYV<>x2C2=&R>aETYBh=4i3thsu^ zRAW>&m7RC9x};Q}<8V^OG^B;w_T{hSH7DFn>zBmzH3kqW9X=4eXy$f8y4ui&I$81J zAPbUE(uU$YwouEHiV}dabR~vgwJop5#KU@UY zQBH7y1JNkQcK(idCS)BKjOZb@9FTBInB#*OBgqi{UDzQC1`ue`aInJZ0*33jgC#&3 z1d`OgQPEhtQAlW4L%C6kgvkowFwBUKfI2Dws+EhD2)+&O`$Z^$QrhB-hl{1sxP%Mo zWOghI5Ro`dFeK+o2B6I1==ot5?R&8oc5bwW9Hz~TBCNephjLP z2vsUsxPzz=4>;=^7#_SBwYvZ#>VJm;eg?hCx6qEv5tn-?;?f9^B9SR&A>fKYo&K$k zCF{!vn>jktLO)|Jz0fh>BRUd51JsMt4rbio$}$yriRiPNyc^e+dWy~(s#khy$fBbF z5++|u+=taYdquS-#*tw=z-bV(!C*o5;#~JuK;RUN=XUCZ)#1kwR<4KX_N-E{A^vFDgcIaX-Fmh;9c@j!?UD2#A6Y9Mv1A>1A-10!o>P zf&p`z+uXNatA*%2`;ufXh9^}b^V1#lo`4Pj|T1+%%aB#qaMCaO;N~Z5H#$DD*q9Ex;iTN+}4L3{WA;;*t}A z2y>y^M95qyh%p*+X^7#Jg9Z^X5Fsj4glZPE=c;Q$l!nKM@bB=-C8)qd#|gcMba7Gs zGFMtlU7hWg#q=G6xD|;~pgCIOswse&&47e3;o>frM$LfhA%g@q)tD~ua0uAA1(I$D zvlvYwjQ~wRvcDU`>bZ$_r-Uy4KCKi|MQbym+T)0!Igc>6C7cB8v`t?bWG%*x01!Zh z@R1``Wvc4WYsZc7Jb>n?*X`PyEs11x;vzD7p@epDRKU$~Z8^lwqXCRVK}}O58gD zkpK${l57sOUmHF}P`fdBas;+afu^XSfaZ!wJF9PE1=<7&Z3N0hl>_-uV3q;mo3mP{ zl%j~In5)D11y(C4Y8JZ@Oh{OFUDPe#&OUxEkdltFh2&?T!B>ef zgqszqukIosQwRV;3S9AvmeDVDStrg|LJ6;+*Xo>oD%26b2v);+{dPdA;u;uad>n41 z(#M~_c+-UbeR8Ps6!v0;JaBz`;)&xk?@CaBu?#0VMfiq{_)lo*+~$VlDNvEV0HTG> za|{F!Xh*6t?4-0OGn9@fiHKFXs&D%^5VnO9bm_|76cL9!4D*YEn#;cs_Mv!s&C;S5 zm@aU62y>y-#ELzElCc!aZ#jphLY03jE0FDpvq4DwyIT0*`v~UjyH}`js=-T2>ToWuU#5n~`)#HxNImZrSAn z&U)a8Q??T)7iTu2&A^Bf7%^A*eGML6qk6&;u%v%sv)6Lu{gj zx;3IF*ovW|6#dL!_JnFU2g3kwoMgAy9LZbWE0)eWWpXfHqX zhPN$Lt!(Y6DsItYTKR)a5~l`WKBiF7022_x!63QamkJZx6InUa+zGqOHU{QdA>+C} zf6N#JgY_YvHM!ChzffL5opBYSN%Rn)3oo-%9!GZL9Ny9J31JN091^pk2LLRlG$Ouq zN|PH2nYu9 zI3e<$!+{Q3ja@010LmvJ+j>^9B@!;6uLb3fri2?ly>xsnI(R`n2ax&GP%_l|hwnXg z*c28tyoTy2O!?xLVgQ4|>q>?7#W2aS`NOxZpKfORY?+#u!V>=MtdBnH3J_Ao!3o;D zA-${zDOqGK%gdaTMRUNog3ko}S%6KeTk^!_o}?)8Z^NDqKZ+T+&XRc5=*e9^yMe!a%fIa{iZ}O^Gb99pI9!SK7#G!9KBkpO2U2mv<%}08O(a` zHuit5-9LAQkQ$MjKo;Ffh#A8_QwB@0c_H!(R<>Q=kCl?b4c|Hxn4l)tVpy>Aq2cN+ zMwHZrIYoi+Lxl>zYU#yZ931IIzYd%J+D3)v!v3p& zT);qd#pw`g1})*FW1uei9Lceu&W>|yom?TLN7RkTz?$HU_Vk^4gSff<3d}~sHFOTW zL0yzLBW<`!A%xwi4nYPn1r<2qv7D$ejAQQ0CT8;asCf&>CqH6Z^7Esu2d}7+lU--( z23!ZHDLI-IBGtLbDI(UW0ZMq88YD%h2Z28nIrQRcubz1_CB~5ak$leVMYNwqo=7xc zJ1`6Nbs@Z~BNmWibKpoG2I|qn(F~WoA*DEkNL31hMROr~OFuwww)J1o$4YHpN#SnK zC*kC7AqWey3cpimrUGJmaO*M(=pKIWO$dd$mN}waA4p%#9On`VEc*uZj^g0lvZ19O9v>|Un#7aVZA*|+4TmkVMf#JApsFXxzUOq6t&u&OZi~4UK zo>9^+evT3y^gmk@7h-#abQH%1^<)P0AaiOVI7Zrnc9%BrWBCfmF4o<-M|9R{pyg4Z z3pK!N^XA*|vcnjd|8Y^Oh~Nc2!S=u(eyqS@{qOhAjQ7vbze#8S=za z4Df|T*dRDhj3l^aq70tMNp5OibH{YVGo2_~sy{EvnBNQ}XZTJv(o9NSa^TbP+~x>F zS{{1^^#Upl+L6{fk&HmlgQUq}!x9IP>_LaV3IY(kfKs$PlVDN8hwCYVf^On#d_ZQW zc3>(>P>>5*Pf8gHkmM;2p*%c7Y7WbCoSvvAWm3iiZcAb@21tHR63O@DQXHrZl+PB7 z+x~Y^Z=tYvh2^drC;qQ`7P0k#KM=Tww2Et;!IY+x_o4EJ9?|pN-`xtPRNGAtuBk|Z zBzHi+hZrzjj^( z7dfA4R3p(RghNo^gu7bEfW=@tB+0}bI$%nmh6P<3&L|r;^X`Siy{lF8TkHxN<=2$TUwIdeo@ITm~Gr@s5-yPW_?K8}`LyDlZC!RNR|Q$zK9- z-%+&lxo2e)xnp(PbO^V-B1x%cH$G=j6xL zJjEQ;{9mPGY<|X+A-yuhP5N~%M~9@HHG@2;*SHyFYo@$4BzW3bYf0HJc6ipynpU8Z z@xm4$h%>Lv83<9c8?y);gSDi;bK7DY`h%%0pc-K&j<_NwfoD%0T(=WPZeeLN{2^BJ zTQK*G_@IR?9vjkp?zKlM7y2H;)tepACyfo0x61kk73WQay!8D$iF~4&B}dcFKH?7Z z(QOGEtY5=A+0(c+fXPPH73SzUO7su4s|nc-I#g2F^c9O`A@0YP#_hq~Dj+*Vq2QCM z4EO^^$!F~x*R9bnC?s+4u4lUh3SMpy?uiAlY9}M0NDCt^qe2H#grODm9zlpO?@Q1} z&e!g3U^*6fVdcMfu3q-ci@di$gRKN{n^k+LEQPG&X{HLo3kdK|-?U#!up#1fFHaEt zHGC7H?{Nwa2w^>_l&tXL)P>FZEp+FTk3>z&Q(aIzcL+pxoFZRfInGwxK;UQ4gGP2( z47oaNlAb0pjAIbSaOKmV=MGmkefeH%)$Uaeh$?KfmA!qP%8quSK>w;(P-d~Oyh=> zuDKrqSxPr3+`O0fnRUF-+#f3fc}_KSQRD4&Nr{mqtp_61disULQVVBK+R`mnz|qSH z^p~|D_FfNsP({q&z$>FF4`SH;s?_bC!1GZT5d5c%`7c^~FbsZr zPAUZjv@HYg-%TXSgw5?sg!26}S0)tjdrgx=>MNq@Lbwq3n5B`jEv?hI_#HlDL3G}( zPU-3B4Gd+ycARad+;Bq>PK8UDukA)$T~|$o+I#@pCL-b8dTZC9Bv31D-^6PeTW7vM zVjm*(06Jj(WPU%6_H_6ridR`(F^tPuQOwPJJ6U{38)!FLTMI#fQr7wiFP+@sa}5|R zd2szEO8(N&6yFz&J&>%q!>J;qJIxg7F!VK{Mah*N{#I!U5beU6wWeCYBH^jAX{s)_pp;%f4!c<;q5DPeEE(d#R z{33qqs2MjR`X<+rb)UZhP5)kr1N>ZCEqtv9b_1>qH1z6+hob_s@KDA>Px2h)S`}Tf zsKl8VMxhcF2=T_igoFN;HYIa%maL{?dk9pNkd}NbSVEkHVs|*^Zga0qJ%aTAgc2re z7CT^5#`I_&@qw_`hBftLO)I#DO09kadML|@?SeL^8lqLU8&F8r@ zn$VaR#+nq+mW6Vl6IPSv{ZIEp>%9)9L@Q(n#q040_<~Ft?a&zL9)P%(A^+)Tw-JcV z+LROcV!f2Na5qV_2pF5`mzxq88>#;g1q40vUQ09jA(ls^4-}JZ4qT~<>qs5G80$I7 zBc*UNZZrt-aTjr?oun$a?3AUW_hz?yg#QKJ@+3sklQ9yS30sip(1H*l>-!)%4xe&lgs<;Wj_W%wZ@wrjJ`L?^+=(euL# z?TBUc{5c1^hl6C*M)1tcLr-zfKEX0_E<(I#9fRo)OlO2c9)ERS`$!Kkq(TzbyWoG# zPpY#hp_sRQ4|(WbL&cOXN?BWo;sJjDlmTSR#gPdWdPtb!- zu9VPE-)fC76u7g&PzqwX(Wdh6zb-xs*Zmw7yRE=0ppl1Twc?qn&hgBdnb0S zr?-(!xspCJ0}m@p`w-@fEZ)_!S`CcjsMoOCAr~)kZ@?#y#F~brHEq*hy#zVj`$HlZ zBvuba)P^+mUFdrmb;g;#EV1S8`KkL8} z1?N5T6{P;&A6H4e53$f^RLS_yZ)T2+!kf`kQWst$Mk{TFHDbIa$K0Iy4E^N|Alu`Y?Ks1?0`Bv0t@y7+j{wT&S%g0h zB18OeuHWm?`$MgL()ir+=(bqJc6nbmj~`4CW=?Qu;^4k2Si6$7@pHX%3L|Yym=$ICpFy;h#SX5@k_J`oVQLvIR=1#QrJo>pv7A< zJ_L|w4gfsP#sK+%(rRVd6BCF*0%Ymr!nrSjQ1u0bBnb1$Kv2Q7##ku2gjE3%IiD#I z+@GW!WGf_VEnOG^yb}OkH0X+nQnSCQdV(ND)_EcJ6n-Jf*1Bj*-AiHU&tatS!h0G%`Zc`Z&%lXU5NE^T9>1 zxeAa%CA4+}{UNm26Ia@PLl+yC4=6kZ1QB)Kf$x?eD4=0r$sM<#DEvc&oL9U^19Zt^ zYgn;#A$c<2j&l%LMu-hBwKEz$S}_bnPwZ24W9(?1TD}?BhRPMn6wgd(OcE1iP0=L_CYd4uIl{gojszTgcJ%0dvy8gb6@c(o{7vXtK+D~g*o-ChfJ8)g6R!k zXkEz`qN)(WMmOkCJ$3t(hsXL?+vJF6q4tN$R4&#=AN64{p>PObLErbh*)+qLlo2kb zLRV0CX*yl&Z~nM}n_75mt_kzZgu|ls z`@K12U%__pUrZCrQff?znKLEC`4SX~CQX+%eaou}Ofd4gyNZE>Ih||h4nF-oA3s;G ztjlzle)N81edDZi^V*-dy?t~A4|DAGfz<@uZlMy#st^7sKkGsN%?JMk8_-3|94KGN z6m3hSDf7@x4-Ujm-%w9CU&cHv4VU*nh&%eX&%a&|m9IB%4q_XHIx88fDOCYINhP9jlVA ztU+-#K0(_);CW2<-N+U+1VCGMInLp;a`e?{y4Fyv15wo(RiMaKy-AruebH*kJ<_-5 z*TbV8I^ShIJe!98an3z5RtnuV+l*{bH+Z18=HTnXD>Nk;qyH1Tnat?tQFg%3# z!lUmuZViYtQ%a?s%N-OwKD;mc_nfwD*I=!UHlc%DdoEf+(q=;nTQ-EcE;Oa0xs)el zqcPVmwAr<*v5Znla`HP?eo)S6L*;9YC17uYpR{=?uPf3RWlNH)RraO143?xo%s3+U z%AMr@>_GqAhV%9jucJ}#-Q$l$*lA8=dg5dc5*}PGd8pQ~mQ)U+?oHR-zt8_ybP*!E z#jRDfQ@?5Z4L08y_YpV_I;PqgBHEIZ;|%_(PFhSoHaGDZkUR0Eck6x{*Jqll#y)@# zXLi;0Tpq8p*Y*z{;T~6t@nJ&>WxPUO}UN z>M_}olo2(%C;so^_9_F=l%>XRe4Uw4DA|tNI^@Pv;GQd|nA~0PuoYXHn-uSql>`tO zDz|r07K>?%6L(gB1gXoF-`w`gdi0E`6115zJJgOs$YadmN=>LL*w%tXJ6tSUZaO0b z%VWvM-@$7N2x$~4)wqesC?KwZfP&Hqwk78E!=DTMc)`*R$Z>KaVhuZqGEJqpxrM+g zV2D@@%d1qWR->$w0M#u)h@WPJ)b44X?3b6MA5WLBO@vNz_0Wecb)xXWE3~LPbqVVu zvbj%T{#tzG44zU+zo&$v?DJZ&-FW+joo!b9hs6{11>l^`Fn9Ud(rN z?~fhKaMB`Pj|ha?LmKa_Wc~?}ZOYu4(D^eizn7++^KMzE9J@8pqPb<|NYMY#wGp=k zeX#JX{6dQeu`o;+ETJeCP+vg;DAK0otW+6%SKxE_TdWU4@A#*P9%Ry8Mx=H!*e#pY z(gU9DyY_6~PDC*I2be+^Ix#HDx|-S zNWNAw(pBCQkNHUdDFfN}>i)AIFq2;k#0{gon1EYB-4k7*2gA~4{cX>!i|M;G)wvB7C{*$4E zhR+I893gJ!UP)q#<-~Cm8A5xVhxNJtzUpdUR6qKpkh^;AX_*Q5C!L)yQHupFYq5iu zetfLlH$=SUCeOfmI6V707k0ZF?yl$eenfVVJjv7D{xGIb}?9YGSQff6+XImT&ZgelC_O3O_cntJ`5=Q?-fVZEC8zed9k=Jzd z`}#fL4m7=eOMH4ik0CM#tc>NSK@8*u$fkok@NAbn15s_JwCU_`Uc7J8o(tquReA8$5Lk-+`=NTNt8cENzgY&< z6VPT$JYVhEMUgY5L;eUIbq)*9{-|yIi%~hp6euD5sefURvhe`q^jiEf`a_d`-HjA45I(sLiV)da|jSuLd0IJ+(30$5tR>u z7b^*-xp^j2mH#!(=!K%-p00y051@DdL97l0HXmG}*at0)sQMk5xuq(w=auR)bYz}V zf~qWG?V5w@&pSRi%FIjKS{h#UYTm;jqBB}z$f707Qem3bwVL(4b>8)PoX1>dj=kpe zgoC~W>wle+7Rah7u>RkBNi#^7-JEQ+OI3X9wdb<5mL%TBoWz=Ic;Sq+d<|bfHX<~t z$vMK1^N91@(cM`Mx{Xs^l-6x6CPjCI|6QgmWbHD8Z^0)-1xQ9$@5aSq9GRVdl*DgX8lQQc9$AxWA z1@VTIfK>OP%On^eDFfF1fJ}juh%=c2RpD?HjU))whzdZl0Z*>VK!O&c*9KvF0EW<6 za9L77L;;JVU^;#KIgsI>LV2yNxlrT;8tbpNdxo<$Uc;Wn(*hq$l`*C?r^bm%qG5Y^ z2RYODWa>xRFGVw>_BkcZ2f2|37BFLox`J1~0M+P)2@Xm~M}aCKRW!Qh=3<5m5GCGSjM; zE&MFj{2U*+$*+1O(SWl}2Z`#+Z&9iImCi0-gG=ORvI97O=w87-o~rthtBw@P_&2V zy>BA3p2$!W6sX8$tWFiHAjg6>`3n<&^_5 z75iqEmVMd}bbxwxx^>dkWwNUhwQLpK@ZQZ&<(8V61p2YsSP*i#cCs2-+ZG+U&w28_ zV~!Z3@VJkGl*Yt%9!Ck)3dZ3?=?X7YUx?Myvb|qnGQ7M%6(~cU-?x@OwC#aT%T4VU z$B;H%NE0-VP=lguTT=}ySP3^5U+P^&y&I^8`Uo}FL6$EbCeL{-?3Pp*tWc8QVeUvN zFCb!Zx!Aqwmy5M%$C#ek#@|Nzq?!0x*XyENKG?J0nWXnQZBEM&6Kdz2J%FAQLuC6% zUk|cZ%`_y?%0WB8VDt|q`IWT|%3Ba#LB*P;61qlT@yrX6h>(HDcc=mP_6~423GJ8D zv7xytfPomIA^4)rUJ=odqzP1hP@GJEX`FYiZTczOh~7!a-yOl8%73G5d_Q> zAfBNY%@~3RbtZGJ`1v_S4rKt~fIdACJA_s;iZnNVho zH)EE-7s)=Anr)QBfcox#+ATU1e7{?GP)(=dh!)jq=wOs;AbMefeh2u*H9D0RG)`@6l$5#U3LP;dUT45Lz zVmR52ZfWMWWH69S-JTrM%v5fd;vo=5McR!>Ph1m~PY}8y0W&}hd)HUG#Dv{aMK#&U z5RS|T3or|W?IuG>qBmlIywo7k0xQ1o1GNa9? zNdr%S6Y@Slt@q+(uR0L)yRp(?#zurhsz;Dw|Guc7vJbuoBs>|$M7D*h$(|W#Q?%NT zcoPsd{<=&WkaqwkLMX6BX1@^KzdELNt(`zL+e2>;#7vk=NzK;*(YrZaqgc`to6w&D z2ci&ZZ{ht;1mEgx13g;SQI+*MrA#Cb#matQ{tm^ptj!$dQX+}hEhIjIJ46XEtJbny zw_#(9>FFN$4F=)SlKMu0Aq!>YMM=cVg?9MpR^yw7w@?6Z9kVJxyn}@j1Bc*4jy@kv zjZc!Rygz|IP+$8DyiwzqloVs%`CvtxC5SB(jJeZ}6c94=IiT}O!@SQ;HTRUIYU`45 z!d*>PWF*;E7Xlp}4r`!)=$hmq6$o-oX%GTv1q<4wAzTp(Dgh{cDZe#QDfv92zPci= z8pKor-Wzq!ww6NNxnM0VAXFXtGk-Xb=_cm))@no3+`o6SFdFjb_P%bW1d9Y9Gax2J zIe$?H#u$9zf$9QbOG{xBIB)@REho0E@aEtur7DB}J~`$}3$`;(ktg2xyShFYPqER4 zf->9hFn>H}?<|6SA?j`dTC?Gm#5TmLk_EI6{;&P^&SG$BRAvj(#U0{|M1PeWo0 zIaS4DP?Wx&G7&37M-;oRCwENX^F}F3Eb+^L?aitu;_QeBW!odNd3fU8x?`F?M4H&+ zl!yZ0nL-WaXq*Xy{Dy2s&J2e`Y$g^jPdenp7~27QA|!{u^T5UE7srM*cb1)M5J8kp zMsj$F5SYAi&jdgO9E1{rf({Ou9CQ^-hO>EH-Mwpf=NFr#ZX-c9Y0)Y@A zL4Z*(Q1n1pa@wO*5jxCwH|2j^w8+;SGlSR`?eih&C49YAC26zC5kju(5IDH9CBTTC zIRroopO{DVo#=>p6%&ZuJQf;t4<_m9wNgMx*jSRz@gYag{GaUuQ% z&`l-D1dZL#x><{@dYU#_|sUOLDY~+M*xvstD?>BC_KkW1Sm9eC8|c(9}a`fg3me?+Kx>L z+|5Rh3#o``kAD0eP;bXs2V?~H3P^5%<%SS6mFeET4NJzehP0wsMl8A{yXmvAq2s5f zT|M_myZ1WzF=P_Z{p*QkN1jjZ9RO;{rvge$X1g^mTnc@=0Uy38)eGUTQpT89bMdC} zmUj;VuXtap2$-pYL}!E|~h?rr1Xh8?Ez^Fx{!F;PNJb>Ns>xRd7%W1MiE zTLTWd5_#QYzYARLUy;tJ!(SCE7f?BIHGR|?yaRTe{i-=6p6oweC2gNnP0tpxRkkhS zS1EjG$emYb0go4oa8r~Jb)ttPDW&&5z3=zyB;tYu84;GE2rt%go2NbuMfgg9nUzfb2iqdEj|+M_lg0P6h5d}uNI=@A)zs@dFeJeu;Q185($C; zhTOL@d(tRYz}@^JicS~xQKzl*TpMcytcAE8SNax4&1dHl|P#HB1huQACWnR=B z`Tijcc)if9Wkc9CTG6Y8;sA@r{bUWIGckyjdI%o62Ar65FJYl+pFh>;!SL^)N*09lJCD2rx`%-{pHyC_ z2n&jNWft&GQyV$|=tOHxK_VsxG1wsB8oAfB-taeG2{Mpl+?OO4HX<6L647NH!Vbn{ zA1hq(RI=hfdj|Cbu4AgfFyxiIjpZJxQ*vxXkhFCDxRMxt=7Jx5)MvLA$r@%`h!hIA|Z)BtJ~6qAiRBt7B|BQi z;PVkC z2d@fJdJSVUz8Jp71xCvZ;iUsc+2>BIX^dwph$nIF)l%%3eN+NjU_w$Qh zzngq;<}?wGVwMbL-J_D?=nSP%Y2QA=I?95W0;K~1%s)mmMm?{Ckt5=NLo!Z{jr?x2wv zz7ttvk{+meM$liUo>fYP9e_h*=grQs!GZS%kb`c>{8dBUrg1~#iLkR*$l3gt22m5K#zlD)a3h5(!Z^&_T#gnV{+h z&^1RvBa}9^!BM;Pnh)Al1t0(qo`O7JU%# z8qn{>!IK^cHdYvWRRT^;^w-b7%6d$pTj39c?Pw@>4yhK~l}jEEP{o?QiKtZvj?F2E zOdKu=440?$s%^A<+q-zJ~|I7s!LeWF(ngknA{+uJ&JZ ziW|nS(=Bmq+Rg^4>yh1zhZ3vfeyBlSu9wz^7FXc;^OS zc9e6Zd2z91uZ*o!clijYNgnGbX@-1zdnP(P*a(XugflCMdsNBidQ zv?eBpQMyR4H3^}A<3q$hDj$3gq~TYvbVqvhoEf4$AKD*-(-J9)zTzIUs7Ejk+I=az z8;XfUDS*?Y4-_1R>w<>Uq#5xDw{nN2Q+QZ1EnnD9`KhPT~Jc_Cfo~a&)SfZ~bHr4VelYR1Z(RqVY zqu@Z>X(&x7;JHP{$Q(5JE7$#hC}cyH9+YeWs4o;@FDpyzCx$?lU70}(!pRHSic=sC z{%0W(kA4yuh^iS_Rhe#FWdF*h+(=m$PFPQ?DSSqH^fQ5I;EhmjXAe`f@2RoDi(qHH zVGYmpeCWq$cvh9<|3fWSz?=xDCT zFPOMCMIhMPmykmPM%1(Jy|H;jE;fT09u1~B@)9X6f-xf5BaA{; zT_5QWu4bSo@40%M(_s)4zA#Q&V&;bFeTUgLOtO;76M)ujkpOwou2LK-%`a+04=S4w zWB~%nNI<7%?|8#cdq_-d1^8hy!xgHvX~IvDf{Gc?`ZeP4hM+hE#2`wD!DO5X$Wjv5 z`7ea0-sgEaMXdJX{o4RtUIaIQhllS)@_Vp#7p5GM9t8fYy~T|xbIMF&M3dFH5j*(@ z8?F@RL$!A3&}jYQ5m=wGYv|VmK(6|x+0Z%V^nyTz6FDzeJ5LWq-50c>%S_sC;4vY5 zJ-B=>C6D7=%IuD?_f8(4#P>qa3d6)Dm@dAtE@`GEDW;w$h?-E6W(=%?Ge~!U!|!nJ zq0lN2q=urs@rDUUQ22t6+U#_be8A^^@I@~d;--kW^D!$MRxRoI$1rslo_#-!O z?YQ8Y&4v!QwM^V#Z-+~uB(4xYl!$K^Eqxb_MVo`5{$ZZ765YB>qA$0g6JoPUyI7Iy zr;yrs)7VoW+6FA2tyM13JrH?caD%xyety^Yex$B&0ok^&w4YiK_NG zCA2e^P1T25%KhhUme5LfP_#Quoe(sEwH*W0vE0NNz`2vS5tItnHP%7H4UC^qZA!X3 z$|-zE&I${qO9_L@5~A>s%i;ENLOBqAX2%j8GJG8911qVgeB?4&z86b+xrv+V#w6S~ z+&=(+e>xEFH=ccobrRzJv@ZIkU?gBlq2&nX{=+G8iwv&VqO^p+TZlz=zdA@qsSV)Q zosf6iiTHv%rv;pvmS@Kpv&zFs_RFNUQrycqM{|ygJVo>*-quX;&v39 zJhXY$B+~mkT945Qi}{xTaE%gc0!jnv4S9F(_?Ii(DR92Ea5+%V7AOh<%3J0z_yPnd zA#b(OV;e|ZNjtH21p75Q2X7~#Tm}Qjl(g{iev@kgCK&ZFlwX08?J82p1!NIlL4_Z- zq7JsmH1Nm|@cEMB)drP&lJ5k76_y?kf?AsTp=wR*)^{O0W zw&v+i2e56TOpu2Fe`#v8l@qyp{X&E_wIS$sSi$2(jsVUYr?=>Z-RW<$kDX%AVHcER zGM0dd4O!`=fo{XKiJxSGu74hb#%e~=wp=b|_;4YhvrP$Jr*ikQPwAtSm|@cm2*gQabA#_6oU!c~je^6tS9tt5(>{#T# zyg&-L8%q1#Hg z0IuL0bFyD-!^0F64TlQU5>^muYorY%KTf^F+CH3+ejw*vf|?x}953zNl8o-m)@Hiz zGL1S;Q|X@y^qTxv&$&`+v5Pr{4ivSC(o}_66yiX9V37=k&&n8zD3L}| z_}+}WlbN)|6J*h0G?!a#GnEf90|YP-Bd4^HFmB+1DXV&VB{o%@o{9=efj{^*5UC7s zg%@pFkO-<*1S}ExMAUMyvk8wMRTwT~y8v6jzvVzhKfsEBTwQ=p1ytu5tl6|%A|M25 z6eTDi11>Ck-)EWqo8RALYk=Isx2GrFcGcEBm5>fNlCFZKBM5&#J%%B$HVk)~3>K{S zB#`*N8{2&NF=W5sC2sPx{9icO-ft2I(^H1~lTuc)sGpI4e5Y0%2oh(nL0ETB2($B2i)M_Uirn zL&*N|TLZ+A(76yWAKwt~=hd37@%E0JhNw#gI0HNhfiOsBE0A1hm1P8s%>zBSA_E}- zAuMPrPhMJq{UL5|@mr`ur~+Lw+!>2)9eY2DLXZ$E3lr1T#|i|j3f6!>d_a*w3`8LiAQ=Hbkr0mAA_*>t>^Kda^QCo*Y`mOvx)9?o8C4xrw33;FjLTz)PXRPc65m&w<8!eM zsBmw;pGC`8E)xs(e@D&9z!T014>)8w_JG!-PS4sjhN9%yX?Q0O>!I+j)fGQMvztP6 zFYLPp2qz~3NKrI`Q_3RGJI{Z=Pqz-B>m6QWe&vWTqx z;nf5WY67dakndJRr^y~&sB@;j^@B&(NOHB=y$LN6;Pv1xU~sDju#?!_UO9>&n{vcO zEeMB3Sta5Uunu%2uZ*qQ7?pLw0?MF)x?Bd^SW5os5k!C{vs12 zV>aZ}hYy8>FU6BQ5jY+J-cC?JLNR=j79az>{O29I(6om@X+hNoDP{iD@|LrAD0JIJ zQhQX(_@-^U%>-y}bmtHtnXmF5&oC|Ze3IbUn-CsuLE<1ug~I{Jj0K_>Hfpin*LrbE z9{FUotns~|DK46rSvH^o(hMFz(7Gw={b&w45KyROvzi#d@O4J%)Ph1l7XlsfGYc{K zoHL?RtlZ)y5!%EEmq-w4sn*a_Y|>AGt~f5%t*N5=HkF0K&rqgXWwni_z>^>Ew)uc| zpP4_^x~NsqJ^lop^kP}^!uU{0CINP1oP%gcL1#(`@luctx(3&4$E$&yZ^s_JVd}~E zg3|x5SRltnF=$av8(^I57}*mU{93bsiwwkrIjRYZFHpVMoU191)Q>#veE6-{eC4pELOm*8iaQdja48VL+b0eVN^n&L~I# z00A2{K?`sLGcu6qK$>WQk`NO}LP-Ed8ynv@J@{wo!-jw??*Ub}$T(_u&fQikoQ+dA zAfjf0yC8@B?%kAvMu+dImr)}PeFo?p41!Zp?U_zNW}U4K2W+9o>`^+4SERj@maD!H z`@0furwV)w$UIj;+sMX*wG>|r0imEBL0zvaq^BvTSE=L+WVOL7ZxAJ+z$8o!W)0IT zXA)v*gd>d)D?cbW=tE}@gm8HaLQxK=IiJwoGoe#FUTstu{!sEa1^z=Pv?SP#NY%9O zljv3#WDG%am>YkR&&Ea~qvxc*k_C}SYBy}FXt~-$-HM+pvp)n6R9sesT)$;*qmjQ% zW&0EnZjD@YGq+)wvTb%NNb}orU3%_8Ph~)mEme&K`zRqt?JLmo-Y@{HUpcFslO-gDmdOHxrE@qj9sX1TP;xvX@D#cB(>NYdnAW-Nx0WrwJss2ZRM41 z=!Vo3_GYAlw*V~B@re(7dw-C$VA4qIJ5kUrn6z)igTIUUlB3`{p{*q(k6+1C5Wbjr zAx~~2_Vyp1vXXRvsQj{lvq!KceFK)zLw;F;^ZB~=wA&U?eBEyAEKM1fWho|qs!uSz zt`&VBpPse#p|Z)nIj2M~Av-mD9-!l6DE|%fsa(5dB83cBQrQrcy*wRW$SWYaBKTgl zy9l5Ib~0SU*=M7AE!jlsU8p^bIIvdhkXSn~!E5ozhTRBC2{usuk4&lSkq<${h4iKG zizt(T@w#<^WH6y|4XWI>l~*sHanF+OzKt6a`IfbzvHz^n#18WVnwR#V4y=0d`P74o zE79v1Q(E#?YSISLx#S)s1JhCu3j`g*7Qb6P@}if`oaKuO*G(f&;2q!QMeoa4QAcNk zO!iB@gP)jy@RKW{he?hM8>j~ISF)-*T3otTksK}P@%#S3wy75)wz?94p9~Qp^%u8Z z33oO07JNAI#T`Yy$S4o_n9)&8cuw(q1t(J_jEJV&07$EuNiX^Wv^r4T0;MX)y<+wH zCzzZ$4&$kcV4v+`(-Ru6f`4jK1Xu(FDZc-gFCY}w59*jjuuwo&!5RR5^h7K&8s?E%qNLqlHAz0A=+h)&jL=~HbRU{wtOti>Qg9HCP8f!xTO=4Z?KY(FF-|>6u z5_+(#o|qDGI%ml=F&tur4yfx)59}c%B$(Ep6h9-Qf&(%OK4H5BSh)*h=|I>KWFnh> zOb7@xplZVKN+wYq(Oa}1D0(nbuE8|g2V4?$dHVK(mucMqqPn1`(RyG1yTK>^c_E26 zket(mh~O*|X9egoFi`o~+6LamIqpAidV%!n!a z3{K}keIB!0+Z>f&o|ICumpDI2KteG^b*hMCahIe`*Qr8^mkhh>af9DZvQWk&QxPd7 zjPja63P3HyzxguREJ_Zl^4cIMppRtT8A$(mGE%e`wWULNhH@b@i6u5qBI!W-0Yln@ z;h6YAjj}S6;gW;Xq1#sg&-?@CF_2) zbzvBrh&a_^ey(Hl=7t&@YXd7!aKfVCf)m(}s$O!AKcI zCM^Y$@d^IcdpsTyH4Uesn%nJWjn>Lam1ilPANPZR86j8_RzO<6%>pF<%!MLPjw!WR z189|nZWM+F2p*rDVKQxbE!>6ffLTkD0H{+KxRJ3DoF6`@140!zg-YhBTy_W|-VHX2N5d?cE8z&fKaq5B2rSv#1KVt$vA9-=6 zAHVXuXup=O53iAt{h7f)E2V|E9XaT?54lN=MyS`k6~lL1>_= z?%xv8K^6Ge!^ONIlKBR%X`(R_#UtQ@&fAOaB@MqiW4ll)QbMA_#&+-AEqYRuQ7Ij@ zgO67^pAn^^p0uD{mm%=>?@vC6D}#v^Hf2EUsN{4XfqNbcVdCUN#SWIr7tpp>;WGz9 z8LRZ8+ZMn$kmv%(g53M=zb%Q^+2!9~B8d7y0T2W%K&nwq4Js9W<_1&<(giktr%{?v zHLU**-_vj3$_E;o9K$W@G@_su8r2&9uG2rGj(Nj~iyY%dCZsZ4tk!_%4mHOXX1BO5 z_%*~CR%UFoSVuNbIW*HUnhB+-`J|3pNpiq?kjR!yv4T3+n?D zK_RG9d8O7Yx-fG zeG@SHC6wLp4Rp@1z+FSaMh3rihIVEcw(k<4a(dvF-=O3Z>j|DH^ z?bssEbAmno?m>$LpmqaLxS;FQTyX~|tkP+&ez{}PVMs9FMK%Q3XC(v9QxlokJRU9y zHwZJ{fSDF+`PY-v2N}sJkZ;$ZJ}24qLR!&k6Uv!-&G9Q_m9`a$vyk5B+-pLoGf4F3 zzQ-u`$&EhH*U|!Xzf!Uk3>_t*@`nhJx)9w*v=HVdkH5qbbaTx>xD1Ag@NDwQ;$Vec zhmcz6%#T~RiktriSV6oBav-`c=$)6_RR)>3(irpf>Vj}MKkIr|iPN` zs9_4FU|!51U#_+4(U}dKw+>(-K4I@en37HqhCqp|bZ%K^e0jXbcikW5H!4fyAvz%J z3`calHUvmKxzpH4l&v;L(p3DayJe2rXillS=870kWIO%YLK?_TCsjl1pKqVlN!F0b zA=MnN=vf0eU_#9DY;^#4>2ADp?VxWn;Wrzmf_e(z&d_l|UA&08Bp_JE=bmftsrZF4ahNX4ah$7$;PkSa-e?}*v|Bfk5H&&U!_lF zzMx`6rT)=jWLs4ELTW-(#IJs$q({RAlomAZ*n$z%U7UjzzF)YNq*n-#Z9Gl)DjM&8 z-nsL!)2bAG$6zhNod#{xDDp*L@E_%U_kyiH` zbkN!b-y`UT{2>yxB8ZC-4&^g=cE!GkAmoNkl?EkfmJahDc2%*3{d+y<5 z=4JXnPH2oid>`gR3q zED)#63JvExbNA2e6`maG#*A?d=!0JYY2N;d6hX;dKSu|=O?@2rJ_m8_h$DN(}XZ~gzU7i^Y;+*`u(2C*O4!;70`Md4nq@#K684Q)rMl= z4qyftZQ)QId8`-V=Yy3F6Y4qGY9p&lW#*l?$@nn*zfd1fY3zp%c4lY0ZuOh-3`5*7 z90S6iYm-vS?GMC<8&1Q6`8h)>Q<35Tr1qAUoRWvQ?$l5fxH3ZL42FYn^I@x-dfOYe zwakOWWNjce!!lAq3_uewDG*73h8kcFKNrpEM0z{2`8GzuntmVN3Rr-C*g~T6SJH-8 zbV>$*1jh&Hey@}0J&uo}oWw8#dhGZ(EhC457)e5b3_`F31n`8xM?zVU|Gs3hf2uw{ zZB{Jd7`krUfn&5O&Yl%>h2!uvefe`uZ3~-@>KKQR>H=E_Bt!&#hzAyshLW>7DPZWx z5Hh-k38yC4?t%M(PWTPN@FuFvdDWW@CPe3vvsipBI|s*gB!z;+1VZ-ORgha~LW!^q zWkC0h6|l(rT1PcKb*wS-dBt(359}f07<~M42^tt+KaD+LexlgZeQ)gfyodWkPl;hi z`@nizFA!^qeSf(XrJZ2N5=4;xE`&4n@#^V!0m8RabCd##Pru1%%KAmvL9xg1uAWdp~m6Q^{9ZY)H@`d9{dne|DiN>+*+hp0jOF*>_3 z%)jpa-=gePuy*mGJkyQdJaWLn;>DVY*eE3Ob;K&K-=vNxSxEwzcOg#nqO2XTCp0CU zHX*aUp_G%%g4h9`l1tFU1@y*-y6drx33YDTmvK#7=z8}*h-lxZ0BK6Fa6`&Bv2P7y;6`{|AohZA26`WX59jVpV?`pHLW78;kiiN(5G)L!5-_0_Ap?;znJ+rUH43yM zeP}|4r4n}=)qh)%!0V1RmW(VbBMPiA{$HThk_ZEN#%T$@@*I17|BZ^)uk3w(cn|Sl zp7t9;J8n!&K>|Yqe3=GhER(2KPRQ9=v)t?w2uUO{PG_=SjyNfCjXX;Jj}5M|KmZcN zj6ge6l6I*BTx&yzoh&K8)VnkbFPlPHSW>SIGfRF*Mgs!{XjX~;1>a2|S;QMohBU7S zL^7d7T$yrX`W6!axd?NiPzaFDkOX)Ig%0XMC0=6k=Y5^F7myf*PKKn3v400NB>nr3KJLm3E#cW9)HGL)$PyZcZJ zRFejd9^XOr3xYhL-g}|nG+n!51T*C`o(-ot!#fGJcbM%3fj#HW|SMi6{Y4 z8U?kqHI%-c;Gek4pbLZ~=%tu|z=cqkEMb(u-3IIcU_xMSfg~Uqke_vE0$?Xb_!A6* zWswT{(=amulNxh-@}cj3^4kBtH>EPq-8*_WDA@ZsAYkY6p9MvF3GgCeEWIwcbJsr5 zIak#Vnp2?N-O`-6vXNrt!cbxqvb z*M}-8alS+Z{NQIy8@?4#ho3|`{cdy%Ml{-n(d0XRd`CD?hjou&Zq9;TF|-sHQRJDN z-5FT~1Sf^PG7RESX_<5+j?)=18SrC5S$)SdEj;7B4I$G8?u-il2H3b#;Hwu61G_Kw;u@&iE6N*pw0Ej`kT zxwr(um@)JTDfNF*=xjmH93_=#*3{Q0_qE=*xut2V3K{ltr7{OSAovCle(Db!&j4&o znT|BdMT{|a`?~=O3AdR!H-dfa%V7(ML_JeYE*xcqlrUHWMee9~sTJOV z@Q0?5;e|I@cp;v?uG4LyzWu>sin0-{db1dikH(RGkhko%Msw+cUYdlxVU13+LT3Tt zSMTE@AGslFnGP@6ieW967>~PN65-xmQZeqQosM2_t10#DI`cdMvD1Kg2hQe6`p)TLojgq6MO#DVHC!wilL^~OWj>6>ao@WP zqnr|-XEJR)hO}W+fCxQb0nXa3SM#7OXhif8(_CerK+j?Pw$T_K(H3e4yvbTYV@bm@ zJm_8!WcEsd{j>R02BI07Pt2|l4IZha|8!a8yZ3tj_(JTeu+Z~7-=BYg=Ee{v^|o(A z(GESgKF2zN%iR9}dkQxLyrp4&wMf=0mKd9@o0@khLHWurdi~|~2+|G=@bT}5&(vZT zKBq@f6_mhWtNX|b1WrS}KNsjHGy`^nd&nyzjB=XFsX*NQY|GN^*4*+Mf+c{DsQEFa zj)|tT$Aa!<<73dq5khLGEiS>wDZ!RD$Detu6k6iY?1hi?|Oj|YObTyX?& zrz>WbotlzFB$0Ct=VxEGf_a}hKiK;d zdPgE1Yr8k!@+801VOS`SRPnm|{c+DeqJ1PVL=g>Tz4SAsU%%D~bY!CW!7G8wBzj$Z{mFm;kMPSTL&(N7O5j~l@c#qBt1aEf%EwP>d%r=^P~OV$V%?v zz>_5`bQ1X8kU>elM152eCP}8sOU78$-2cRtdfo9Hbkiw>2)ydbGk`@*-ZNGn#Q zNNCZuX(maENi&;PS^pH200AM3$0RG9++PtSpvCqiH>SmM9@QfG(L8Bk_`F~T&W zq|kwRUs)W%k7Ry#GTCE!#TtyT_F1_TUiYVT!uo;>tqKZ@i0UWp_ zyVQfJ1A*8ACw}_f&=m*+hFeRWi2EPhCP|%9Zd-s^{g3spM{oGt-7l+sgoGgAAtBeU z6ZvfFex*f#I&0|=S4?$wtN1rx4om1?C9OWf1-{;nA&`kMgU`oja&>69hf4fnuX6l~ zkleFDtPWH+rmp_K^QkTJgx5KIY^9Tdh#_J?xzLvQPFXk=Bm}n_^3_C7Xi6xWru!wR znr)i6dzW|@P4wB-1xM1ZhD0tkeCtceIvjVLIFR5xtzep~d$Er8K5dlvS1QanI1ulF zchc?X^2V1h8lnh`9XoZ*C?BZM-oZ)N=sx383-YZGh%w`ddP)g{Oqx`}ULn{s_WFD2)RSk*hgC>o zj%53pGAxC$ezB}c(w&;GQmS;1{NOK|U$T~t-rxv8h(Y)@@O-wk=icX(J>Q?^{Fm$X zl~Rfnpj0M<)+CgK45!8M;Ha*Jkrj}lzYPoJ!)QygINf)#^g3eEPuJ*%@0A<${se!k zO<8nxR;pEfaYwr68oXyt_4mjM+p{uVOpludP^z7M!YJS)SU`X*STpbHnpqPdql*@4 zN#3kl;<`-w^F=VtHvt*MrF)kw8HdP$o?_#*Kpe6HBICMTHeHAwfF&1h7?y%o0V)QO zv7+Mzqz?&eTMQ%?paD*uDDRg=A%gXdka9(cnj%A{F?;Hd)4)BY&hXZ)pbJ*yN+K3* z2vf{w)7j>{(^tGe2UVwnVKRO69i|fGiCqUDlU*n_l4!coaE7VK6(V%aoIUYWOTh-m zu^#8$Vi4cK6*VP)6LO)y$v~bC(D0Pn5O4xi4=3lK{iB-lc^JAfeV736{Qe`Qhs!m< z%Vnowlv{rRtMSmF!eVJkPqFZZv^u^hLdf}02U=|l?QFlSD>3OmjpR4CBoTIO7q(dT z#s-S!S*(C%S%4=eoiuvV){s2P+9Jp|HDD(Ep33)HHfH$`NK61vLmwF&JZyXx+sz8R zxHFP=^f=q0*Ld8qAi~Aa6z!ACOvraQ<1#URgOrvGhY-CVd%)lCUj-I zIU19iwTH{ug=8{rJw|320v$H1Ag+S44r;ky3Ae`#X3^%FV<^Lyc3wQ{Xxi7v+DZtQ zra^a?Unsb*Ay$QMCi{ET(U}eZ$4Yw6a${g-culLUdm$9`AH@;py^F z*vzP$f^=lGc4M~$ulTf$_fT3Ai3Y+KSTr)yJFc>S$oc#hJev0G)pxbqfy}Bd8g@4r zJt|v6(n4*lgJ0&$2sL(MJF#TD!plVdcRQiXd0a9zwmE{b97m3I(eKx;lcUFWwX;BK z_P)J)Md9YOU$h6ZH$GVB;j3uvSAg?)P(XrOK}$86_)Os{`(98nQ|ip&GfLC-K1^fV zK+2Dk#vKCsIRUQ~NS=F-$dFhTmu%b8ja|J|Yaz?JPpB`tY`?K5CL!j#^5jF-+w6uT z($>Sp#9DDMP1R~+)!nRfVcyl=kc9iItju&3oBngoE+P7Rr1|k-LG~H!#kH?w$ETgF zCP&LpnCC)4rW-Ku$D?|mLz+NdF590N>$g{g*O(f%hlDk*#rdqI&FEavO-!Go%N1kS z6|HCES6E>}fOA4wF*x8uj3+lH-UrjIjk5IvHnr z71L$(CfUI$4;?lED7XWD{PmURj#M{gL-d^q=5M4!g)#x*2?bay;JT&KA?Ac$4HG75 z7WO?EEL`EaH6gl-Y^pyWj#T&-__>p9v=x12%9Hc;(4Pe$mEd_T2|R*M_bkT+6mb1L z#gP>d;}H9yq17=ToSf5-aXZ093DRXDnZfp4;aUl{4LTTe7|w_$%A%)E{~Tz|?y?Mm zUwrBN4ere&Bd&Hrlb&BSFVg7MuU$Q0xFSSOwy4wNx?&zFK99YzL>6_oXjmi#ZabdE zJ+gXDwEHr+)Yt`)1)|*AHc=^G-J30!Lh9F271dThiKe}*UOM?Ij!c~>T1q&G0Q+~y z;Qxg93;Q}_qO~VK;Z+N80KSOR>PN!lCAx+S2wjBa*(5Lr$YLD^$kR5*$FogzXhm& zPuBtwT|3lX(At@krrA?mSMEknFQD_hgk+SuiK9dTG0*^Tz%}`QJ5ARA0jFXc%e{k) zI=di&Odz-H>({RwjGeq2bu{w1c>2~bQEXD;E0uwx{Ike~wxJk3aa1=QMwv438F zLHVNM7RhxJH!tZ{`NVO9{Q1}9?|?>p_7OL|8s@y=F#)nVEJ;YDks}fcS2jpr7w&+> zxD#xP7*T5=$EGEK9v;vgG?8kHwJ3+SjTYH!T5TRGNRL3-$BG6kq8H zT@2-5J%HV?EsGSZ1#&q_iJ+b=6(+1->#zLa@~LRY?P&_a!-6G-if0FV;n}am?D5Wr zI9m^7D6BfiJD-b?oB7H;U%VTfFe?No2OttgL5HdWHLaupu?SXDj=RB0o#AQ`Eh!6M zC}zW}*hm6@GM(<|dDsXf$tW-K0+(bBqjn8qRNpgxIYi(ooqkj5mV8@_J#?W%PcQG4 z@M=vYFjplp_TGNPCXOOWelX^qVPzqp0%D|!FGW1v{iCxmaz~Ri00Grlvev9uxjv^3I#~J~*65NZF!xgKuc!xVmJZA#V zu(hQ^%v>5Up@Q9o6^_LkB{Jy0-fC z)`XkCC~7fn6*(r35-8z9nh{iS8>#slr5RGH!OJj~fZ^k<2AIYSzk$RXaaP~OyUB1C zt==%mWA@&}9NI-fi&z~&>|WM3TrB*HY6ttggZxDs204&XegOj%f-TPcnl`3vI^9EZ zYw2=#d5eqcciTy0A5=S^XnbqL8@SgGh(X)Cnq;7b=j=^LTAv~llK6_-nUS^>Q|_n| z5b=BsiduJ4LagvN&zT1E;~c7E0&7DM9D=1)sR#Ole|r=>p$>Gxlv&b?xX+m&YDLeT*cR1GTpsq>@yg?&(C}hAlpvT?eylIj`kx%3f>K&3W9BCtZ$7gC7w@{r3%WO1z z2IL@FX&@)_YBZi&O=gDX=||v6H1&lQ&DkX%s;T|f#GCDZD{6<-g~dF*1JtA2Hx?=v8Nxi5IL1co}W&z-a&G4ygT`e z<8QgPOYYwVomLq~GQCOK9tPMnW~+yZn;?vyx_@6sX$aKmR$ zkVvqL$ohkitmP{$P}1PSB!?c4MpPS+V^h9y-5M0U*_4Je<^a2=q8;%z0hyAjRYHbu zD9vj$STJ`=z2z!D>nw9Gj&Odokj7?1nEK-7qcmN>si_R; zM@TwiNL;XKf{dgy_x8b^v8Yb_BH)pS#8{_r8)$wfl!0XI+KkL7QcZ|#1~}8p_6Rzq zEGTedUxz&3JIH!@mQ$4p_z;k}I^wqq--uVho;ck%9k6K&QhPGj>1DyFvJ%V)Q~M4a zZ4JMU)su>P^+Tv|LwCIp)>ZaAmDgGx4WDvTdk}3wr;jR!hTuz-+(#t4VDsXDF{p!_$k=^(O~x+s93|p$f3*k zSeCJRMX=8pFcsbKmZHsT$WSlr!QR_1!fKJVPPh10(~mM%#)e)8h4Ky$ussF+{JyX! za{1nx9cQ^?GYyA&YCGfD8 z11^xD(Y`kafduG|fzra=-gdKq6_9C53|--!J?Bvk;b={g$|!vB@E+S&4P+zkgv`?i zvg}tKbnQ#Do!xqCcA>A)CEV+B&AzZ+3SYhQMPpS4&mQ#E{z$Lc3lEF$FrtOdNL{h- zyR?x%2?at*Xf&ZGR!|^myL}UCAZRys0^WBNTrQU=2<(DAD14xU&Z|r{kao%jwZiDo z4(zN4R1j|Sp64H%*0T3wh48i)2JUY}^@!~QnBEtgm+T@;1d<7qfFP(~pByRRef$xo zbYPvA*5ffL`NbeLF5>n7rMI5NR2x+*a&wOp0s9QlCE*f^N0AOAAx%~hdT$~pe)Ui^ zWVNEV)Okw4w^gyqKXI*AYz8zEygSveY*0FjVtEricghcbL)a8Nh`587+0KVysw}Uq z5c@u{2oez>QYa}zBQ-LhpK~+Jax1%bNvLWw4QRvpa~3C7AFmkWlYCm>D@B&7vcoNA z85+-zTc6o)+vN|0e`mK1Ty@|q?1slb{3sTt08EXI*A!#B=K(S&{h$q1ekEU}lLzUJ@KoZDv1DYKYo^&KYN(5vEC%<=~J|6UZVGU-_ zF9{|dl@=hWDf5Iu593yqF&R>yy2F#NS;pV77yaq0rk0AqZk?<9`@K_+EvhQ{`&Yq= zbICfBOb-_jxgGOw2A>bD;e1%7GU2D19SJaFd<}ysx1D6 z-Fc4t^fc#6HpRS2w0RWpv!eH87;#ey8mI-_&_wL~6`$Jd=TXBOI^tiLynX=4AH*!& z+CjfRdnn@$bx^{CAbjzRntU2+ug@5*3>Z|SmR$5N{CjF?@R_?T(5+1hK@vRH1YuN# z$B;}vYL2&E$gE(=d?~UjdLE+5^-xTek9Dn!GS7_$8y0-^eB3T~E9>NM7j-W!p4y)^ z5w@86&X>O`%T)fH!M{7rNZyw4@8XYC8gyS|+0b}KLU~;kYx6JSzV+G(K*U|;ib4n? zPddMkh2wk~!4x-Ub9Q#Nsm|os9^dNaN>KExVVDdCU;ij-Y=`kIW(1P>S48TU(4LczaR+JX0aYkJ> z18`+Wn)!U}$8s+IO2AU-!{0w?K8q62urLZTX?UGB(izZ*3)*()LsM-G>89lHJuS0W z&BUkP&r)tXbVk}y_y{H17Wc=D7{Hy$3F$hDYoKst_D=%OKrGjW8x3GFf%38nUC=%T z6DD3LJm!;7YMG=sg6Kg5HK??Epn`<;O0{DLI9Q0H==rR!3UwoggOB0$(7@|Tf(oL39fFTfviGucS@ZR&i z*qjH5VrV)C>pySo)(2tu?~1Ph940Lda~ zn6A02LPm@Gn9R+n+nlkU#Mh8024iJH%0wJv*#h5+0(~Om1DJ@dTQDj|r=x27-KiT7 zrCsOGd%0bPkF;A;SRhibM^J7b(4phS5EGRwi!i@#aI4yEEQ#SY!qM86>sBoi zLIQH(1cG22(aKRpgfP@<8~|VuH(?7XU0^U^ov8yY`Lf6v!7XqJ2rp0^IITf864Ot+ ztEg%+nji!nFd)N8igajfO$c$Y2d%);pECu^ZTlq2#Td->LYur`E7Q5_4sH(HyiTKzWF6x7bVNQXsI8IHw~8iXVLskAAGnC|8h@S-qSH zLpsnlp0>u(6e-CF2Rxw84;+qr%@ezg;&8 zHccez<0`0hZYU-Q#~8#*F}ii1aE5`7gg>j7i}aND+TLX`Nf)*6%$Ks3YOxaV-|Y`X zE|ip%nvl?L3U47rC}=m5Zq3wh4|PSs;Nsz&{?QHQdn80eYQ84!i$E{K-|E(_5u9fc z$q~jY#Ijtu$2jrvNUPkd(|T}D#j zg;7%3-$7a!B*6`#C!KX202vL)3Gv7!A!N2JPl<|bxh9ALgrc$_%Gp(S632%wsztMA ziV2E~J7UKfL4w`;S1tjjr@qE^8*KO>h8}J7D?AOEf z9|3PQ zDj^Q;o$Su;_i#ii`qyT28W{jHp)Nch<5I;y2^+8M`$8>j1D2g{n&C6fHuHfFKh8_kXTNlsoVLMcYHgZ1p6d@=v`BG}3b4 z?xR5#2f+^@^)ig+mV3nd^?WWz|4C8q7#gP1u`2!+>P8^wZ4rWUHF&Z|=vtt``vrxzZx5AlzM~5($t$lg%d* zec2&lIpt4>deU-F*t}rwZ!#owNZjfo_tr324nbG93U^0BE=g4_aikpL{Uvu%0> z#5I2qp1cy$WJ2E_#QmRosDsi+)N^(p!#~T<=A8*N2_*s3#XkAX8i`kzbIBgbRDK@X_T-?w6X5 z$kYk)$oU<}d{RFbyES@)-|=Ak{jm4haTy%%G*s%`Zg=Y&;@Pdr>sW@Np+5AXkq<7C zW@YB=PQk+DuhcTI-^T}R8dWp&?>!cIpDmeVyXj!_H4PRg7z~ERHo}5Rh9sYgr z_ndm?v%j;1G)m~_(PotL9=+{|mh3Ern#>C%CbWdcyQKh>LQu3`R1@4}?(wMl!^MIK z`lqE`<$1w@NfNcnLfyD?*W8nk*oSqp3sGl_6dtHwh(qPn1%2EfL2Bye7U?DRu7eEd zSn~9^h15O3v~MrxM0%GKKGEg|(3sCCD+iPpF73>Mk}i}H$?IMK=N@Q`NIXsBuki=x zx(Lo0QM1ITGa=-3{ROWg$CtcW*iJo{f+`yK1cWM{DW^%MEnKCSx1sKGSp-vDQE%$9 z1LK)9qu(hp+6_7oCpr%#g^1%xo#C-o1b)cD(M z*TjA~&k=ElV)exl>dH!2DMykJ%^Jzlvebv(iBbgl#@C8i`%eF~Gh$lqrQbseOOI-4 zAGH`8Vc}_%ukG$bQ<@AODfvL!J=+HaSqUl3c!?vS+ux`jD0AiAwuNe3Ns)S|-tUbF zVqkJc?o3$}$@^cPBqs0SYdm-&%4SX_WPhiTr_|{FRSn-2R-*}QEczr?ahn~ns_#?^I zhcJa)GlZ7+D+q+eWdvfOfFKKZK9C@3nim?a8va~q7xsH=_H1IDl=K{3)g|~5maf!} z`JoZyA0GTU5W~yhF$c2NG{eIbSrXOt+@GI%q9!-&_OvYGQ58GfL-MH?u@zB!!VX2w zXdxFB*C`yZdkn@>{!P?}6g|?-#o&F?93M8d<3j+j?8lOBUx3({jear*Z6*}rKa{8; z_k}&AYLta-B|9A7mu%s_hGf&K-A=0W`>*YdByU5}W_){@(5AmZ%Fo?H(z8p|etv$5 z8(1}Y6!gw<92PVl5IJ}6FMRq>fszYK^nsVPIzGE}#tFDElu!i#MFE43VQ*Es1-|im z1A5S717}Q46Sg2k?Qlz{Ug>22YVrlFFpN=Qm^u}_hw<{07wlS7mTf>{lNhxXjVMlI z7TB_#sSVI*xQ00?d~6|X8pVVzp~9XZZ4VX{eG(_Q+8hhOFuM#`5Yie2#6wFUY>$W- zG_rv#IwcLH2=D|CBnkI@umh8XF*#Bk5W!?HMLJmtWDY&)AF&VHIt9AVcn7&$b)AE> zFn1eY?e>yroYa_ogx{)^Yy=^P;Fh?a4dkNS!6iLw+~5p#XGpVqM5eXUvsqHfASA64 z)`qVg2QKFv`o8|H8_o1GKz(rM)Fk3kLJ)`Q7=t-1NlmCvB4_~xMHkmYZjQO{6O4q| zM_PJ7if#P5tY=VS;jG%;tlPyxeur68+&vImbr^_oG2`X~CvYsFGT=cWY23AsyR8qS zDixDCRSry*Mye$gq>`yfDo6+?$&NVuK#aFeI7o#lP)Zj^p&ab^ zASrOp5cG%IR~0&a;bF(%LKlyL^e<_j1IRmY&^QT%hsZ(;!a_SjRWw39c5;A0X$ng+ zL?VxJok;xOP8&NAyFci0_90~53gGfNws7Sz!*d%@j_}ZGC?LRsH0%%QAf_>bv7Z_H zI{lpS?vy`k-k(Y5;Bd^V5-^3p%Q3w!eb_!ZX9mI;cVObT$lNakNJ&kkf7LW30hXEO zrF>}NqyohNML7c=N(7{|3|okSpere$z5?Tw6mMZ{zvU8f<-}~esJ|BwyI=R?x2(EE zQ4mFo4vfA=jPT~nO)&;iaDUpb0EXqyRHZBIL(bWbdcwg~;k<;(VM3A+gNUTKv?5B+ z762tFz@nwJ!q^j-EJ<75ecOYE*61E&L}BFrHGfysz8qd2^8jb6yr_jcx+PG#)(98| zwcwIBhA!XLKYJ4zVd8=g8@*_%v4j8RP$QO2ZXmV_>J8PH$V5x|9JGjeb#qO;0eVSh z7c7Quq_II|kv)uO^Rq-iQx<@?b4CC^LC_`JQSmzI7vKfv@bclJo}k8wwM4T**i3NG+q?wvys*ic-E2V{~7=Z7y&KA)6|9wDE6`>*s%I%2?#aY{ucd`l2 z)2~cgJQ()>f${Iv#`cI1JO|8ub+P5;4- zoc1{G_I;tG3a{__S2VFdV-oSq_s3hxOajE3fJd3=9i{@0;)0KUh#XZMz?7D*8Rg_| z7$Xd5H6cMv;?o>hLcUZu(3~_RBk@%g7=}FX%B~)CI(|B+v`UFMa>CQ<2n}KH4 z6-^c=sDWq}jQx2){<8D_e-jD7hLF954}>pk4=wYTa-<|>NePkP5Rhli1$KxcncB&( z@hAWSRy?`u>OyoWE=ovB5Q+WcCst>7L^&``#0&z}AQ2%kkO8vD!p@nR23TntvwID#LFJOjheY0u*5-P4#13V!`w)MLT7QjH9YeW;lV~FFuL;Wm z#vwH}57z8%GM8w$Mdk3XQP@ESvEy2~wrvA_I4;(H@MT$m+17`rU#7U=#29Wdn-Dja zx*f|>-BUMTS3;ziP}WoVa({Vi8FL~t0e5nUb{Y|F2$q533JCUf1k;KLabe3B7}Od3 ziZJ_A?qvl_(25US4Kc|Gf=vi3@W<%)0%|DU zlmNn7u^{`gcNeUP6r2W{5U6n~BjK}~N#2d`t_J&kW{tPMu0M|1u5iLvSd!ZIRAEQX zi$sexBk6nn0Qq$8{0HbY`)GXA z?Fs#{Xd-&c)h;O&zU3uZypu}NzAUjY3j!F2@kihi1C5JtEF7h5`Z&4U^zi;EI^*z5 zA_6cHaDlcg65KnBkipV)B5#WovOxg|I@dcw^8I1$QxJJVLB$(FG6+i#ULthI}aQ8|IjuQ2zYVC(*4D?z)?qEEf~)=j_8zwvwYy*Ee`KRU4_y7c0o^16 zRWMIOcJTIGj+3rk5`1cP2(fZO^af?|yMt&PSJ;5*CA>{IjfIp)!3N78Yy^kD1x(q5 zUJ~2}8gzbmlMt%KH|sSc)8}v`X=rTG9X}I3=|^3{j^CxrmM*LKMBIga4Zrq-9-?ug3N-aYQr^f z9?h?|^ST>T>*tO=V#(@+%S`?9K#^)MXufoA)|`9r=kwfkS}&Y?#FWhaPWfN?R(ng^4F7fTbT%%VV?AY zo`Z4>;gJI|`03HJx>&qcYw`edoF5jDfatdfa1b4zC`c(7M#rKR@5Do5tCwY6tiT0! zPmKojq`52kP;b10lHGqKk?O-wx-x#-OZm~?mhit^Mfb%D9Gz2fAts%WEg^&Ax7^Hu zikH;AX>ALl+uAL(D~Ecd!C*cf9mv(t1ZMpxV4}Mu(L*KxB+o<0WCD5|ROWi;65n^H z^&e7O^ZYx*C!H3J`nRT4W}CLkT7g_7EdMlW%ihE(HnJ z4}3IwZh=_*+qgV*KYoYXs~)TJPxI_nWqbhPHskh(mV-3!KLG0WYc9L?Q?sB(*FP z$8W?g4*l@`wBTeh)O!Uhndm+xJ;Ckw(B9>!!jx2?00}j(+-o6lEyOf0p@`-~)0eMQ z^dDksA0emtCa8A`sVgEjeh`t7ZH++cl0zpECR&lBS_qY*v@wHB5XEHVgT)fy%{87} zf-2}RReLQwNG8N$_hwrOq2Ub=tQqjurl=HbwULSjHpWqCaf56JWO*AD&`jk39$}*o z5k?(@QA~dzj_~O0ACdx0;9ahzCiL!28DI#BPi#q-$Oh6KNK|$KWVR)r0jX1XCbZiy ze?-G7X30dw5qdtedNuq!Sz;N>9dn0D^?ZnUj~m&9LIs6prs*}2VgPJFlfPx40{SUA zl{29*;w*t|s0zBFvW1i`1+*&B`#{v;Ru3pGiYh+<5TdL|6C$9JNFV_~2oT7EP@vKX z1qvw;0tG6IEC{TyAu9r=mMROn12#YAI{ciR8VVe3hpxwS@ zfj^&x1Dnj9cZ3Xi;XbZ|dI{cAr`*U2v0P}5%{iyhJn|@|q1TytF>q?MYD3G~LfRi3 zD1XWTLieEvHfS#fM4ZKMt%JDY|D+Ki6753PQYVz8Txe+pZID=bh!Fo( z4u5+(4-)?%5>)8lwt@ZMwY?vH%il&W_}?&t#K16t?1RnR{0cW)eY@8(R1iNL1`y>i zU=L45(imDPlPOUUpa2OoG{zvhVgg{Kjn>KjsNH54Zm%BRi~L=Mw8A7mGVPlHsHzw* z!w6!SnF>;e5lM}tgoL4xNR*1I1?NL8Rsbjxvx;bhCa4N1%MlDhN>Dql|Fyh+KeN^N zch|DtmYZ7+1r@>70V~KDkVw#j2oesHw`Q5Dl7AGPSL*}N47JIju94R3!n$3oNC)Lu zoE-qvb0$+D@MwL0O(Yq5S+at-l;QN_+J19DctK#ob4?@1egdKwllpqwd0vKQCDU;X zGRdHC>Z~GA7CDgAv1U-9k4L6mw#__c$gb?ukqHC_E~!&IkyM6INsJ zQpSIYe^N~t;2WORP1xW20w&yoq%ee>nAj}JfPICH$}LPx$Yz)fwVkmxeao+PHIf@GiVx(d*0~;Cwsr{4?)2b{QW8H&XqK;Z>005Xu9cD3_k$O(Lf{tkv z6%tbs)~15xI?!Qk)C+14%06^~b9xNlzcggffr5IS6MXH-7`U68x|K;a-A9>aYWUL` z6i~tuA`tGLP>QJ^3=@E3S%G~DCc8@jlogR#v&!bKd5QwiLwHkmM>x%~VZd8i&^6A5 zFAjtxeNU4&WLn^zKmZf{0r8n7A*8B~#h5RM%PoCh+zaL0mJ z%&`Fg!Bq*p?r1qw2GJ}&59Ypmxh%EQV)Vpx?TuKWUM6~(s6WemFV)dqJuHhf2!W(A zPOQ5iiW&V&me6ED>+6K9sR3Cx=s0abBaKECRV0WC;5BjfGLj5mj2DkSbb3ZQXeDmJ znhhdNx)ys3uVV@Yl0J*p@Qmy6lF>QoTC*z5R-*rGPI6UCH7w!$$sy`uzc~e>G{mJx zi?)lQeqQ^15bHs7JQk;RUk*smDepCqhY6mjP4I>#ur5H$iz^m#HIfo!V1Pp~Um6j+ zbuReI)ev|WALkI--_#879{`4D6a0X(hKeaxRafLShPqR%FR3jzXhS6W$Y(;F^eyPm zln%jLS`1if=<)|N6W74W`Q%FI-xx6js4zkmy3hlnD*gmkX&6vIgz%K?GYW;1EHYQ} z@QiX*PIr*!+Kkla7e~@surZ|lKNEfrp`#rG8dUNUd>1SKVUy?ht~urjba8eQ)Y(Qy(`u)0Sn*ek9)mNZBK#a2{K=0t>G&neJ9l03x{(;_=4Xrj5`WIngA&0zvAIYqfx%~L`;gs z+=wUG9{&U`r;=YagY~ANV#FH6?J|VU{9fkeA@0}sR+Pk)0?@G`Yl@I3*$VUnEk`F< zb5bGYi4P$f2tyJJozQ+G(pF1dC_^i{;Y)U|J$G=h%5DS!_f6e^edxjkNOq(s@1cM^ zeI5nxP0gwLfp0xubUMkaaSa$p=ZL=DBx+50Goid+rR|pq<$9dM$`BQ6&-yd)ls@=2 z2{wU=E}8-qE)qH35#)>U?^7UbC=5;FO&oiEOLz@~tVY#3-R8jTS+P7z$>-bp-~7R; z8n&4~Ih#;eMGrV$7OghT8F63tZg^4Li?D(0`iW3&#S#v;Ub2>y6BP2xdRmYNn$!=( zHm(#ml@Q^RxKlHeYEzJV_(@1_SPrnJ?}_;gqTtQ+rcEeK`Q|!iXG85W@AX+oSn8I* z`9f|qGffVX13((%U8qvplC-it(&&4K&@<5R8V=C*x5Xas0no<>;vY34E$A(+;)`7l zXf0s3_p*@hLX7Uw_(D~?y~;CC(J}2$Wz0b`^%_F_b*4ZY$(&N0#I=OaGa}dzI|nwZ zJUU?BhC+?eugIjSI0p*_)(@>TA|*JMkVqfy3EiKUM>lV@`%s8*-@)A5YSR*FmU4lF zaB&rAmXa#7DG9>4I8XD(Cp|D+udQP*SDZu;j}yS?Vpc`frA`C?aKgmLGHdTb%hmA z2rHvKFecBO90vn~1gpd+LSQaB`tJ&<^~+IESJF^HX#;D@oY*+0!^M&*r(xS*%LhHk z*Egk`Nu*D3H$;6Phy|vFtvr^FOB|CqKM?oCP(}pa^RAfg$4pbA`u!B4VB-r1nm{sW zJ;H(&Fef0>46CM6H%xdS*5VVang;K`^AC-}HQuc)l07;o2bF;t#p8Uwp90U)JV?=7 zzWrM>ToZbfj#t_IqF^*K=*CSn{|+VFB(q9^6_hat%CVn_HiZyNN}^KWFk!$e2Z}Om z?A7rtF7*QNgvsH8P?t$(0ToX&An+#@elWd5 z&|9}|qg*DTQSKaa_3)2{$3&&jQ37jKLQt8`s0_fN72%(vLjds5TKAq?rNc>m4%%vp zX+r}yb=KoGP&t~Cshh|-T#-i0jT#c8Lyu$C3*6)W5TocFrWP zX^`LGfRF(^{UOD&Dyi(0O6Qzi8qOdeUY%!1QZ^En8Sz+%=?x6! z;cUq)fos=_Zu$@6TpY6@*>~&}xBgO6l*vIlc&7?>V4*Dp3MDMwN_f2b`1 zsPk2=v8f9yZ)D;%&Wl2_Y*r$|^6uOdYjx2R9ef-d$Wri8Lg|?#Eh|_k!PELIBp@bXP zs2i6zOOE8P;glr06DdeuSKv1|+Nmh^jFG0&8-W17)iiqEx`Ekl?c1%31MM~I1n2Mf zkT4_R;kk|!evGIQnUzO)a_EeTU+z!<9v;RoL^*maCJ@$#VqOm0YhtfY33PM|Ey~or zG)X(nq!;S0IqMHwsPZqBueV)6O6eWhO*K_f-gi>r5*hO(ndoQH4R|4RVz)oOO2|rP zE)dzOh5(^ZPpb%MhenJIg0q&krU(O0HR!J93-|EAaRsry9uLm52yo>{d8FjFgwuTu zKX0O(d79**yC_)={3m#wGlP6Jtv__`TEbRBf`5JeQ&+fd{F|_ib^%xH|9u)julB1tmZYSgHgdApk4_fIuL^g1@Lq6eK8*Z(d2nLUj~y zetUguKZmX`V+gVy*MP)|e67S$_!UxB5S0=DMo8CF$T0fhvS2o(udRT2;(6d?i> zN4`lQ9-buL-NWF8;l{kFpRS%;9);#vJCNxwda{tRu>U!Bweh8Wg7O-Q2ecI9mdF$HSj*Gyw8*$v24TUij( zYsb=(W#5qZ$zE!Rfhz zZ5}73Yuv8e9tk5w5sv~J+ZQT24JeF_F_snhMBMWRtHF8_05fxe!fbz(n#3 zVClt_X?peHEMlkUom6i_;#+lHv*WlE>Y%8grnH_i{{MZwO&hq8zAK z1HyJ+ogU8a{B;knLu^Yk}p-d^Q zKUEDpmubPbd2pojBxX4159+Jb-{nYrjY&QE&_=;%fzSse@l52!B+!t?FV6nh5Kcj? z^7R0@eFxl%_+y;rdfjxqmnM-K4j#~T{LmL5F80?)Ngjc54;@H!CeeS9(z=5=yM1yi z<&Md43qot;=7@B`{4Gi%cw!0R83C&r5#5w$TCN02W5U2sVujQJDZ1q=Wdw}m!7v2` z=>#ZBA%mPHJaKKJ0{Rv*CB)F2yuTHFq3)-OLvs{=BzQ)RD$M- z@e_;6UaN22-BolUVJ1WTA|1i0^MVEr6ssb1A(MC038LDSrEp{zb`1(5LS^Xi)b?@Ysu@)3Ao0NQ{1j}Gq+6m`i@1Y;H!TIZxCmVgR{FlafC5&(m< z$J}Oyo^NCvLFZ5vvM*RQ;GYbT#pEo8F~dMig0@ne1-}1zqKdO+nrn({+l+OIY7VmS zGC8A9QuDIA1OyXNe?0nNV9~WAh`U{Y&^fB^{?80m>54} z3>#*vd7etDShL~N2Fxy4?dTyvtg6~+jQ+MIF9q(-%mD>^zT4LF7kwi2fR=|XKOjwB z(va?lshB5LLPGD=cNo2pzoqbcp^PV?xSDosOg&aKE7JLqYoGo|y>zoZL`L6!_r4>(YV%fI12wfP&x9pM$~$D>x3^$(+%;SCPf zcfMz(@y5{g*bYE^;?^bu{)LLLXS(BsA(_*vrAp;o%fM9?ZpVtxNouDc{jY`UeRkNg z6RZ9rWpKwfDbF_$gfqgJ%{E#J?UhTC>tsi>KXUENWx zZmQBz)WKfXK5$^6M-~a(w!4C@9z7DG9#2s*0}x-XTgHyn0?s=&BEaMFGu zzLJOvAbNTEj4R_kP|k;r`R^^AmFzYUqiOPn2M3kLyR;^0wm$s+p-Vn*Zui5Q6Hwd3 z08RBNz`3AbAb~cJxFcXjxDMXrEg@~mp7-J#n_eDp!Pj|6m?v@32(T(Y8@ZAA@fi?! zMOms^1!cWic%YFjsbA#?W!;*@*Rma)s8RNW$#;}^G-z710kmN~@>R4kWi0!sY_EV# z--m4S>E$t@HiEJ5ODtbeA;9ThWfzc05cDghTgMS_S0w|cZF-PBDS3hVC0pBE_+zV= z%2_EdU9{>wQKzk|@C0o)WA;xyF(7@Ln_X2zFy6m1wz0e!5$Lsb45BjT2silZ%U^u* zWn3Ngpy_Jb3LB-jT?STc@1&}rTpdQk*joI&?ch`|bfSZzE;*cI1||$QNCk*vwIQeB z#7N&>{q$-EAkHNSV%2*4T4!b?^o1QMz)*vI2QWJUXJ9)LLvc*7F4#exIy#n4`d11< zG@2MP6>IkWk8Ea0$)P~^ZdoKdqm2J(Crb57Sl7YMYDd&{3Y0evz85jA`I;w9 z(TlJU8j|YopA$|s{Rzi}UVSDuDgF>|5oOBmcR^iGS~I)Fw@&PqN(B@Q3UZcKl0rc@{9`6b?~S z+i$45Ne@jKBnWy&jjr@kLfqRa!ejUj^CE{d4+wBznM_X$R^gH`{r1-;W4d$9<7tI= zpSR9>3=S<`#1)wZ<-Os`1sb$um93E%K)M`!@gFcq+)vaR(>T=R9L|0Cp=R{D|4xr} z4Fg+xv7zuXesEHQ7PP0)`Wd?=I5FtOZ6o&MPvf#@g8@f49i6_@R+}4cL=|i7;o79C z0Awq24ala0jlGe_>^BExcViGp36^5_`{w0Sz>&^7>S&t4f5KLMe{3w`L@eb4=X58z z3PP+Z=pX8P<+r1Zn9#$)G5Mzfykzs$f6)!?b`b3CvV^x2`VR%wd#p0DSIe#Pg0XjT@Gt+_NE1u9y4e|f(K+ZGfI5Fe(sTBNdj@T7k=}r zMZTrtd}~%D87>Dj9sC5l*+G3mU^`&aSO|PVl3TD!M}^cCpV4srArbxfLSwNBIBqWv zBZ&!0HS3K19Y4?lh8*z6o!i5nB&anY3^)Pg;y)M=VXcTVN<1d-ZTs>4$rusij+?=f zQwkklI0r44(uR#lrO3~WL%Cp}xCL^E6(Hq(ZVB8pyK8eua2RHncoU6r;VC^1Mu>Tm zV7Nf37!#6EXV5l>h##usIEB{#+8a?Hkg&BE!E-&x9ZZ=Y73_ZiIU#Kdm1hw8e#w#Byw)eia31ynsyrw?+5`^uNAEyeq#>py z`Hag}$z(B%v^WP86(9ytMC+n?ltwU{QRu85SxO{-FYS{2h&YBdbkyGZn4fjQq$GOp zF2ULyNP33{n9Qoe-MOC%0Ztt=ae1xPiR~$akHw@2E%MwqIK0sDxjwW5_F=Tt787j@bT;OQl^yr^znS; zB|qu}<*1nu9FXM}z{dRv*7h>h+0`LlH77bkqHjWc?0PnQWHRyb6x7H3!b+j8IO=Oi zMdT*A&CVYSf)tpND@sC#gVD(@z~&dd&6`pSH=nUn!oAzQ zsmxZGkFES?w0HQhq4p8&Cnq0BN)uz=5TUkEF?yj;(?ojyK4#R0llKxAFJzaf5<>0o z6gyM83;f9D@0$K;dcCX|` zi!uUP9R}>&f}OZ6Y%(I%z_k0X3tp&UxL2JhUcX8Z&C}?Izi4evE1m?GeGG_VLMUqs zry$}DX#z_aP`_Z#xvVB_|C~1NisBgO;tgHQRS?B0ek_^Sb!#3F>*xh!Jrf6xp!QDy z?eiL1J?VJqW&YX_Ka#RLh?<=axk8*F!8nHbK#P1xNal}V%CdaO4|QV1E>90Kjh||I zjuFe**60)F)*lrE8>rPTghmF9$T=ONc0!0HodvPsI}`nWV-_5$Df&_!vhJdGM#2QE zXD6VJjZt}p1{$-f;C};$5d6uGQ4@+`>^P2A4~RFrm83C5*Rr2qm9<1dYwMxz3eeyU zzQ|Y2+L-(cIna~$59l5v5ht5-VY3f!7e11LecGJTz0X8D!hS8c49iD|G;qS;a;o!w&9AYh6 z?k(?Zpasw#M(@C?g2kPekXQ83c#Fstr#bNkS6V>v!TS2S>#Bf!szbu*d+#q%r|R7&rhn_#o@L>RBQE{qnBLt_T94vv?tHz zg<67oMKKIk4hdl`AuLbB2PD0l_u8)))VJj5-jt}Z$ozZ#j;04~-NM`GIUwGbr-0G( ziOP~~L|4J4ZEAky@#)SfJ11sELGp2K{)tI!0#Wx0_1|{HwTnA8|0E!r!MatJu z+vs^Ao|p4|WbH(Qn)4S;m=X_{P(&NkB5^y_=7m>d%Z?ZTa{>&O=F7v7eXN3Xxgpqt z@A8^RrZ8>-tEzGOg}^``B}d1WUtdcL!k19uT%%!Mvnhv1TLK~qnraJn1=ECRPTXf9H#vkNomP@#7iOE_^)an9 zDRfnYpRIp{yS1l5l@E`UD(p;Wq|jQMk_fmY-PO%i(E8<2KM&#?M}L}=kCo-pE#CAq z=9M;eAvoC)ivgUJ!x6r2K@$UFyYiw4b?c-t7FaDwhS}&gqs_N)bplP?wqHjNw2QD7 z0MVy&R(cs^rfAH7M$vxIoFwk^zW%2c_?hE|W{z{L^#T*!Y4Yqbiy=pA(BgT=pW zwM)Kkb@29mD3Lw=Jv63UGF&>)_fMoS^c34Vud6LfSFZuN(9nwhLy#7mA?mGQr!o$x z9xjCB6tL{H>N5tk9*{iM0^oQ=_|QIZMEs~7sbeR5o{^HoXvysan%RN+8MTr!ucOPI zqv+EpPHDEogEhFgHq|zS!v!;xJtZbUSMZw+e$}YXbhwNCMp1vtLc`Yo2HSt%i(jfi zvMP!4_JN;GeYb#}NQoBp_Ivt0r%=cPpHeIO%2f2!oI{I9x>I^LjnrnCN#L3$CTJ*~ znGeIQC*6hbtV86y?7?zFyGHO#g`hsDQWPYs7<{D20aL$wv zvCRy90<`o#wH&%xspA3scul{x4dCzs`z{20LO}xf+&5b-YJWgB{d9lH_Br)sv&O_q zerH3}<9`wkxp5&)+8p#v9qGg7vv3Rgn768)FSn(pC718 z3tSN1hqZxrp+9@}hBa2>bT4!Gg5^}M_$WQI>H5#sNF8Vkh`nR8V`)^fl}+m6-D~BZ ztU+3!!3uftivfPp@TxsLXqhn% zXnKM9kta(7wrrtJK<22HXGPDSxRmE1aW^6Crs33QL#+%+;dONclfd>uud66gv^DJB zCl83_`V%gw$cpGK!#t5H5J9B}-idyom$*J1wNCXy=DR<$4k5e5@VfL2oRS`%h*tAT zziyM3RB73Cp+lhhxia7;EXq{SjC#qbcK=<)P>RT&lIF&9JzG z;DV(So`0u?jK0xl35Lt%26DiIVjk%?jY*T?{l}ixU(_ZHX<}S3{$kHX2t&Uy`pPy} z8tqxgU7K2N^gY$Ggq!uYtt*-fC{K#MWQ*Pm;ktyWu&2=8OlC9J;3iWbI>SuY-L!8)$KonTKK*YZx9>N|qZqgVXd+gfLvVhNS(WK@IW#LsiZFye$;@gQ1lc5bjKwLIF=CHG- zGqDkEEnWB4=CU&W~vI<~(OYa=L2yd)MCCm5Q%{IL$A>{DM84hc>jz}_@jZ@@+;635$wQ{@v~_0BU! zpB{jpqkdDybA+H`e_Kl%O3=3R_MR<)tcR#Y3Fcvz0NB65eBe(--GL1@(%zNKg_Jn; z+bV9C(iLmt1|~W78-avB1;U2S6kB#=4%)S4-@=FY)|L5}(|K{!dP$J$#V!EQz}^E$ zH87r0e)R5F7l3p3kf$@U-qX#^iuI6 z8@QQ4=Jn0~?fN{}lZfi*bhR@C9>C;nX9oI9?1rE7QZl2u4?UTU2P9FBFO}^G)ds&A zn}K>e^yZoREj?I*P!dR&%%FS9_H=4JAhD~aoS(v|l`yErK}X|p*`7H7nsGfJsW=V@ zX_SYUDrHaV98RgA_uPiDTd;x?qeW^D9&#E{S2{g*@m0LxPv_c*H=y^Kbl*D_+SBg? zOhJ=IWk;!JZCd0S`|zU>HV3<7DWKAmY&#|C1upvPY4O9G-dMAVen^4;nxjXNY0nE= z8nF12Xea93-ot)X#2-z%3W;ft?YD2#MK%G?wxMfk1gP6)EEkYc5oPo3R;zK4&sB*r z7im&$1Slmz$TI^5I0Heapik9;%Vs^TZKbMut|`bWAe4#`7(m-5K8Y$tBsblaq|gTB zv0v3?!4?f?2NH-+6QPx>Q;kU|OjD8kyDf7>1XAW$4ax|dJ&+pKS!!EvbDe(Be z1|R6!_(+sv3{yvAvf;)*a{BNB=BPEltpmmXp

6th@yD7cijd^SGtc_%0xH*;oxC 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�m@=oD4<8y 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 literal 190538 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�>@k)dpd6fwKZ-3`Nsl~y9Dy}Lj{Z;fp@Dzz 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�Bz`*Yl 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 jR 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 From 3f07fed2773ff2198eeb1ce2f665aa4daf395878 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Tue, 9 May 2023 10:38:30 -0400 Subject: [PATCH 12/17] Early exit if no plots need adjustment during resize --- srcts/src/components/_shinyResizeObserver.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index 749206b77..14e7bdcdc 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -94,6 +94,11 @@ class ShinyResizeObserver { }); // set plot images to 100% width temporarily during the transition + const needsPlotAdjustment = entry.target.querySelector( + '.shiny-plot-output img:not([width="100%"])' + ); + if (!needsPlotAdjustment) continue; + entry.target .querySelectorAll( '.shiny-plot-output img:not([width="100%"])' From 525babc81c619826d67a0fad75ef37871ce2f27b Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Tue, 9 May 2023 10:39:34 -0400 Subject: [PATCH 13/17] yarn build --- inst/components/sidebar.min.js | 2 +- inst/components/sidebar.min.js.map | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inst/components/sidebar.min.js b/inst/components/sidebar.min.js index 9b030c04b..766264e9f 100644 --- a/inst/components/sidebar.min.js +++ b/inst/components/sidebar.min.js @@ -1,3 +1,3 @@ /*! bslib 0.4.2.9000 | (c) 2012-2023 RStudio, PBC. | License: MIT + file LICENSE */ -"use strict";(()=>{var p=window.Shiny?Shiny.InputBinding:class{};function g(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&(r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let n=o.shinyResizeObserver;n&&n!==this||(o.shinyResizeObserver=this,d(o),i.push(o))}),r.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o.setAttribute("width","100%")}))})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){this.resizeObserverEntries.forEach(e=>{document.body.contains(e)||this.unobserve(e)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new s(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(n){return n=n?n.parentElement:null,n&&n.classList.contains("main")&&(n=n.parentElement),n&&n.classList.contains(s.classes.LAYOUT)?n:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(n,y){n.style.setProperty("--bslib-sidebar-counter",y.toString());let h=n.classList.contains("sidebar-right")?d.right++:d.left++;n.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var b=class extends p{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};g(b,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); +"use strict";(()=>{var g=window.Shiny?Shiny.InputBinding:class{};function y(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let n of e)!(n.target instanceof HTMLElement)||!n.target.querySelector(".shiny-bound-output")||(n.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:r}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let d=o.shinyResizeObserver;d&&d!==this||(o.shinyResizeObserver=this,r(o),i.push(o))}),!n.target.querySelector('.shiny-plot-output img:not([width="100%"])'))||n.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o.setAttribute("width","100%")})})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){this.resizeObserverEntries.forEach(e=>{document.body.contains(e)||this.unobserve(e)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(n=>new s(n))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",n=>{n.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function n(r){return r=r?r.parentElement:null,r&&r.classList.contains("main")&&(r=r.parentElement),r&&r.classList.contains(s.classes.LAYOUT)?r:null}let b=[e],o=n(e);for(;o;)b.unshift(o),o=n(o);let l={left:0,right:0};b.forEach(function(r,d){r.style.setProperty("--bslib-sidebar-counter",d.toString());let h=r.classList.contains("sidebar-right")?l.right++:l.left++;r.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,n=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=n?"open":"close"),!(n&&e==="close"||!n&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var p=class extends g{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};y(p,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); //# sourceMappingURL=sidebar.min.js.map diff --git a/inst/components/sidebar.min.js.map b/inst/components/sidebar.min.js.map index f51e103a0..79f5b31ef 100644 --- a/inst/components/sidebar.min.js.map +++ b/inst/components/sidebar.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../srcts/src/components/_utils.ts", "../../srcts/src/components/_shinyResizeObserver.ts", "../../srcts/src/components/sidebar.ts"], - "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know to trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n });\n\n // set plot images to 100% width temporarily during the transition\n entry.target\n .querySelectorAll(\n '.shiny-plot-output img:not([width=\"100%\"])'\n )\n .forEach((el) => {\n el.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n this.resizeObserverEntries.forEach((el) => {\n if (!document.body.contains(el)) this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], - "mappings": "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", + "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know to trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n });\n\n // set plot images to 100% width temporarily during the transition\n const needsPlotAdjustment = entry.target.querySelector(\n '.shiny-plot-output img:not([width=\"100%\"])'\n );\n if (!needsPlotAdjustment) continue;\n\n entry.target\n .querySelectorAll(\n '.shiny-plot-output img:not([width=\"100%\"])'\n )\n .forEach((el) => {\n el.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n this.resizeObserverEntries.forEach((el) => {\n if (!document.body.contains(el)) this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], + "mappings": "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", "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "ShinyResizeObserver", "entries", "resizeEvent", "resized", "entry", "el", "binding", "onResize", "owner", "idxEl", "_Sidebar", "container", "initScript", "el", "flushResizeObserver", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "isClosed", "Sidebar", "ShinyResizeObserver", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] } From b23950596ff9bc3e26a18a66787bdd88b2b34c22 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Tue, 9 May 2023 14:10:33 -0400 Subject: [PATCH 14/17] mark owner only once --- srcts/src/components/_shinyResizeObserver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index 14e7bdcdc..009c8d516 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -85,7 +85,7 @@ class ShinyResizeObserver { const owner = (el as any).shinyResizeObserver; if (owner && owner !== this) return; // mark this output as owned by this shinyResizeObserver instance - (el as any).shinyResizeObserver = this; + if (!owner) (el as any).shinyResizeObserver = this; // trigger immediate resizing of outputs with a resize method onResize(el); From cbe9cd8cbe9a7f0b80c2781ffe7a817bcf5e0639 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Tue, 9 May 2023 14:11:16 -0400 Subject: [PATCH 15/17] Handle plot image width within `.shiny-bound-output` visitor --- srcts/src/components/_shinyResizeObserver.ts | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index 009c8d516..76f4bc2cd 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -91,20 +91,13 @@ class ShinyResizeObserver { onResize(el); // only once per output and resize event resized.push(el); - }); - - // set plot images to 100% width temporarily during the transition - const needsPlotAdjustment = entry.target.querySelector( - '.shiny-plot-output img:not([width="100%"])' - ); - if (!needsPlotAdjustment) continue; - entry.target - .querySelectorAll( - '.shiny-plot-output img:not([width="100%"])' - ) - .forEach((el) => { - el.setAttribute("width", "100%"); + // set plot images to 100% width temporarily during the transition + if (!el.classList.contains("shiny-plot-output")) return; + const img = el.querySelector( + 'img:not([width="100%"]])' + ); + if (img) img.setAttribute("width", "100%"); }); } }); From 66e4057ffce156d4e5711c44541b5362eed04418 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Tue, 9 May 2023 14:11:33 -0400 Subject: [PATCH 16/17] yarn build --- inst/components/sidebar.min.js | 2 +- inst/components/sidebar.min.js.map | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/inst/components/sidebar.min.js b/inst/components/sidebar.min.js index 766264e9f..7c769211d 100644 --- a/inst/components/sidebar.min.js +++ b/inst/components/sidebar.min.js @@ -1,3 +1,3 @@ /*! bslib 0.4.2.9000 | (c) 2012-2023 RStudio, PBC. | License: MIT + file LICENSE */ -"use strict";(()=>{var g=window.Shiny?Shiny.InputBinding:class{};function y(u,e){window.Shiny&&Shiny.inputBindings.register(new u,"bslib."+e)}var c=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let n of e)!(n.target instanceof HTMLElement)||!n.target.querySelector(".shiny-bound-output")||(n.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:r}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let d=o.shinyResizeObserver;d&&d!==this||(o.shinyResizeObserver=this,r(o),i.push(o))}),!n.target.querySelector('.shiny-plot-output img:not([width="100%"])'))||n.target.querySelectorAll('.shiny-plot-output img:not([width="100%"])').forEach(o=>{o.setAttribute("width","100%")})})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){this.resizeObserverEntries.forEach(e=>{document.body.contains(e)||this.unobserve(e)})}};var s=class{constructor(e){if(s.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),s.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(s.classes.COLLAPSE)}static getInstance(e){return s.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){s.onReadyScheduled||(s.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{s.initCollapsibleAll(!1)}));return}let t=`.${s.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&s.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(n=>new s(n))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",n=>{n.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${s.classes.LAYOUT}> .main > .${s.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function n(r){return r=r?r.parentElement:null,r&&r.classList.contains("main")&&(r=r.parentElement),r&&r.classList.contains(s.classes.LAYOUT)?r:null}let b=[e],o=n(e);for(;o;)b.unshift(o),o=n(o);let l={left:0,right:0};b.forEach(function(r,d){r.style.setProperty("--bslib-sidebar-counter",d.toString());let h=r.classList.contains("sidebar-right")?l.right++:l.left++;r.style.setProperty("--bslib-sidebar-overlap-counter",h.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,n=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=n?"open":"close"),!(n&&e==="close"||!n&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(s.classes.TRANSITIONING),t.classList.toggle(s.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(s.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=s;a.shinyResizeObserver=new c,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var p=class extends g{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};y(p,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); +"use strict";(()=>{var g=window.Shiny?Shiny.InputBinding:class{};function y(b,e){window.Shiny&&Shiny.inputBindings.register(new b,"bslib."+e)}var u=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let s=o.shinyResizeObserver;if(s&&s!==this||(s||(o.shinyResizeObserver=this),d(o),i.push(o),!o.classList.contains("shiny-plot-output")))return;let c=o.querySelector('img:not([width="100%"]])');c&&c.setAttribute("width","100%")})})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){this.resizeObserverEntries.forEach(e=>{document.body.contains(e)||this.unobserve(e)})}};var n=class{constructor(e){if(n.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),n.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(n.classes.COLLAPSE)}static getInstance(e){return n.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){n.onReadyScheduled||(n.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{n.initCollapsibleAll(!1)}));return}let t=`.${n.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&n.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new n(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${n.classes.LAYOUT}> .main > .${n.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(s){return s=s?s.parentElement:null,s&&s.classList.contains("main")&&(s=s.parentElement),s&&s.classList.contains(n.classes.LAYOUT)?s:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(s,c){s.style.setProperty("--bslib-sidebar-counter",c.toString());let f=s.classList.contains("sidebar-right")?d.right++:d.left++;s.style.setProperty("--bslib-sidebar-overlap-counter",f.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(n.classes.TRANSITIONING),t.classList.toggle(n.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(n.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=n;a.shinyResizeObserver=new u,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var p=class extends g{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};y(p,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); //# sourceMappingURL=sidebar.min.js.map diff --git a/inst/components/sidebar.min.js.map b/inst/components/sidebar.min.js.map index 79f5b31ef..ec33dade6 100644 --- a/inst/components/sidebar.min.js.map +++ b/inst/components/sidebar.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../srcts/src/components/_utils.ts", "../../srcts/src/components/_shinyResizeObserver.ts", "../../srcts/src/components/sidebar.ts"], - "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know to trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n });\n\n // set plot images to 100% width temporarily during the transition\n const needsPlotAdjustment = entry.target.querySelector(\n '.shiny-plot-output img:not([width=\"100%\"])'\n );\n if (!needsPlotAdjustment) continue;\n\n entry.target\n .querySelectorAll(\n '.shiny-plot-output img:not([width=\"100%\"])'\n )\n .forEach((el) => {\n el.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n this.resizeObserverEntries.forEach((el) => {\n if (!document.body.contains(el)) this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], - "mappings": "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", - "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "ShinyResizeObserver", "entries", "resizeEvent", "resized", "entry", "el", "binding", "onResize", "owner", "idxEl", "_Sidebar", "container", "initScript", "el", "flushResizeObserver", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "isClosed", "Sidebar", "ShinyResizeObserver", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] + "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know to trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n if (!owner) (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n\n // set plot images to 100% width temporarily during the transition\n if (!el.classList.contains(\"shiny-plot-output\")) return;\n const img = el.querySelector(\n 'img:not([width=\"100%\"]])'\n );\n if (img) img.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n this.resizeObserverEntries.forEach((el) => {\n if (!document.body.contains(el)) this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], + "mappings": "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", + "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "ShinyResizeObserver", "entries", "resizeEvent", "resized", "entry", "el", "binding", "onResize", "owner", "img", "idxEl", "_Sidebar", "container", "initScript", "el", "flushResizeObserver", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "isClosed", "Sidebar", "ShinyResizeObserver", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] } From 9be14c6612797f32b4fdf9de807c299711f2eab9 Mon Sep 17 00:00:00 2001 From: Garrick Aden-Buie Date: Tue, 9 May 2023 14:14:12 -0400 Subject: [PATCH 17/17] fix typo in selector --- inst/components/sidebar.min.js | 2 +- inst/components/sidebar.min.js.map | 4 ++-- srcts/src/components/_shinyResizeObserver.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/inst/components/sidebar.min.js b/inst/components/sidebar.min.js index 7c769211d..92990fe57 100644 --- a/inst/components/sidebar.min.js +++ b/inst/components/sidebar.min.js @@ -1,3 +1,3 @@ /*! bslib 0.4.2.9000 | (c) 2012-2023 RStudio, PBC. | License: MIT + file LICENSE */ -"use strict";(()=>{var g=window.Shiny?Shiny.InputBinding:class{};function y(b,e){window.Shiny&&Shiny.inputBindings.register(new b,"bslib."+e)}var u=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let s=o.shinyResizeObserver;if(s&&s!==this||(s||(o.shinyResizeObserver=this),d(o),i.push(o),!o.classList.contains("shiny-plot-output")))return;let c=o.querySelector('img:not([width="100%"]])');c&&c.setAttribute("width","100%")})})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){this.resizeObserverEntries.forEach(e=>{document.body.contains(e)||this.unobserve(e)})}};var n=class{constructor(e){if(n.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),n.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(n.classes.COLLAPSE)}static getInstance(e){return n.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){n.onReadyScheduled||(n.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{n.initCollapsibleAll(!1)}));return}let t=`.${n.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&n.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new n(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${n.classes.LAYOUT}> .main > .${n.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(s){return s=s?s.parentElement:null,s&&s.classList.contains("main")&&(s=s.parentElement),s&&s.classList.contains(n.classes.LAYOUT)?s:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(s,c){s.style.setProperty("--bslib-sidebar-counter",c.toString());let f=s.classList.contains("sidebar-right")?d.right++:d.left++;s.style.setProperty("--bslib-sidebar-overlap-counter",f.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(n.classes.TRANSITIONING),t.classList.toggle(n.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(n.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=n;a.shinyResizeObserver=new u,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var p=class extends g{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};y(p,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); +"use strict";(()=>{var g=window.Shiny?Shiny.InputBinding:class{};function y(b,e){window.Shiny&&Shiny.inputBindings.register(new b,"bslib."+e)}var u=class{constructor(){this.resizeObserverEntries=[],this.resizeObserver=new ResizeObserver(e=>{let t=new Event("resize");if(window.dispatchEvent(t),!window.Shiny)return;let i=[];for(let r of e)r.target instanceof HTMLElement&&r.target.querySelector(".shiny-bound-output")&&r.target.querySelectorAll(".shiny-bound-output").forEach(o=>{if(i.includes(o))return;let{binding:l,onResize:d}=$(o).data("shinyOutputBinding");if(!l||!l.resize)return;let s=o.shinyResizeObserver;if(s&&s!==this||(s||(o.shinyResizeObserver=this),d(o),i.push(o),!o.classList.contains("shiny-plot-output")))return;let c=o.querySelector('img:not([width="100%"])');c&&c.setAttribute("width","100%")})})}observe(e){this.resizeObserver.observe(e),this.resizeObserverEntries.push(e)}unobserve(e){let t=this.resizeObserverEntries.indexOf(e);t<0||(this.resizeObserver.unobserve(e),this.resizeObserverEntries.splice(t,1))}flush(){this.resizeObserverEntries.forEach(e=>{document.body.contains(e)||this.unobserve(e)})}};var n=class{constructor(e){if(n.instanceMap.set(e,this),this.layout={container:e,main:e.querySelector(":scope > .main"),sidebar:e.querySelector(":scope > .sidebar"),toggle:e.querySelector(":scope > .collapse-toggle")},!this.layout.toggle)throw new Error("Tried to initialize a non-collapsible sidebar.");this._initEventListeners(),this._initSidebarCounters(),this._initDesktop(),n.shinyResizeObserver.observe(this.layout.main),e.removeAttribute("data-bslib-sidebar-init");let t=e.querySelector(":scope > script[data-bslib-sidebar-init]");t&&e.removeChild(t)}get isClosed(){return this.layout.container.classList.contains(n.classes.COLLAPSE)}static getInstance(e){return n.instanceMap.get(e)}static initCollapsibleAll(e=!0){if(document.readyState==="loading"){n.onReadyScheduled||(n.onReadyScheduled=!0,document.addEventListener("DOMContentLoaded",()=>{n.initCollapsibleAll(!1)}));return}let t=`.${n.classes.LAYOUT}[data-bslib-sidebar-init]`;if(!document.querySelector(t))return;e&&n.shinyResizeObserver.flush(),document.querySelectorAll(t).forEach(r=>new n(r))}_initEventListeners(){var i;let{sidebar:e,toggle:t}=this.layout;t.addEventListener("click",r=>{r.preventDefault(),this.toggle("toggle")}),(i=t.querySelector(".collapse-icon"))==null||i.addEventListener("transitionend",()=>{this._finalizeState(),$(e).trigger("toggleCollapse.sidebarInputBinding")})}_initSidebarCounters(){let{container:e}=this.layout,t=`.${n.classes.LAYOUT}> .main > .${n.classes.LAYOUT}:not([data-bslib-sidebar-open="always"])`;if(!(e.querySelector(t)===null))return;function r(s){return s=s?s.parentElement:null,s&&s.classList.contains("main")&&(s=s.parentElement),s&&s.classList.contains(n.classes.LAYOUT)?s:null}let o=[e],l=r(e);for(;l;)o.unshift(l),l=r(l);let d={left:0,right:0};o.forEach(function(s,c){s.style.setProperty("--bslib-sidebar-counter",c.toString());let f=s.classList.contains("sidebar-right")?d.right++:d.left++;s.style.setProperty("--bslib-sidebar-overlap-counter",f.toString())})}_initDesktop(){var i;let{container:e}=this.layout;if(((i=e.dataset.bslibSidebarOpen)==null?void 0:i.trim())!=="desktop")return;window.getComputedStyle(e).getPropertyValue("--bslib-sidebar-js-init-collapsed").trim()==="true"&&this.toggle("close")}toggle(e){typeof e=="undefined"&&(e="toggle");let{container:t,sidebar:i}=this.layout,r=this.isClosed;if(["open","close","toggle"].indexOf(e)===-1)throw new Error(`Unknown method ${e}`);e==="toggle"&&(e=r?"open":"close"),!(r&&e==="close"||!r&&e==="open")&&(e==="open"&&(i.hidden=!1),t.classList.add(n.classes.TRANSITIONING),t.classList.toggle(n.classes.COLLAPSE))}_finalizeState(){let{container:e,sidebar:t,toggle:i}=this.layout;e.classList.remove(n.classes.TRANSITIONING),t.hidden=this.isClosed,i.ariaExpanded=this.isClosed?"false":"true"}},a=n;a.shinyResizeObserver=new u,a.classes={LAYOUT:"bslib-sidebar-layout",COLLAPSE:"sidebar-collapsed",TRANSITIONING:"transitioning"},a.onReadyScheduled=!1,a.instanceMap=new WeakMap;var p=class extends g{find(e){return $(e).find(`.${a.classes.LAYOUT} > .bslib-sidebar-input`)}getValue(e){let t=a.getInstance(e.parentElement);return t?t.isClosed:!1}setValue(e,t){let i=t?"open":"close";this.receiveMessage(e,{method:i})}subscribe(e,t){$(e).on("toggleCollapse.sidebarInputBinding",function(i){t(!0)})}unsubscribe(e){$(e).off(".sidebarInputBinding")}receiveMessage(e,t){let i=a.getInstance(e.parentElement);i&&i.toggle(t.method)}};y(p,"sidebar");window.bslib=window.bslib||{};window.bslib.Sidebar=a;})(); //# sourceMappingURL=sidebar.min.js.map diff --git a/inst/components/sidebar.min.js.map b/inst/components/sidebar.min.js.map index ec33dade6..82c5f6e30 100644 --- a/inst/components/sidebar.min.js.map +++ b/inst/components/sidebar.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../srcts/src/components/_utils.ts", "../../srcts/src/components/_shinyResizeObserver.ts", "../../srcts/src/components/sidebar.ts"], - "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know to trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n if (!owner) (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n\n // set plot images to 100% width temporarily during the transition\n if (!el.classList.contains(\"shiny-plot-output\")) return;\n const img = el.querySelector(\n 'img:not([width=\"100%\"]])'\n );\n if (img) img.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n this.resizeObserverEntries.forEach((el) => {\n if (!document.body.contains(el)) this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], - "mappings": "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", + "sourcesContent": ["import type { HtmlDep } from \"rstudio-shiny/srcts/types/src/shiny/render\";\n\nimport type { InputBinding as InputBindingType } from \"rstudio-shiny/srcts/types/src/bindings/input\";\n\n// Exclude undefined from T\ntype NotUndefined = T extends undefined ? never : T;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst InputBinding = (\n window.Shiny ? Shiny.InputBinding : class {}\n) as typeof InputBindingType;\n\nfunction registerBinding(\n inputBindingClass: new () => InputBindingType,\n name: string\n): void {\n if (window.Shiny) {\n Shiny.inputBindings.register(new inputBindingClass(), \"bslib.\" + name);\n }\n}\n\n// Return true if the key exists on the object and the value is not undefined.\n//\n// This method is mainly used in input bindings' `receiveMessage` method.\n// Since we know that the values are sent by Shiny via `{jsonlite}`,\n// then we know that there are no `undefined` values. `null` is possible, but not `undefined`.\nfunction hasDefinedProperty<\n Prop extends keyof X,\n X extends { [key: string]: any }\n>(\n obj: X,\n prop: Prop\n): obj is X & { [key in NonNullable]: NotUndefined } {\n return (\n Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined\n );\n}\n\n// TODO: Shiny should trigger resize events when the output\n// https://github.com/rstudio/shiny/pull/3682\nfunction doWindowResizeOnElementResize(el: HTMLElement): void {\n if ($(el).data(\"window-resize-observer\")) {\n return;\n }\n const resizeEvent = new Event(\"resize\");\n const ro = new ResizeObserver(() => {\n window.dispatchEvent(resizeEvent);\n });\n ro.observe(el);\n $(el).data(\"window-resize-observer\", ro);\n}\n\nexport {\n InputBinding,\n registerBinding,\n hasDefinedProperty,\n doWindowResizeOnElementResize,\n};\nexport type { HtmlDep };\n", "/**\n * A resize observer that ensures Shiny outputs resize during or just after\n * their parent container size changes. Useful, in particular, for sidebar\n * transitions or for full-screen card transitions.\n *\n * @class ShinyResizeObserver\n * @typedef {ShinyResizeObserver}\n */\nclass ShinyResizeObserver {\n /**\n * The actual ResizeObserver instance.\n * @private\n * @type {ResizeObserver}\n */\n private resizeObserver: ResizeObserver;\n /**\n * An array of elements that are currently being watched by the Resize\n * Observer.\n *\n * @details\n * We don't currently have lifecycle hooks that allow us to unobserve elements\n * when they are removed from the DOM. As a result, we need to manually check\n * that the elements we're watching still exist in the DOM. This array keeps\n * track of the elements we're watching so that we can check them later.\n * @private\n * @type {HTMLElement[]}\n */\n private resizeObserverEntries: HTMLElement[];\n\n /**\n * Watch containers for size changes and ensure that Shiny outputs and\n * htmlwidgets within resize appropriately.\n *\n * @details\n * The ShinyResizeObserver is used to watch the containers, such as Sidebars\n * and Cards for size changes, in particular when the sidebar state is toggled\n * or the card body is expanded full screen. It performs two primary tasks:\n *\n * 1. Dispatches a `resize` event on the window object. This is necessary to\n * ensure that Shiny outputs resize appropriately. In general, the window\n * resizing is throttled and the output update occurs when the transition\n * is complete.\n * 2. If an output with a resize method on the output binding is detected, we\n * directly call the `.onResize()` method of the binding. This ensures that\n * htmlwidgets transition smoothly. In static mode, htmlwidgets does this\n * already.\n *\n * @note\n * This resize observer also handles race conditions in some complex\n * fill-based layouts with multiple outputs (e.g., plotly), where shiny\n * initializes with the correct sizing, but in-between the 1st and last\n * renderValue(), the size of the output containers can change, meaning every\n * output but the 1st gets initialized with the wrong size during their\n * renderValue(). Then, after the render phase, shiny won't know to trigger a\n * resize since all the widgets will return to their original size (and thus,\n * Shiny thinks there isn't any resizing to do). The resize observer works\n * around this by ensuring that the output is resized whenever its container\n * size changes.\n * @constructor\n */\n constructor() {\n this.resizeObserverEntries = [];\n this.resizeObserver = new ResizeObserver((entries) => {\n const resizeEvent = new Event(\"resize\");\n window.dispatchEvent(resizeEvent);\n\n // the rest of this callback is only relevant in Shiny apps\n if (!window.Shiny) return;\n\n const resized = [] as HTMLElement[];\n\n for (const entry of entries) {\n if (!(entry.target instanceof HTMLElement)) continue;\n if (!entry.target.querySelector(\".shiny-bound-output\")) continue;\n\n entry.target\n .querySelectorAll(\".shiny-bound-output\")\n .forEach((el) => {\n if (resized.includes(el)) return;\n\n const { binding, onResize } = $(el).data(\"shinyOutputBinding\");\n if (!binding || !binding.resize) return;\n\n // if this output is owned by another observer, skip it\n const owner = (el as any).shinyResizeObserver;\n if (owner && owner !== this) return;\n // mark this output as owned by this shinyResizeObserver instance\n if (!owner) (el as any).shinyResizeObserver = this;\n\n // trigger immediate resizing of outputs with a resize method\n onResize(el);\n // only once per output and resize event\n resized.push(el);\n\n // set plot images to 100% width temporarily during the transition\n if (!el.classList.contains(\"shiny-plot-output\")) return;\n const img = el.querySelector(\n 'img:not([width=\"100%\"])'\n );\n if (img) img.setAttribute(\"width\", \"100%\");\n });\n }\n });\n }\n\n /**\n * Observe an element for size changes.\n * @param {HTMLElement} el - The element to observe.\n */\n observe(el: HTMLElement): void {\n this.resizeObserver.observe(el);\n this.resizeObserverEntries.push(el);\n }\n\n /**\n * Stop observing an element for size changes.\n * @param {HTMLElement} el - The element to stop observing.\n */\n unobserve(el: HTMLElement): void {\n const idxEl = this.resizeObserverEntries.indexOf(el);\n if (idxEl < 0) return;\n\n this.resizeObserver.unobserve(el);\n this.resizeObserverEntries.splice(idxEl, 1);\n }\n\n /**\n * This method checks that we're not continuing to watch elements that no\n * longer exist in the DOM. If any are found, we stop observing them and\n * remove them from our array of observed elements.\n *\n * @private\n * @static\n */\n flush(): void {\n this.resizeObserverEntries.forEach((el) => {\n if (!document.body.contains(el)) this.unobserve(el);\n });\n }\n}\n\nexport { ShinyResizeObserver };\n", "import { InputBinding, registerBinding } from \"./_utils\";\nimport { ShinyResizeObserver } from \"./_shinyResizeObserver\";\n\n/**\n * Methods for programmatically toggling the state of the sidebar. These methods\n * describe the desired state of the sidebar: `\"close\"` and `\"open\"` transition\n * the sidebar to the desired state, unless the sidebar is already in that\n * state. `\"toggle\"` transitions the sidebar to the state opposite of its\n * current state.\n * @typedef {SidebarToggleMethod}\n */\ntype SidebarToggleMethod = \"close\" | \"open\" | \"toggle\";\n\n/**\n * Data received by the input binding's `receiveMessage` method.\n * @typedef {SidebarMessageData}\n */\ntype SidebarMessageData = {\n method: SidebarToggleMethod;\n};\n\n/**\n * The DOM elements that make up the sidebar. `main`, `sidebar`, and `toggle`\n * are all direct children of `container` (in that order).\n * @interface SidebarComponents\n * @typedef {SidebarComponents}\n */\ninterface SidebarComponents {\n /**\n * The `layout_sidebar()` parent container, with class\n * `Sidebar.classes.LAYOUT`.\n * @type {HTMLElement}\n */\n container: HTMLElement;\n /**\n * The main content area of the sidebar layout.\n * @type {HTMLElement}\n */\n main: HTMLElement;\n /**\n * The sidebar container of the sidebar layout.\n * @type {HTMLElement}\n */\n sidebar: HTMLElement;\n /**\n * The toggle button that is used to toggle the sidebar state.\n * @type {HTMLElement}\n */\n toggle: HTMLElement;\n}\n\n/**\n * The bslib sidebar component class. This class is only used for collapsible\n * sidebars.\n *\n * @class Sidebar\n * @typedef {Sidebar}\n */\nclass Sidebar {\n /**\n * The DOM elements that make up the sidebar, see `SidebarComponents`.\n * @private\n * @type {SidebarComponents}\n */\n private layout: SidebarComponents;\n\n /**\n * A Shiny-specific resize observer that ensures Shiny outputs in the main\n * content areas of the sidebar resize appropriately.\n * @private\n * @type {ShinyResizeObserver}\n * @static\n */\n private static shinyResizeObserver = new ShinyResizeObserver();\n\n /**\n * Creates an instance of a collapsible bslib Sidebar.\n * @constructor\n * @param {HTMLElement} container\n */\n constructor(container: HTMLElement) {\n Sidebar.instanceMap.set(container, this);\n this.layout = {\n container,\n main: container.querySelector(\":scope > .main\") as HTMLElement,\n sidebar: container.querySelector(\":scope > .sidebar\") as HTMLElement,\n toggle: container.querySelector(\n \":scope > .collapse-toggle\"\n ) as HTMLElement,\n } as SidebarComponents;\n\n if (!this.layout.toggle) {\n throw new Error(\"Tried to initialize a non-collapsible sidebar.\");\n }\n\n this._initEventListeners();\n this._initSidebarCounters();\n this._initDesktop();\n\n // Start watching the main content area for size changes to ensure Shiny\n // outputs resize appropriately during sidebar transitions.\n Sidebar.shinyResizeObserver.observe(this.layout.main);\n\n container.removeAttribute(\"data-bslib-sidebar-init\");\n const initScript = container.querySelector(\n \":scope > script[data-bslib-sidebar-init]\"\n );\n if (initScript) {\n container.removeChild(initScript);\n }\n }\n\n /**\n * Read the current state of the sidebar. Note that, when calling this method,\n * the sidebar may be transitioning into the state returned by this method.\n *\n * @description\n * The sidebar state works as follows, starting from the open state. When the\n * sidebar is closed:\n * 1. We add both the `COLLAPSE` and `TRANSITIONING` classes to the sidebar.\n * 2. The sidebar collapse begins to animate. On desktop devices, and where it\n * is supported, we transition the `grid-template-columns` property of the\n * sidebar layout. On mobile, the sidebar is hidden immediately. In both\n * cases, the collapse icon rotates and we use this rotation to determine\n * when the transition is complete.\n * 3. If another sidebar state toggle is requested while closing the sidebar,\n * we remove the `COLLAPSE` class and the animation immediately starts to\n * reverse.\n * 4. When the `transition` is complete, we remove the `TRANSITIONING` class.\n * @readonly\n * @type {boolean}\n */\n get isClosed(): boolean {\n return this.layout.container.classList.contains(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * Static classes related to the sidebar layout or state.\n * @public\n * @static\n * @readonly\n * @type {{ LAYOUT: string; COLLAPSE: string; TRANSITIONING: string; }}\n */\n public static readonly classes = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LAYOUT: \"bslib-sidebar-layout\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n COLLAPSE: \"sidebar-collapsed\",\n // eslint-disable-next-line @typescript-eslint/naming-convention\n TRANSITIONING: \"transitioning\",\n };\n\n /**\n * If sidebars are initialized before the DOM is ready, we re-schedule the\n * initialization to occur on DOMContentLoaded.\n * @private\n * @static\n * @type {boolean}\n */\n private static onReadyScheduled = false;\n /**\n * A map of initialized sidebars to their respective Sidebar instances.\n * @private\n * @static\n * @type {WeakMap}\n */\n private static instanceMap: WeakMap = new WeakMap();\n\n /**\n * Given a sidebar container, return the Sidebar instance associated with it.\n * @public\n * @static\n * @param {HTMLElement} el\n * @returns {(Sidebar | undefined)}\n */\n public static getInstance(el: HTMLElement): Sidebar | undefined {\n return Sidebar.instanceMap.get(el);\n }\n\n /**\n * Initialize all collapsible sidebars on the page.\n * @public\n * @static\n * @param {boolean} [flushResizeObserver=true] When `true`, we remove\n * non-existent elements from the ResizeObserver. This is required\n * periodically to prevent memory leaks. To avoid over-checking, we only flush\n * the ResizeObserver when initializing sidebars after page load.\n */\n public static initCollapsibleAll(flushResizeObserver = true): void {\n if (document.readyState === \"loading\") {\n if (!Sidebar.onReadyScheduled) {\n Sidebar.onReadyScheduled = true;\n document.addEventListener(\"DOMContentLoaded\", () => {\n Sidebar.initCollapsibleAll(false);\n });\n }\n return;\n }\n\n const initSelector = `.${Sidebar.classes.LAYOUT}[data-bslib-sidebar-init]`;\n if (!document.querySelector(initSelector)) {\n // no sidebars to initialize\n return;\n }\n\n if (flushResizeObserver) Sidebar.shinyResizeObserver.flush();\n\n const containers = document.querySelectorAll(initSelector);\n containers.forEach((container) => new Sidebar(container as HTMLElement));\n }\n\n /**\n * Initialize event listeners for the sidebar toggle button.\n * @private\n */\n private _initEventListeners(): void {\n const { sidebar, toggle } = this.layout;\n\n toggle.addEventListener(\"click\", (ev) => {\n ev.preventDefault();\n this.toggle(\"toggle\");\n });\n\n // Remove the transitioning class when the transition ends. We watch the\n // collapse toggle icon because it's guaranteed to transition, whereas the\n // sidebar doesn't animate on mobile (or in browsers where animating\n // grid-template-columns is not supported).\n toggle\n .querySelector(\".collapse-icon\")\n ?.addEventListener(\"transitionend\", () => {\n this._finalizeState();\n $(sidebar).trigger(\"toggleCollapse.sidebarInputBinding\");\n });\n }\n\n /**\n * Initialize nested sidebar counters.\n *\n * @description\n * This function walks up the DOM tree, adding CSS variables to each direct\n * parent sidebar layout that count the layout's position in the stack of\n * nested layouts. We use these counters to keep the collapse toggles from\n * overlapping. Note that always-open sidebars that don't have collapse\n * toggles break the chain of nesting.\n * @private\n */\n private _initSidebarCounters(): void {\n const { container } = this.layout;\n\n const selectorChildLayouts =\n `.${Sidebar.classes.LAYOUT}` +\n \"> .main > \" +\n `.${Sidebar.classes.LAYOUT}:not([data-bslib-sidebar-open=\"always\"])`;\n\n const isInnermostLayout =\n container.querySelector(selectorChildLayouts) === null;\n\n if (!isInnermostLayout) {\n // There are sidebar layouts nested within this layout; defer to children\n return;\n }\n\n function nextSidebarParent(el: HTMLElement | null): HTMLElement | null {\n el = el ? el.parentElement : null;\n if (el && el.classList.contains(\"main\")) {\n // .bslib-sidebar-layout > .main > .bslib-sidebar-layout\n el = el.parentElement;\n }\n if (el && el.classList.contains(Sidebar.classes.LAYOUT)) {\n return el;\n }\n return null;\n }\n\n const layouts = [container];\n let parent = nextSidebarParent(container);\n\n while (parent) {\n // Add parent to front of layouts array, so we sort outer -> inner\n layouts.unshift(parent);\n parent = nextSidebarParent(parent);\n }\n\n const count = { left: 0, right: 0 };\n layouts.forEach(function (x: HTMLElement, i: number): void {\n x.style.setProperty(\"--bslib-sidebar-counter\", i.toString());\n const isRight = x.classList.contains(\"sidebar-right\");\n const thisCount = isRight ? count.right++ : count.left++;\n x.style.setProperty(\n \"--bslib-sidebar-overlap-counter\",\n thisCount.toString()\n );\n });\n }\n\n /**\n * Initialize the sidebar's initial state when `open = \"desktop\"`.\n * @private\n */\n private _initDesktop(): void {\n const { container } = this.layout;\n // If sidebar is marked open='desktop'...\n if (container.dataset.bslibSidebarOpen?.trim() !== \"desktop\") {\n return;\n }\n\n // then close sidebar on mobile\n const initCollapsed = window\n .getComputedStyle(container)\n .getPropertyValue(\"--bslib-sidebar-js-init-collapsed\");\n\n if (initCollapsed.trim() === \"true\") {\n this.toggle(\"close\");\n }\n }\n\n /**\n * Toggle the sidebar's open/closed state.\n * @public\n * @param {SidebarToggleMethod | undefined} method Whether to `\"open\"`,\n * `\"close\"` or `\"toggle\"` the sidebar. If `.toggle()` is called without an\n * argument, it will toggle the sidebar's state.\n */\n public toggle(method: SidebarToggleMethod | undefined): void {\n if (typeof method === \"undefined\") {\n method = \"toggle\";\n }\n\n const { container, sidebar } = this.layout;\n const isClosed = this.isClosed;\n\n if ([\"open\", \"close\", \"toggle\"].indexOf(method) === -1) {\n throw new Error(`Unknown method ${method}`);\n }\n\n if (method === \"toggle\") {\n method = isClosed ? \"open\" : \"close\";\n }\n\n if ((isClosed && method === \"close\") || (!isClosed && method === \"open\")) {\n // nothing to do, sidebar is already in the desired state\n return;\n }\n\n if (method === \"open\") {\n // unhide sidebar immediately when opening,\n // otherwise the sidebar is hidden on transitionend\n sidebar.hidden = false;\n }\n\n // Add a transitioning class just before adding COLLAPSE_CLASS since we want\n // some of the transitioning styles to apply before the collapse state\n container.classList.add(Sidebar.classes.TRANSITIONING);\n container.classList.toggle(Sidebar.classes.COLLAPSE);\n }\n\n /**\n * When the sidebar open/close transition ends, finalize the sidebar's state.\n * @private\n */\n private _finalizeState(): void {\n const { container, sidebar, toggle } = this.layout;\n container.classList.remove(Sidebar.classes.TRANSITIONING);\n sidebar.hidden = this.isClosed;\n toggle.ariaExpanded = this.isClosed ? \"false\" : \"true\";\n }\n}\n\n/**\n * A Shiny input binding for a sidebar.\n * @class SidebarInputBinding\n * @typedef {SidebarInputBinding}\n * @extends {InputBinding}\n */\nclass SidebarInputBinding extends InputBinding {\n find(scope: HTMLElement) {\n return $(scope).find(`.${Sidebar.classes.LAYOUT} > .bslib-sidebar-input`);\n }\n\n getValue(el: HTMLElement): boolean {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n return sb ? sb.isClosed : false;\n }\n\n setValue(el: HTMLElement, value: boolean): void {\n const method = value ? \"open\" : \"close\";\n this.receiveMessage(el, { method });\n }\n\n subscribe(el: HTMLElement, callback: (x: boolean) => void) {\n $(el).on(\n \"toggleCollapse.sidebarInputBinding\",\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function (event) {\n callback(true);\n }\n );\n }\n\n unsubscribe(el: HTMLElement) {\n $(el).off(\".sidebarInputBinding\");\n }\n\n receiveMessage(el: HTMLElement, data: SidebarMessageData) {\n const sb = Sidebar.getInstance(el.parentElement as HTMLElement);\n if (sb) sb.toggle(data.method);\n }\n}\n\nregisterBinding(SidebarInputBinding, \"sidebar\");\n\n// attach Sidebar class to window for global usage\n(window as any).bslib = (window as any).bslib || {};\n(window as any).bslib.Sidebar = Sidebar;\n"], + "mappings": "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", "names": ["InputBinding", "registerBinding", "inputBindingClass", "name", "ShinyResizeObserver", "entries", "resizeEvent", "resized", "entry", "el", "binding", "onResize", "owner", "img", "idxEl", "_Sidebar", "container", "initScript", "el", "flushResizeObserver", "initSelector", "_a", "sidebar", "toggle", "ev", "selectorChildLayouts", "nextSidebarParent", "layouts", "parent", "count", "x", "i", "thisCount", "method", "isClosed", "Sidebar", "ShinyResizeObserver", "SidebarInputBinding", "InputBinding", "scope", "sb", "value", "callback", "event", "data", "registerBinding"] } diff --git a/srcts/src/components/_shinyResizeObserver.ts b/srcts/src/components/_shinyResizeObserver.ts index 76f4bc2cd..ec40e2f0d 100644 --- a/srcts/src/components/_shinyResizeObserver.ts +++ b/srcts/src/components/_shinyResizeObserver.ts @@ -95,7 +95,7 @@ class ShinyResizeObserver { // set plot images to 100% width temporarily during the transition if (!el.classList.contains("shiny-plot-output")) return; const img = el.querySelector( - 'img:not([width="100%"]])' + 'img:not([width="100%"])' ); if (img) img.setAttribute("width", "100%"); });