{"version":3,"file":"index-641c1273.js","sources":["../../../../../node_modules/svelte/src/runtime/internal/utils.js","../../../../../node_modules/svelte/src/runtime/internal/globals.js","../../../../../node_modules/svelte/src/runtime/internal/dom.js","../../../../../node_modules/svelte/src/runtime/internal/lifecycle.js","../../../../../node_modules/svelte/src/runtime/internal/scheduler.js","../../../../../node_modules/svelte/src/runtime/internal/transitions.js","../../../../../node_modules/svelte/src/runtime/internal/each.js","../../../../../node_modules/svelte/src/runtime/internal/Component.js","../../../../../node_modules/svelte/src/shared/version.js","../../../../../node_modules/svelte/src/runtime/internal/disclose-version/index.js","../../../../../node_modules/@itslearning/atlas/network/NetworkError.js","../../../../../node_modules/@itslearning/atlas/network/responseStatuses.js","../../../../../node_modules/@itslearning/atlas/network/fetch.js","../../../../../node_modules/@itslearning/atlas/network/fetchJson.js","../../../../../node_modules/@itslearning/prometheus/assets/nodes/Avatar/v1/Avatar.svelte","../../../../../node_modules/@itslearning/prometheus/assets/inputs/Button/v1/Button.svelte","../../../../../node_modules/@itslearning/prometheus/assets/inputs/IconButton/v1/IconButton.svelte","../../../../../node_modules/@itslearning/prometheus/assets/feedback/Banner/v1/Banner.svelte","../../../../../node_modules/@itslearning/prometheus/assets/nodes/LoadingSpinner/v1/LoadingSpinner.svelte","../../../../../node_modules/@itslearning/prometheus/lib/helpers/TabTrapHelper.js","../../../../../node_modules/@itslearning/atlas/keyboard/keys.js","../../../../../node_modules/@itslearning/atlas/keyboard/normalize.js","../../../../../node_modules/@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte","../../../../../node_modules/@itslearning/prometheus/assets/Navigation/Link/v1/Link.svelte","../../../../../node_modules/@itslearning/atlas/strings/format.js","../../src/lib/App/App.svelte","../../src/main.js"],"sourcesContent":["/** @returns {void} */\nexport function noop() {}\n\nexport const identity = (x) => x;\n\n/**\n * @template T\n * @template S\n * @param {T} tar\n * @param {S} src\n * @returns {T & S}\n */\nexport function assign(tar, src) {\n\t// @ts-ignore\n\tfor (const k in src) tar[k] = src[k];\n\treturn /** @type {T & S} */ (tar);\n}\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n/**\n * @param {any} value\n * @returns {value is PromiseLike<any>}\n */\nexport function is_promise(value) {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\ttypeof (/** @type {any} */ (value).then) === 'function'\n\t);\n}\n\n/** @returns {void} */\nexport function add_location(element, file, line, column, char) {\n\telement.__svelte_meta = {\n\t\tloc: { file, line, column, char }\n\t};\n}\n\nexport function run(fn) {\n\treturn fn();\n}\n\nexport function blank_object() {\n\treturn Object.create(null);\n}\n\n/**\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function run_all(fns) {\n\tfns.forEach(run);\n}\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\n/** @returns {boolean} */\nexport function safe_not_equal(a, b) {\n\treturn a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function';\n}\n\nlet src_url_equal_anchor;\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nexport function src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\tif (!src_url_equal_anchor) {\n\t\tsrc_url_equal_anchor = document.createElement('a');\n\t}\n\t// This is actually faster than doing URL(..).href\n\tsrc_url_equal_anchor.href = url;\n\treturn element_src === src_url_equal_anchor.href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element_srcset\n * @param {string | undefined | null} srcset\n * @returns {boolean}\n */\nexport function srcset_url_equal(element_srcset, srcset) {\n\tconst element_urls = split_srcset(element_srcset.srcset);\n\tconst urls = split_srcset(srcset || '');\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n\n/** @returns {boolean} */\nexport function not_equal(a, b) {\n\treturn a != a ? b == b : a !== b;\n}\n\n/** @returns {boolean} */\nexport function is_empty(obj) {\n\treturn Object.keys(obj).length === 0;\n}\n\n/** @returns {void} */\nexport function validate_store(store, name) {\n\tif (store != null && typeof store.subscribe !== 'function') {\n\t\tthrow new Error(`'${name}' is not a store with a 'subscribe' method`);\n\t}\n}\n\nexport function subscribe(store, ...callbacks) {\n\tif (store == null) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(undefined);\n\t\t}\n\t\treturn noop;\n\t}\n\tconst unsub = store.subscribe(...callbacks);\n\treturn unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\n\n/**\n * Get the current value from a store by subscribing and immediately unsubscribing.\n *\n * https://svelte.dev/docs/svelte-store#get\n * @template T\n * @param {import('../store/public.js').Readable<T>} store\n * @returns {T}\n */\nexport function get_store_value(store) {\n\tlet value;\n\tsubscribe(store, (_) => (value = _))();\n\treturn value;\n}\n\n/** @returns {void} */\nexport function component_subscribe(component, store, callback) {\n\tcomponent.$$.on_destroy.push(subscribe(store, callback));\n}\n\nexport function create_slot(definition, ctx, $$scope, fn) {\n\tif (definition) {\n\t\tconst slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n\t\treturn definition[0](slot_ctx);\n\t}\n}\n\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n\treturn definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;\n}\n\nexport function get_slot_changes(definition, $$scope, dirty, fn) {\n\tif (definition[2] && fn) {\n\t\tconst lets = definition[2](fn(dirty));\n\t\tif ($$scope.dirty === undefined) {\n\t\t\treturn lets;\n\t\t}\n\t\tif (typeof lets === 'object') {\n\t\t\tconst merged = [];\n\t\t\tconst len = Math.max($$scope.dirty.length, lets.length);\n\t\t\tfor (let i = 0; i < len; i += 1) {\n\t\t\t\tmerged[i] = $$scope.dirty[i] | lets[i];\n\t\t\t}\n\t\t\treturn merged;\n\t\t}\n\t\treturn $$scope.dirty | lets;\n\t}\n\treturn $$scope.dirty;\n}\n\n/** @returns {void} */\nexport function update_slot_base(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tslot_changes,\n\tget_slot_context_fn\n) {\n\tif (slot_changes) {\n\t\tconst slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n\t\tslot.p(slot_context, slot_changes);\n\t}\n}\n\n/** @returns {void} */\nexport function update_slot(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tdirty,\n\tget_slot_changes_fn,\n\tget_slot_context_fn\n) {\n\tconst slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n\tupdate_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\n\n/** @returns {any[] | -1} */\nexport function get_all_dirty_from_scope($$scope) {\n\tif ($$scope.ctx.length > 32) {\n\t\tconst dirty = [];\n\t\tconst length = $$scope.ctx.length / 32;\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tdirty[i] = -1;\n\t\t}\n\t\treturn dirty;\n\t}\n\treturn -1;\n}\n\n/** @returns {{}} */\nexport function exclude_internal_props(props) {\n\tconst result = {};\n\tfor (const k in props) if (k[0] !== '$') result[k] = props[k];\n\treturn result;\n}\n\n/** @returns {{}} */\nexport function compute_rest_props(props, keys) {\n\tconst rest = {};\n\tkeys = new Set(keys);\n\tfor (const k in props) if (!keys.has(k) && k[0] !== '$') rest[k] = props[k];\n\treturn rest;\n}\n\n/** @returns {{}} */\nexport function compute_slots(slots) {\n\tconst result = {};\n\tfor (const key in slots) {\n\t\tresult[key] = true;\n\t}\n\treturn result;\n}\n\n/** @returns {(this: any, ...args: any[]) => void} */\nexport function once(fn) {\n\tlet ran = false;\n\treturn function (...args) {\n\t\tif (ran) return;\n\t\tran = true;\n\t\tfn.call(this, ...args);\n\t};\n}\n\nexport function null_to_empty(value) {\n\treturn value == null ? '' : value;\n}\n\nexport function set_store_value(store, ret, value) {\n\tstore.set(value);\n\treturn ret;\n}\n\nexport const has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\n\nexport function action_destroyer(action_result) {\n\treturn action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\n/** @param {number | string} value\n * @returns {[number, string]}\n */\nexport function split_css_unit(value) {\n\tconst split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n\treturn split ? [parseFloat(split[1]), split[2] || 'px'] : [/** @type {number} */ (value), 'px'];\n}\n\nexport const contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n","/** @type {typeof globalThis} */\nexport const globals =\n\ttypeof window !== 'undefined'\n\t\t? window\n\t\t: typeof globalThis !== 'undefined'\n\t\t? globalThis\n\t\t: // @ts-ignore Node typings have this\n\t\t  global;\n","import { contenteditable_truthy_values, has_prop } from './utils.js';\n\nimport { ResizeObserverSingleton } from './ResizeObserverSingleton.js';\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\n\n/**\n * @returns {void}\n */\nexport function start_hydrating() {\n\tis_hydrating = true;\n}\n\n/**\n * @returns {void}\n */\nexport function end_hydrating() {\n\tis_hydrating = false;\n}\n\n/**\n * @param {number} low\n * @param {number} high\n * @param {(index: number) => number} key\n * @param {number} value\n * @returns {number}\n */\nfunction upper_bound(low, high, key, value) {\n\t// Return first index of value larger than input value in the range [low, high)\n\twhile (low < high) {\n\t\tconst mid = low + ((high - low) >> 1);\n\t\tif (key(mid) <= value) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\treturn low;\n}\n\n/**\n * @param {NodeEx} target\n * @returns {void}\n */\nfunction init_hydrate(target) {\n\tif (target.hydrate_init) return;\n\ttarget.hydrate_init = true;\n\t// We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n\n\tlet children = /** @type {ArrayLike<NodeEx2>} */ (target.childNodes);\n\t// If target is <head>, there may be children without claim_order\n\tif (target.nodeName === 'HEAD') {\n\t\tconst my_children = [];\n\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\tconst node = children[i];\n\t\t\tif (node.claim_order !== undefined) {\n\t\t\t\tmy_children.push(node);\n\t\t\t}\n\t\t}\n\t\tchildren = my_children;\n\t}\n\t/*\n\t * Reorder claimed children optimally.\n\t * We can reorder claimed children optimally by finding the longest subsequence of\n\t * nodes that are already claimed in order and only moving the rest. The longest\n\t * subsequence of nodes that are claimed in order can be found by\n\t * computing the longest increasing subsequence of .claim_order values.\n\t *\n\t * This algorithm is optimal in generating the least amount of reorder operations\n\t * possible.\n\t *\n\t * Proof:\n\t * We know that, given a set of reordering operations, the nodes that do not move\n\t * always form an increasing subsequence, since they do not move among each other\n\t * meaning that they must be already ordered among each other. Thus, the maximal\n\t * set of nodes that do not move form a longest increasing subsequence.\n\t */\n\t// Compute longest increasing subsequence\n\t// m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n\tconst m = new Int32Array(children.length + 1);\n\t// Predecessor indices + 1\n\tconst p = new Int32Array(children.length);\n\tm[0] = -1;\n\tlet longest = 0;\n\tfor (let i = 0; i < children.length; i++) {\n\t\tconst current = children[i].claim_order;\n\t\t// Find the largest subsequence length such that it ends in a value less than our current value\n\t\t// upper_bound returns first greater value, so we subtract one\n\t\t// with fast path for when we are on the current longest subsequence\n\t\tconst seq_len =\n\t\t\t(longest > 0 && children[m[longest]].claim_order <= current\n\t\t\t\t? longest + 1\n\t\t\t\t: upper_bound(1, longest, (idx) => children[m[idx]].claim_order, current)) - 1;\n\t\tp[i] = m[seq_len] + 1;\n\t\tconst new_len = seq_len + 1;\n\t\t// We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n\t\tm[new_len] = i;\n\t\tlongest = Math.max(new_len, longest);\n\t}\n\t// The longest increasing subsequence of nodes (initially reversed)\n\n\t/**\n\t * @type {NodeEx2[]}\n\t */\n\tconst lis = [];\n\t// The rest of the nodes, nodes that will be moved\n\n\t/**\n\t * @type {NodeEx2[]}\n\t */\n\tconst to_move = [];\n\tlet last = children.length - 1;\n\tfor (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n\t\tlis.push(children[cur - 1]);\n\t\tfor (; last >= cur; last--) {\n\t\t\tto_move.push(children[last]);\n\t\t}\n\t\tlast--;\n\t}\n\tfor (; last >= 0; last--) {\n\t\tto_move.push(children[last]);\n\t}\n\tlis.reverse();\n\t// We sort the nodes being moved to guarantee that their insertion order matches the claim order\n\tto_move.sort((a, b) => a.claim_order - b.claim_order);\n\t// Finally, we move the nodes\n\tfor (let i = 0, j = 0; i < to_move.length; i++) {\n\t\twhile (j < lis.length && to_move[i].claim_order >= lis[j].claim_order) {\n\t\t\tj++;\n\t\t}\n\t\tconst anchor = j < lis.length ? lis[j] : null;\n\t\ttarget.insertBefore(to_move[i], anchor);\n\t}\n}\n\n/**\n * @param {Node} target\n * @param {Node} node\n * @returns {void}\n */\nexport function append(target, node) {\n\ttarget.appendChild(node);\n}\n\n/**\n * @param {Node} target\n * @param {string} style_sheet_id\n * @param {string} styles\n * @returns {void}\n */\nexport function append_styles(target, style_sheet_id, styles) {\n\tconst append_styles_to = get_root_for_style(target);\n\tif (!append_styles_to.getElementById(style_sheet_id)) {\n\t\tconst style = element('style');\n\t\tstyle.id = style_sheet_id;\n\t\tstyle.textContent = styles;\n\t\tappend_stylesheet(append_styles_to, style);\n\t}\n}\n\n/**\n * @param {Node} node\n * @returns {ShadowRoot | Document}\n */\nexport function get_root_for_style(node) {\n\tif (!node) return document;\n\tconst root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n\tif (root && /** @type {ShadowRoot} */ (root).host) {\n\t\treturn /** @type {ShadowRoot} */ (root);\n\t}\n\treturn node.ownerDocument;\n}\n\n/**\n * @param {Node} node\n * @returns {CSSStyleSheet}\n */\nexport function append_empty_stylesheet(node) {\n\tconst style_element = element('style');\n\t// For transitions to work without 'style-src: unsafe-inline' Content Security Policy,\n\t// these empty tags need to be allowed with a hash as a workaround until we move to the Web Animations API.\n\t// Using the hash for the empty string (for an empty tag) works in all browsers except Safari.\n\t// So as a workaround for the workaround, when we append empty style tags we set their content to /* empty */.\n\t// The hash 'sha256-9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc=' will then work even in Safari.\n\tstyle_element.textContent = '/* empty */';\n\tappend_stylesheet(get_root_for_style(node), style_element);\n\treturn style_element.sheet;\n}\n\n/**\n * @param {ShadowRoot | Document} node\n * @param {HTMLStyleElement} style\n * @returns {CSSStyleSheet}\n */\nfunction append_stylesheet(node, style) {\n\tappend(/** @type {Document} */ (node).head || node, style);\n\treturn style.sheet;\n}\n\n/**\n * @param {NodeEx} target\n * @param {NodeEx} node\n * @returns {void}\n */\nexport function append_hydration(target, node) {\n\tif (is_hydrating) {\n\t\tinit_hydrate(target);\n\t\tif (\n\t\t\ttarget.actual_end_child === undefined ||\n\t\t\t(target.actual_end_child !== null && target.actual_end_child.parentNode !== target)\n\t\t) {\n\t\t\ttarget.actual_end_child = target.firstChild;\n\t\t}\n\t\t// Skip nodes of undefined ordering\n\t\twhile (target.actual_end_child !== null && target.actual_end_child.claim_order === undefined) {\n\t\t\ttarget.actual_end_child = target.actual_end_child.nextSibling;\n\t\t}\n\t\tif (node !== target.actual_end_child) {\n\t\t\t// We only insert if the ordering of this node should be modified or the parent node is not target\n\t\t\tif (node.claim_order !== undefined || node.parentNode !== target) {\n\t\t\t\ttarget.insertBefore(node, target.actual_end_child);\n\t\t\t}\n\t\t} else {\n\t\t\ttarget.actual_end_child = node.nextSibling;\n\t\t}\n\t} else if (node.parentNode !== target || node.nextSibling !== null) {\n\t\ttarget.appendChild(node);\n\t}\n}\n\n/**\n * @param {Node} target\n * @param {Node} node\n * @param {Node} [anchor]\n * @returns {void}\n */\nexport function insert(target, node, anchor) {\n\ttarget.insertBefore(node, anchor || null);\n}\n\n/**\n * @param {NodeEx} target\n * @param {NodeEx} node\n * @param {NodeEx} [anchor]\n * @returns {void}\n */\nexport function insert_hydration(target, node, anchor) {\n\tif (is_hydrating && !anchor) {\n\t\tappend_hydration(target, node);\n\t} else if (node.parentNode !== target || node.nextSibling != anchor) {\n\t\ttarget.insertBefore(node, anchor || null);\n\t}\n}\n\n/**\n * @param {Node} node\n * @returns {void}\n */\nexport function detach(node) {\n\tif (node.parentNode) {\n\t\tnode.parentNode.removeChild(node);\n\t}\n}\n\n/**\n * @returns {void} */\nexport function destroy_each(iterations, detaching) {\n\tfor (let i = 0; i < iterations.length; i += 1) {\n\t\tif (iterations[i]) iterations[i].d(detaching);\n\t}\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} name\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function element(name) {\n\treturn document.createElement(name);\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} name\n * @param {string} is\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function element_is(name, is) {\n\treturn document.createElement(name, { is });\n}\n\n/**\n * @template T\n * @template {keyof T} K\n * @param {T} obj\n * @param {K[]} exclude\n * @returns {Pick<T, Exclude<keyof T, K>>}\n */\nexport function object_without_properties(obj, exclude) {\n\tconst target = /** @type {Pick<T, Exclude<keyof T, K>>} */ ({});\n\tfor (const k in obj) {\n\t\tif (\n\t\t\thas_prop(obj, k) &&\n\t\t\t// @ts-ignore\n\t\t\texclude.indexOf(k) === -1\n\t\t) {\n\t\t\t// @ts-ignore\n\t\t\ttarget[k] = obj[k];\n\t\t}\n\t}\n\treturn target;\n}\n\n/**\n * @template {keyof SVGElementTagNameMap} K\n * @param {K} name\n * @returns {SVGElement}\n */\nexport function svg_element(name) {\n\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n}\n\n/**\n * @param {string} data\n * @returns {Text}\n */\nexport function text(data) {\n\treturn document.createTextNode(data);\n}\n\n/**\n * @returns {Text} */\nexport function space() {\n\treturn text(' ');\n}\n\n/**\n * @returns {Text} */\nexport function empty() {\n\treturn text('');\n}\n\n/**\n * @param {string} content\n * @returns {Comment}\n */\nexport function comment(content) {\n\treturn document.createComment(content);\n}\n\n/**\n * @param {EventTarget} node\n * @param {string} event\n * @param {EventListenerOrEventListenerObject} handler\n * @param {boolean | AddEventListenerOptions | EventListenerOptions} [options]\n * @returns {() => void}\n */\nexport function listen(node, event, handler, options) {\n\tnode.addEventListener(event, handler, options);\n\treturn () => node.removeEventListener(event, handler, options);\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function prevent_default(fn) {\n\treturn function (event) {\n\t\tevent.preventDefault();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function stop_propagation(fn) {\n\treturn function (event) {\n\t\tevent.stopPropagation();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function stop_immediate_propagation(fn) {\n\treturn function (event) {\n\t\tevent.stopImmediatePropagation();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => void} */\nexport function self(fn) {\n\treturn function (event) {\n\t\t// @ts-ignore\n\t\tif (event.target === this) fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => void} */\nexport function trusted(fn) {\n\treturn function (event) {\n\t\t// @ts-ignore\n\t\tif (event.isTrusted) fn.call(this, event);\n\t};\n}\n\n/**\n * @param {Element} node\n * @param {string} attribute\n * @param {string} [value]\n * @returns {void}\n */\nexport function attr(node, attribute, value) {\n\tif (value == null) node.removeAttribute(attribute);\n\telse if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {{ [x: string]: string }} attributes\n * @returns {void}\n */\nexport function set_attributes(node, attributes) {\n\t// @ts-ignore\n\tconst descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n\tfor (const key in attributes) {\n\t\tif (attributes[key] == null) {\n\t\t\tnode.removeAttribute(key);\n\t\t} else if (key === 'style') {\n\t\t\tnode.style.cssText = attributes[key];\n\t\t} else if (key === '__value') {\n\t\t\t/** @type {any} */ (node).value = node[key] = attributes[key];\n\t\t} else if (\n\t\t\tdescriptors[key] &&\n\t\t\tdescriptors[key].set &&\n\t\t\talways_set_through_set_attribute.indexOf(key) === -1\n\t\t) {\n\t\t\tnode[key] = attributes[key];\n\t\t} else {\n\t\t\tattr(node, key, attributes[key]);\n\t\t}\n\t}\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {{ [x: string]: string }} attributes\n * @returns {void}\n */\nexport function set_svg_attributes(node, attributes) {\n\tfor (const key in attributes) {\n\t\tattr(node, key, attributes[key]);\n\t}\n}\n\n/**\n * @param {Record<string, unknown>} data_map\n * @returns {void}\n */\nexport function set_custom_element_data_map(node, data_map) {\n\tObject.keys(data_map).forEach((key) => {\n\t\tset_custom_element_data(node, key, data_map[key]);\n\t});\n}\n\n/**\n * @returns {void} */\nexport function set_custom_element_data(node, prop, value) {\n\tconst lower = prop.toLowerCase(); // for backwards compatibility with existing behavior we do lowercase first\n\tif (lower in node) {\n\t\tnode[lower] = typeof node[lower] === 'boolean' && value === '' ? true : value;\n\t} else if (prop in node) {\n\t\tnode[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n\t} else {\n\t\tattr(node, prop, value);\n\t}\n}\n\n/**\n * @param {string} tag\n */\nexport function set_dynamic_element_data(tag) {\n\treturn /-/.test(tag) ? set_custom_element_data_map : set_attributes;\n}\n\n/**\n * @returns {void}\n */\nexport function xlink_attr(node, attribute, value) {\n\tnode.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\n\n/**\n * @param {HTMLElement} node\n * @returns {string}\n */\nexport function get_svelte_dataset(node) {\n\treturn node.dataset.svelteH;\n}\n\n/**\n * @returns {unknown[]} */\nexport function get_binding_group_value(group, __value, checked) {\n\tconst value = new Set();\n\tfor (let i = 0; i < group.length; i += 1) {\n\t\tif (group[i].checked) value.add(group[i].__value);\n\t}\n\tif (!checked) {\n\t\tvalue.delete(__value);\n\t}\n\treturn Array.from(value);\n}\n\n/**\n * @param {HTMLInputElement[]} group\n * @returns {{ p(...inputs: HTMLInputElement[]): void; r(): void; }}\n */\nexport function init_binding_group(group) {\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _inputs;\n\treturn {\n\t\t/* push */ p(...inputs) {\n\t\t\t_inputs = inputs;\n\t\t\t_inputs.forEach((input) => group.push(input));\n\t\t},\n\t\t/* remove */ r() {\n\t\t\t_inputs.forEach((input) => group.splice(group.indexOf(input), 1));\n\t\t}\n\t};\n}\n\n/**\n * @param {number[]} indexes\n * @returns {{ u(new_indexes: number[]): void; p(...inputs: HTMLInputElement[]): void; r: () => void; }}\n */\nexport function init_binding_group_dynamic(group, indexes) {\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _group = get_binding_group(group);\n\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _inputs;\n\n\tfunction get_binding_group(group) {\n\t\tfor (let i = 0; i < indexes.length; i++) {\n\t\t\tgroup = group[indexes[i]] = group[indexes[i]] || [];\n\t\t}\n\t\treturn group;\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction push() {\n\t\t_inputs.forEach((input) => _group.push(input));\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction remove() {\n\t\t_inputs.forEach((input) => _group.splice(_group.indexOf(input), 1));\n\t}\n\treturn {\n\t\t/* update */ u(new_indexes) {\n\t\t\tindexes = new_indexes;\n\t\t\tconst new_group = get_binding_group(group);\n\t\t\tif (new_group !== _group) {\n\t\t\t\tremove();\n\t\t\t\t_group = new_group;\n\t\t\t\tpush();\n\t\t\t}\n\t\t},\n\t\t/* push */ p(...inputs) {\n\t\t\t_inputs = inputs;\n\t\t\tpush();\n\t\t},\n\t\t/* remove */ r: remove\n\t};\n}\n\n/** @returns {number} */\nexport function to_number(value) {\n\treturn value === '' ? null : +value;\n}\n\n/** @returns {any[]} */\nexport function time_ranges_to_array(ranges) {\n\tconst array = [];\n\tfor (let i = 0; i < ranges.length; i += 1) {\n\t\tarray.push({ start: ranges.start(i), end: ranges.end(i) });\n\t}\n\treturn array;\n}\n\n/**\n * @param {Element} element\n * @returns {ChildNode[]}\n */\nexport function children(element) {\n\treturn Array.from(element.childNodes);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {void}\n */\nfunction init_claim_info(nodes) {\n\tif (nodes.claim_info === undefined) {\n\t\tnodes.claim_info = { last_index: 0, total_claimed: 0 };\n\t}\n}\n\n/**\n * @template {ChildNodeEx} R\n * @param {ChildNodeArray} nodes\n * @param {(node: ChildNodeEx) => node is R} predicate\n * @param {(node: ChildNodeEx) => ChildNodeEx | undefined} process_node\n * @param {() => R} create_node\n * @param {boolean} dont_update_last_index\n * @returns {R}\n */\nfunction claim_node(nodes, predicate, process_node, create_node, dont_update_last_index = false) {\n\t// Try to find nodes in an order such that we lengthen the longest increasing subsequence\n\tinit_claim_info(nodes);\n\tconst result_node = (() => {\n\t\t// We first try to find an element after the previous one\n\t\tfor (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n\t\t\tconst node = nodes[i];\n\t\t\tif (predicate(node)) {\n\t\t\t\tconst replacement = process_node(node);\n\t\t\t\tif (replacement === undefined) {\n\t\t\t\t\tnodes.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\tnodes[i] = replacement;\n\t\t\t\t}\n\t\t\t\tif (!dont_update_last_index) {\n\t\t\t\t\tnodes.claim_info.last_index = i;\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\t// Otherwise, we try to find one before\n\t\t// We iterate in reverse so that we don't go too far back\n\t\tfor (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n\t\t\tconst node = nodes[i];\n\t\t\tif (predicate(node)) {\n\t\t\t\tconst replacement = process_node(node);\n\t\t\t\tif (replacement === undefined) {\n\t\t\t\t\tnodes.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\tnodes[i] = replacement;\n\t\t\t\t}\n\t\t\t\tif (!dont_update_last_index) {\n\t\t\t\t\tnodes.claim_info.last_index = i;\n\t\t\t\t} else if (replacement === undefined) {\n\t\t\t\t\t// Since we spliced before the last_index, we decrease it\n\t\t\t\t\tnodes.claim_info.last_index--;\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\t// If we can't find any matching node, we create a new one\n\t\treturn create_node();\n\t})();\n\tresult_node.claim_order = nodes.claim_info.total_claimed;\n\tnodes.claim_info.total_claimed += 1;\n\treturn result_node;\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @param {(name: string) => Element | SVGElement} create_element\n * @returns {Element | SVGElement}\n */\nfunction claim_element_base(nodes, name, attributes, create_element) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Element | SVGElement} */\n\t\t(node) => node.nodeName === name,\n\t\t/** @param {Element} node */\n\t\t(node) => {\n\t\t\tconst remove = [];\n\t\t\tfor (let j = 0; j < node.attributes.length; j++) {\n\t\t\t\tconst attribute = node.attributes[j];\n\t\t\t\tif (!attributes[attribute.name]) {\n\t\t\t\t\tremove.push(attribute.name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tremove.forEach((v) => node.removeAttribute(v));\n\t\t\treturn undefined;\n\t\t},\n\t\t() => create_element(name)\n\t);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @returns {Element | SVGElement}\n */\nexport function claim_element(nodes, name, attributes) {\n\treturn claim_element_base(nodes, name, attributes, element);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @returns {Element | SVGElement}\n */\nexport function claim_svg_element(nodes, name, attributes) {\n\treturn claim_element_base(nodes, name, attributes, svg_element);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {Text}\n */\nexport function claim_text(nodes, data) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Text} */\n\t\t(node) => node.nodeType === 3,\n\t\t/** @param {Text} node */\n\t\t(node) => {\n\t\t\tconst data_str = '' + data;\n\t\t\tif (node.data.startsWith(data_str)) {\n\t\t\t\tif (node.data.length !== data_str.length) {\n\t\t\t\t\treturn node.splitText(data_str.length);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.data = data_str;\n\t\t\t}\n\t\t},\n\t\t() => text(data),\n\t\ttrue // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n\t);\n}\n\n/**\n * @returns {Text} */\nexport function claim_space(nodes) {\n\treturn claim_text(nodes, ' ');\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {Comment}\n */\nexport function claim_comment(nodes, data) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Comment} */\n\t\t(node) => node.nodeType === 8,\n\t\t/** @param {Comment} node */\n\t\t(node) => {\n\t\t\tnode.data = '' + data;\n\t\t\treturn undefined;\n\t\t},\n\t\t() => comment(data),\n\t\ttrue\n\t);\n}\n\nfunction get_comment_idx(nodes, text, start) {\n\tfor (let i = start; i < nodes.length; i += 1) {\n\t\tconst node = nodes[i];\n\t\tif (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * @param {boolean} is_svg\n * @returns {HtmlTagHydration}\n */\nexport function claim_html_tag(nodes, is_svg) {\n\t// find html opening tag\n\tconst start_index = get_comment_idx(nodes, 'HTML_TAG_START', 0);\n\tconst end_index = get_comment_idx(nodes, 'HTML_TAG_END', start_index + 1);\n\tif (start_index === -1 || end_index === -1) {\n\t\treturn new HtmlTagHydration(is_svg);\n\t}\n\n\tinit_claim_info(nodes);\n\tconst html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n\tdetach(html_tag_nodes[0]);\n\tdetach(html_tag_nodes[html_tag_nodes.length - 1]);\n\tconst claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n\tfor (const n of claimed_nodes) {\n\t\tn.claim_order = nodes.claim_info.total_claimed;\n\t\tnodes.claim_info.total_claimed += 1;\n\t}\n\treturn new HtmlTagHydration(is_svg, claimed_nodes);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @returns {void}\n */\nexport function set_data(text, data) {\n\tdata = '' + data;\n\tif (text.data === data) return;\n\ttext.data = /** @type {string} */ (data);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @returns {void}\n */\nexport function set_data_contenteditable(text, data) {\n\tdata = '' + data;\n\tif (text.wholeText === data) return;\n\ttext.data = /** @type {string} */ (data);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @param {string} attr_value\n * @returns {void}\n */\nexport function set_data_maybe_contenteditable(text, data, attr_value) {\n\tif (~contenteditable_truthy_values.indexOf(attr_value)) {\n\t\tset_data_contenteditable(text, data);\n\t} else {\n\t\tset_data(text, data);\n\t}\n}\n\n/**\n * @returns {void} */\nexport function set_input_value(input, value) {\n\tinput.value = value == null ? '' : value;\n}\n\n/**\n * @returns {void} */\nexport function set_input_type(input, type) {\n\ttry {\n\t\tinput.type = type;\n\t} catch (e) {\n\t\t// do nothing\n\t}\n}\n\n/**\n * @returns {void} */\nexport function set_style(node, key, value, important) {\n\tif (value == null) {\n\t\tnode.style.removeProperty(key);\n\t} else {\n\t\tnode.style.setProperty(key, value, important ? 'important' : '');\n\t}\n}\n\n/**\n * @returns {void} */\nexport function select_option(select, value, mounting) {\n\tfor (let i = 0; i < select.options.length; i += 1) {\n\t\tconst option = select.options[i];\n\t\tif (option.__value === value) {\n\t\t\toption.selected = true;\n\t\t\treturn;\n\t\t}\n\t}\n\tif (!mounting || value !== undefined) {\n\t\tselect.selectedIndex = -1; // no option should be selected\n\t}\n}\n\n/**\n * @returns {void} */\nexport function select_options(select, value) {\n\tfor (let i = 0; i < select.options.length; i += 1) {\n\t\tconst option = select.options[i];\n\t\toption.selected = ~value.indexOf(option.__value);\n\t}\n}\n\nexport function select_value(select) {\n\tconst selected_option = select.querySelector(':checked');\n\treturn selected_option && selected_option.__value;\n}\n\nexport function select_multiple_value(select) {\n\treturn [].map.call(select.querySelectorAll(':checked'), (option) => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\n\n/**\n * @type {boolean} */\nlet crossorigin;\n\n/**\n * @returns {boolean} */\nexport function is_crossorigin() {\n\tif (crossorigin === undefined) {\n\t\tcrossorigin = false;\n\t\ttry {\n\t\t\tif (typeof window !== 'undefined' && window.parent) {\n\t\t\t\tvoid window.parent.document;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tcrossorigin = true;\n\t\t}\n\t}\n\treturn crossorigin;\n}\n\n/**\n * @param {HTMLElement} node\n * @param {() => void} fn\n * @returns {() => void}\n */\nexport function add_iframe_resize_listener(node, fn) {\n\tconst computed_style = getComputedStyle(node);\n\tif (computed_style.position === 'static') {\n\t\tnode.style.position = 'relative';\n\t}\n\tconst iframe = element('iframe');\n\tiframe.setAttribute(\n\t\t'style',\n\t\t'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n\t\t\t'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;'\n\t);\n\tiframe.setAttribute('aria-hidden', 'true');\n\tiframe.tabIndex = -1;\n\tconst crossorigin = is_crossorigin();\n\n\t/**\n\t * @type {() => void}\n\t */\n\tlet unsubscribe;\n\tif (crossorigin) {\n\t\tiframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n\t\tunsubscribe = listen(\n\t\t\twindow,\n\t\t\t'message',\n\t\t\t/** @param {MessageEvent} event */ (event) => {\n\t\t\t\tif (event.source === iframe.contentWindow) fn();\n\t\t\t}\n\t\t);\n\t} else {\n\t\tiframe.src = 'about:blank';\n\t\tiframe.onload = () => {\n\t\t\tunsubscribe = listen(iframe.contentWindow, 'resize', fn);\n\t\t\t// make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n\t\t\t// see https://github.com/sveltejs/svelte/issues/4233\n\t\t\tfn();\n\t\t};\n\t}\n\tappend(node, iframe);\n\treturn () => {\n\t\tif (crossorigin) {\n\t\t\tunsubscribe();\n\t\t} else if (unsubscribe && iframe.contentWindow) {\n\t\t\tunsubscribe();\n\t\t}\n\t\tdetach(iframe);\n\t};\n}\nexport const resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({\n\tbox: 'content-box'\n});\nexport const resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({\n\tbox: 'border-box'\n});\nexport const resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton(\n\t{ box: 'device-pixel-content-box' }\n);\nexport { ResizeObserverSingleton };\n\n/**\n * @returns {void} */\nexport function toggle_class(element, name, toggle) {\n\t// The `!!` is required because an `undefined` flag means flipping the current state.\n\telement.classList.toggle(name, !!toggle);\n}\n\n/**\n * @template T\n * @param {string} type\n * @param {T} [detail]\n * @param {{ bubbles?: boolean, cancelable?: boolean }} [options]\n * @returns {CustomEvent<T>}\n */\nexport function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n\treturn new CustomEvent(type, { detail, bubbles, cancelable });\n}\n\n/**\n * @param {string} selector\n * @param {HTMLElement} parent\n * @returns {ChildNodeArray}\n */\nexport function query_selector_all(selector, parent = document.body) {\n\treturn Array.from(parent.querySelectorAll(selector));\n}\n\n/**\n * @param {string} nodeId\n * @param {HTMLElement} head\n * @returns {any[]}\n */\nexport function head_selector(nodeId, head) {\n\tconst result = [];\n\tlet started = 0;\n\tfor (const node of head.childNodes) {\n\t\tif (node.nodeType === 8 /* comment node */) {\n\t\t\tconst comment = node.textContent.trim();\n\t\t\tif (comment === `HEAD_${nodeId}_END`) {\n\t\t\t\tstarted -= 1;\n\t\t\t\tresult.push(node);\n\t\t\t} else if (comment === `HEAD_${nodeId}_START`) {\n\t\t\t\tstarted += 1;\n\t\t\t\tresult.push(node);\n\t\t\t}\n\t\t} else if (started > 0) {\n\t\t\tresult.push(node);\n\t\t}\n\t}\n\treturn result;\n}\n/** */\nexport class HtmlTag {\n\t/**\n\t * @private\n\t * @default false\n\t */\n\tis_svg = false;\n\t/** parent for creating node */\n\te = undefined;\n\t/** html tag nodes */\n\tn = undefined;\n\t/** target */\n\tt = undefined;\n\t/** anchor */\n\ta = undefined;\n\tconstructor(is_svg = false) {\n\t\tthis.is_svg = is_svg;\n\t\tthis.e = this.n = null;\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tc(html) {\n\t\tthis.h(html);\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @param {HTMLElement | SVGElement} target\n\t * @param {HTMLElement | SVGElement} anchor\n\t * @returns {void}\n\t */\n\tm(html, target, anchor = null) {\n\t\tif (!this.e) {\n\t\t\tif (this.is_svg)\n\t\t\t\tthis.e = svg_element(/** @type {keyof SVGElementTagNameMap} */ (target.nodeName));\n\t\t\t/** #7364  target for <template> may be provided as #document-fragment(11) */ else\n\t\t\t\tthis.e = element(\n\t\t\t\t\t/** @type {keyof HTMLElementTagNameMap} */ (\n\t\t\t\t\t\ttarget.nodeType === 11 ? 'TEMPLATE' : target.nodeName\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\tthis.t =\n\t\t\t\ttarget.tagName !== 'TEMPLATE'\n\t\t\t\t\t? target\n\t\t\t\t\t: /** @type {HTMLTemplateElement} */ (target).content;\n\t\t\tthis.c(html);\n\t\t}\n\t\tthis.i(anchor);\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\th(html) {\n\t\tthis.e.innerHTML = html;\n\t\tthis.n = Array.from(\n\t\t\tthis.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes\n\t\t);\n\t}\n\n\t/**\n\t * @returns {void} */\n\ti(anchor) {\n\t\tfor (let i = 0; i < this.n.length; i += 1) {\n\t\t\tinsert(this.t, this.n[i], anchor);\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tp(html) {\n\t\tthis.d();\n\t\tthis.h(html);\n\t\tthis.i(this.a);\n\t}\n\n\t/**\n\t * @returns {void} */\n\td() {\n\t\tthis.n.forEach(detach);\n\t}\n}\n\nexport class HtmlTagHydration extends HtmlTag {\n\t/** @type {Element[]} hydration claimed nodes */\n\tl = undefined;\n\n\tconstructor(is_svg = false, claimed_nodes) {\n\t\tsuper(is_svg);\n\t\tthis.e = this.n = null;\n\t\tthis.l = claimed_nodes;\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tc(html) {\n\t\tif (this.l) {\n\t\t\tthis.n = this.l;\n\t\t} else {\n\t\t\tsuper.c(html);\n\t\t}\n\t}\n\n\t/**\n\t * @returns {void} */\n\ti(anchor) {\n\t\tfor (let i = 0; i < this.n.length; i += 1) {\n\t\t\tinsert_hydration(this.t, this.n[i], anchor);\n\t\t}\n\t}\n}\n\n/**\n * @param {NamedNodeMap} attributes\n * @returns {{}}\n */\nexport function attribute_to_object(attributes) {\n\tconst result = {};\n\tfor (const attribute of attributes) {\n\t\tresult[attribute.name] = attribute.value;\n\t}\n\treturn result;\n}\n\n/**\n * @param {HTMLElement} element\n * @returns {{}}\n */\nexport function get_custom_elements_slots(element) {\n\tconst result = {};\n\telement.childNodes.forEach(\n\t\t/** @param {Element} node */ (node) => {\n\t\t\tresult[node.slot || 'default'] = true;\n\t\t}\n\t);\n\treturn result;\n}\n\nexport function construct_svelte_component(component, props) {\n\treturn new component(props);\n}\n\n/**\n * @typedef {Node & {\n * \tclaim_order?: number;\n * \thydrate_init?: true;\n * \tactual_end_child?: NodeEx;\n * \tchildNodes: NodeListOf<NodeEx>;\n * }} NodeEx\n */\n\n/** @typedef {ChildNode & NodeEx} ChildNodeEx */\n\n/** @typedef {NodeEx & { claim_order: number }} NodeEx2 */\n\n/**\n * @typedef {ChildNodeEx[] & {\n * \tclaim_info?: {\n * \t\tlast_index: number;\n * \t\ttotal_claimed: number;\n * \t};\n * }} ChildNodeArray\n */\n","import { custom_event } from './dom.js';\n\nexport let current_component;\n\n/** @returns {void} */\nexport function set_current_component(component) {\n\tcurrent_component = component;\n}\n\nexport function get_current_component() {\n\tif (!current_component) throw new Error('Function called outside component initialization');\n\treturn current_component;\n}\n\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs/svelte#beforeupdate\n * @param {() => any} fn\n * @returns {void}\n */\nexport function beforeUpdate(fn) {\n\tget_current_component().$$.before_update.push(fn);\n}\n\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * If a function is returned _synchronously_ from `onMount`, it will be called when the component is unmounted.\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs/svelte#onmount\n * @template T\n * @param {() => import('./private.js').NotFunction<T> | Promise<import('./private.js').NotFunction<T>> | (() => any)} fn\n * @returns {void}\n */\nexport function onMount(fn) {\n\tget_current_component().$$.on_mount.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n *\n * https://svelte.dev/docs/svelte#afterupdate\n * @param {() => any} fn\n * @returns {void}\n */\nexport function afterUpdate(fn) {\n\tget_current_component().$$.after_update.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs/svelte#ondestroy\n * @param {() => any} fn\n * @returns {void}\n */\nexport function onDestroy(fn) {\n\tget_current_component().$$.on_destroy.push(fn);\n}\n\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * The event dispatcher can be typed to narrow the allowed event names and the type of the `detail` argument:\n * ```ts\n * const dispatch = createEventDispatcher<{\n *  loaded: never; // does not take a detail argument\n *  change: string; // takes a detail argument of type string, which is required\n *  optional: number | null; // takes an optional detail argument of type number\n * }>();\n * ```\n *\n * https://svelte.dev/docs/svelte#createeventdispatcher\n * @template {Record<string, any>} [EventMap=any]\n * @returns {import('./public.js').EventDispatcher<EventMap>}\n */\nexport function createEventDispatcher() {\n\tconst component = get_current_component();\n\treturn (type, detail, { cancelable = false } = {}) => {\n\t\tconst callbacks = component.$$.callbacks[type];\n\t\tif (callbacks) {\n\t\t\t// TODO are there situations where events could be dispatched\n\t\t\t// in a server (non-DOM) environment?\n\t\t\tconst event = custom_event(/** @type {string} */ (type), detail, { cancelable });\n\t\t\tcallbacks.slice().forEach((fn) => {\n\t\t\t\tfn.call(component, event);\n\t\t\t});\n\t\t\treturn !event.defaultPrevented;\n\t\t}\n\t\treturn true;\n\t};\n}\n\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#setcontext\n * @template T\n * @param {any} key\n * @param {T} context\n * @returns {T}\n */\nexport function setContext(key, context) {\n\tget_current_component().$$.context.set(key, context);\n\treturn context;\n}\n\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#getcontext\n * @template T\n * @param {any} key\n * @returns {T}\n */\nexport function getContext(key) {\n\treturn get_current_component().$$.context.get(key);\n}\n\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs/svelte#getallcontexts\n * @template {Map<any, any>} [T=Map<any, any>]\n * @returns {T}\n */\nexport function getAllContexts() {\n\treturn get_current_component().$$.context;\n}\n\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#hascontext\n * @param {any} key\n * @returns {boolean}\n */\nexport function hasContext(key) {\n\treturn get_current_component().$$.context.has(key);\n}\n\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\n/**\n * @param component\n * @param event\n * @returns {void}\n */\nexport function bubble(component, event) {\n\tconst callbacks = component.$$.callbacks[event.type];\n\tif (callbacks) {\n\t\t// @ts-ignore\n\t\tcallbacks.slice().forEach((fn) => fn.call(this, event));\n\t}\n}\n","import { run_all } from './utils.js';\nimport { current_component, set_current_component } from './lifecycle.js';\n\nexport const dirty_components = [];\nexport const intros = { enabled: false };\nexport const binding_callbacks = [];\n\nlet render_callbacks = [];\n\nconst flush_callbacks = [];\n\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\n\nlet update_scheduled = false;\n\n/** @returns {void} */\nexport function schedule_update() {\n\tif (!update_scheduled) {\n\t\tupdate_scheduled = true;\n\t\tresolved_promise.then(flush);\n\t}\n}\n\n/** @returns {Promise<void>} */\nexport function tick() {\n\tschedule_update();\n\treturn resolved_promise;\n}\n\n/** @returns {void} */\nexport function add_render_callback(fn) {\n\trender_callbacks.push(fn);\n}\n\n/** @returns {void} */\nexport function add_flush_callback(fn) {\n\tflush_callbacks.push(fn);\n}\n\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n//    for afterUpdates called during the initial onMount, which are called in\n//    reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n//    dirty_components array and will cause a reentrant call to flush(). Because\n//    the flush index is kept outside the function, the reentrant call will pick\n//    up where the earlier call left off and go through all dirty components. The\n//    current_component value is saved and restored so that the reentrant call will\n//    not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n//    callback called a second time; the seen_callbacks set, outside the flush()\n//    function, guarantees this behavior.\nconst seen_callbacks = new Set();\n\nlet flushidx = 0; // Do *not* move this inside the flush() function\n\n/** @returns {void} */\nexport function flush() {\n\t// Do not reenter flush while dirty components are updated, as this can\n\t// result in an infinite loop. Instead, let the inner flush handle it.\n\t// Reentrancy is ok afterwards for bindings etc.\n\tif (flushidx !== 0) {\n\t\treturn;\n\t}\n\tconst saved_component = current_component;\n\tdo {\n\t\t// first, call beforeUpdate functions\n\t\t// and update components\n\t\ttry {\n\t\t\twhile (flushidx < dirty_components.length) {\n\t\t\t\tconst component = dirty_components[flushidx];\n\t\t\t\tflushidx++;\n\t\t\t\tset_current_component(component);\n\t\t\t\tupdate(component.$$);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// reset dirty state to not end up in a deadlocked state and then rethrow\n\t\t\tdirty_components.length = 0;\n\t\t\tflushidx = 0;\n\t\t\tthrow e;\n\t\t}\n\t\tset_current_component(null);\n\t\tdirty_components.length = 0;\n\t\tflushidx = 0;\n\t\twhile (binding_callbacks.length) binding_callbacks.pop()();\n\t\t// then, once components are updated, call\n\t\t// afterUpdate functions. This may cause\n\t\t// subsequent updates...\n\t\tfor (let i = 0; i < render_callbacks.length; i += 1) {\n\t\t\tconst callback = render_callbacks[i];\n\t\t\tif (!seen_callbacks.has(callback)) {\n\t\t\t\t// ...so guard against infinite loops\n\t\t\t\tseen_callbacks.add(callback);\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\t\trender_callbacks.length = 0;\n\t} while (dirty_components.length);\n\twhile (flush_callbacks.length) {\n\t\tflush_callbacks.pop()();\n\t}\n\tupdate_scheduled = false;\n\tseen_callbacks.clear();\n\tset_current_component(saved_component);\n}\n\n/** @returns {void} */\nfunction update($$) {\n\tif ($$.fragment !== null) {\n\t\t$$.update();\n\t\trun_all($$.before_update);\n\t\tconst dirty = $$.dirty;\n\t\t$$.dirty = [-1];\n\t\t$$.fragment && $$.fragment.p($$.ctx, dirty);\n\t\t$$.after_update.forEach(add_render_callback);\n\t}\n}\n\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function flush_render_callbacks(fns) {\n\tconst filtered = [];\n\tconst targets = [];\n\trender_callbacks.forEach((c) => (fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c)));\n\ttargets.forEach((c) => c());\n\trender_callbacks = filtered;\n}\n","import { identity as linear, is_function, noop, run_all } from './utils.js';\nimport { now } from './environment.js';\nimport { loop } from './loop.js';\nimport { create_rule, delete_rule } from './style_manager.js';\nimport { custom_event } from './dom.js';\nimport { add_render_callback } from './scheduler.js';\n\n/**\n * @type {Promise<void> | null}\n */\nlet promise;\n\n/**\n * @returns {Promise<void>}\n */\nfunction wait() {\n\tif (!promise) {\n\t\tpromise = Promise.resolve();\n\t\tpromise.then(() => {\n\t\t\tpromise = null;\n\t\t});\n\t}\n\treturn promise;\n}\n\n/**\n * @param {Element} node\n * @param {INTRO | OUTRO | boolean} direction\n * @param {'start' | 'end'} kind\n * @returns {void}\n */\nfunction dispatch(node, direction, kind) {\n\tnode.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\n\nconst outroing = new Set();\n\n/**\n * @type {Outro}\n */\nlet outros;\n\n/**\n * @returns {void} */\nexport function group_outros() {\n\toutros = {\n\t\tr: 0,\n\t\tc: [],\n\t\tp: outros // parent group\n\t};\n}\n\n/**\n * @returns {void} */\nexport function check_outros() {\n\tif (!outros.r) {\n\t\trun_all(outros.c);\n\t}\n\toutros = outros.p;\n}\n\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} [local]\n * @returns {void}\n */\nexport function transition_in(block, local) {\n\tif (block && block.i) {\n\t\toutroing.delete(block);\n\t\tblock.i(local);\n\t}\n}\n\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} local\n * @param {0 | 1} [detach]\n * @param {() => void} [callback]\n * @returns {void}\n */\nexport function transition_out(block, local, detach, callback) {\n\tif (block && block.o) {\n\t\tif (outroing.has(block)) return;\n\t\toutroing.add(block);\n\t\toutros.c.push(() => {\n\t\t\toutroing.delete(block);\n\t\t\tif (callback) {\n\t\t\t\tif (detach) block.d(1);\n\t\t\t\tcallback();\n\t\t\t}\n\t\t});\n\t\tblock.o(local);\n\t} else if (callback) {\n\t\tcallback();\n\t}\n}\n\n/**\n * @type {import('../transition/public.js').TransitionConfig}\n */\nconst null_transition = { duration: 0 };\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @returns {{ start(): void; invalidate(): void; end(): void; }}\n */\nexport function create_in_transition(node, fn, params) {\n\t/**\n\t * @type {TransitionOptions} */\n\tconst options = { direction: 'in' };\n\tlet config = fn(node, params, options);\n\tlet running = false;\n\tlet animation_name;\n\tlet task;\n\tlet uid = 0;\n\n\t/**\n\t * @returns {void} */\n\tfunction cleanup() {\n\t\tif (animation_name) delete_rule(node, animation_name);\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction go() {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\t\tif (css) animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n\t\ttick(0, 1);\n\t\tconst start_time = now() + delay;\n\t\tconst end_time = start_time + duration;\n\t\tif (task) task.abort();\n\t\trunning = true;\n\t\tadd_render_callback(() => dispatch(node, true, 'start'));\n\t\ttask = loop((now) => {\n\t\t\tif (running) {\n\t\t\t\tif (now >= end_time) {\n\t\t\t\t\ttick(1, 0);\n\t\t\t\t\tdispatch(node, true, 'end');\n\t\t\t\t\tcleanup();\n\t\t\t\t\treturn (running = false);\n\t\t\t\t}\n\t\t\t\tif (now >= start_time) {\n\t\t\t\t\tconst t = easing((now - start_time) / duration);\n\t\t\t\t\ttick(t, 1 - t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn running;\n\t\t});\n\t}\n\tlet started = false;\n\treturn {\n\t\tstart() {\n\t\t\tif (started) return;\n\t\t\tstarted = true;\n\t\t\tdelete_rule(node);\n\t\t\tif (is_function(config)) {\n\t\t\t\tconfig = config(options);\n\t\t\t\twait().then(go);\n\t\t\t} else {\n\t\t\t\tgo();\n\t\t\t}\n\t\t},\n\t\tinvalidate() {\n\t\t\tstarted = false;\n\t\t},\n\t\tend() {\n\t\t\tif (running) {\n\t\t\t\tcleanup();\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @returns {{ end(reset: any): void; }}\n */\nexport function create_out_transition(node, fn, params) {\n\t/** @type {TransitionOptions} */\n\tconst options = { direction: 'out' };\n\tlet config = fn(node, params, options);\n\tlet running = true;\n\tlet animation_name;\n\tconst group = outros;\n\tgroup.r += 1;\n\t/** @type {boolean} */\n\tlet original_inert_value;\n\n\t/**\n\t * @returns {void} */\n\tfunction go() {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\n\t\tif (css) animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n\n\t\tconst start_time = now() + delay;\n\t\tconst end_time = start_time + duration;\n\t\tadd_render_callback(() => dispatch(node, false, 'start'));\n\n\t\tif ('inert' in node) {\n\t\t\toriginal_inert_value = /** @type {HTMLElement} */ (node).inert;\n\t\t\tnode.inert = true;\n\t\t}\n\n\t\tloop((now) => {\n\t\t\tif (running) {\n\t\t\t\tif (now >= end_time) {\n\t\t\t\t\ttick(0, 1);\n\t\t\t\t\tdispatch(node, false, 'end');\n\t\t\t\t\tif (!--group.r) {\n\t\t\t\t\t\t// this will result in `end()` being called,\n\t\t\t\t\t\t// so we don't need to clean up here\n\t\t\t\t\t\trun_all(group.c);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (now >= start_time) {\n\t\t\t\t\tconst t = easing((now - start_time) / duration);\n\t\t\t\t\ttick(1 - t, t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn running;\n\t\t});\n\t}\n\n\tif (is_function(config)) {\n\t\twait().then(() => {\n\t\t\t// @ts-ignore\n\t\t\tconfig = config(options);\n\t\t\tgo();\n\t\t});\n\t} else {\n\t\tgo();\n\t}\n\n\treturn {\n\t\tend(reset) {\n\t\t\tif (reset && 'inert' in node) {\n\t\t\t\tnode.inert = original_inert_value;\n\t\t\t}\n\t\t\tif (reset && config.tick) {\n\t\t\t\tconfig.tick(1, 0);\n\t\t\t}\n\t\t\tif (running) {\n\t\t\t\tif (animation_name) delete_rule(node, animation_name);\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @param {boolean} intro\n * @returns {{ run(b: 0 | 1): void; end(): void; }}\n */\nexport function create_bidirectional_transition(node, fn, params, intro) {\n\t/**\n\t * @type {TransitionOptions} */\n\tconst options = { direction: 'both' };\n\tlet config = fn(node, params, options);\n\tlet t = intro ? 0 : 1;\n\n\t/**\n\t * @type {Program | null} */\n\tlet running_program = null;\n\n\t/**\n\t * @type {PendingProgram | null} */\n\tlet pending_program = null;\n\tlet animation_name = null;\n\n\t/** @type {boolean} */\n\tlet original_inert_value;\n\n\t/**\n\t * @returns {void} */\n\tfunction clear_animation() {\n\t\tif (animation_name) delete_rule(node, animation_name);\n\t}\n\n\t/**\n\t * @param {PendingProgram} program\n\t * @param {number} duration\n\t * @returns {Program}\n\t */\n\tfunction init(program, duration) {\n\t\tconst d = /** @type {Program['d']} */ (program.b - t);\n\t\tduration *= Math.abs(d);\n\t\treturn {\n\t\t\ta: t,\n\t\t\tb: program.b,\n\t\t\td,\n\t\t\tduration,\n\t\t\tstart: program.start,\n\t\t\tend: program.start + duration,\n\t\t\tgroup: program.group\n\t\t};\n\t}\n\n\t/**\n\t * @param {INTRO | OUTRO} b\n\t * @returns {void}\n\t */\n\tfunction go(b) {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\n\t\t/**\n\t\t * @type {PendingProgram} */\n\t\tconst program = {\n\t\t\tstart: now() + delay,\n\t\t\tb\n\t\t};\n\n\t\tif (!b) {\n\t\t\t// @ts-ignore todo: improve typings\n\t\t\tprogram.group = outros;\n\t\t\toutros.r += 1;\n\t\t}\n\n\t\tif ('inert' in node) {\n\t\t\tif (b) {\n\t\t\t\tif (original_inert_value !== undefined) {\n\t\t\t\t\t// aborted/reversed outro — restore previous inert value\n\t\t\t\t\tnode.inert = original_inert_value;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toriginal_inert_value = /** @type {HTMLElement} */ (node).inert;\n\t\t\t\tnode.inert = true;\n\t\t\t}\n\t\t}\n\n\t\tif (running_program || pending_program) {\n\t\t\tpending_program = program;\n\t\t} else {\n\t\t\t// if this is an intro, and there's a delay, we need to do\n\t\t\t// an initial tick and/or apply CSS animation immediately\n\t\t\tif (css) {\n\t\t\t\tclear_animation();\n\t\t\t\tanimation_name = create_rule(node, t, b, duration, delay, easing, css);\n\t\t\t}\n\t\t\tif (b) tick(0, 1);\n\t\t\trunning_program = init(program, duration);\n\t\t\tadd_render_callback(() => dispatch(node, b, 'start'));\n\t\t\tloop((now) => {\n\t\t\t\tif (pending_program && now > pending_program.start) {\n\t\t\t\t\trunning_program = init(pending_program, duration);\n\t\t\t\t\tpending_program = null;\n\t\t\t\t\tdispatch(node, running_program.b, 'start');\n\t\t\t\t\tif (css) {\n\t\t\t\t\t\tclear_animation();\n\t\t\t\t\t\tanimation_name = create_rule(\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\trunning_program.b,\n\t\t\t\t\t\t\trunning_program.duration,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\teasing,\n\t\t\t\t\t\t\tconfig.css\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (running_program) {\n\t\t\t\t\tif (now >= running_program.end) {\n\t\t\t\t\t\ttick((t = running_program.b), 1 - t);\n\t\t\t\t\t\tdispatch(node, running_program.b, 'end');\n\t\t\t\t\t\tif (!pending_program) {\n\t\t\t\t\t\t\t// we're done\n\t\t\t\t\t\t\tif (running_program.b) {\n\t\t\t\t\t\t\t\t// intro — we can tidy up immediately\n\t\t\t\t\t\t\t\tclear_animation();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// outro — needs to be coordinated\n\t\t\t\t\t\t\t\tif (!--running_program.group.r) run_all(running_program.group.c);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\trunning_program = null;\n\t\t\t\t\t} else if (now >= running_program.start) {\n\t\t\t\t\t\tconst p = now - running_program.start;\n\t\t\t\t\t\tt = running_program.a + running_program.d * easing(p / running_program.duration);\n\t\t\t\t\t\ttick(t, 1 - t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn !!(running_program || pending_program);\n\t\t\t});\n\t\t}\n\t}\n\treturn {\n\t\trun(b) {\n\t\t\tif (is_function(config)) {\n\t\t\t\twait().then(() => {\n\t\t\t\t\tconst opts = { direction: b ? 'in' : 'out' };\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconfig = config(opts);\n\t\t\t\t\tgo(b);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tgo(b);\n\t\t\t}\n\t\t},\n\t\tend() {\n\t\t\tclear_animation();\n\t\t\trunning_program = pending_program = null;\n\t\t}\n\t};\n}\n\n/** @typedef {1} INTRO */\n/** @typedef {0} OUTRO */\n/** @typedef {{ direction: 'in' | 'out' | 'both' }} TransitionOptions */\n/** @typedef {(node: Element, params: any, options: TransitionOptions) => import('../transition/public.js').TransitionConfig} TransitionFn */\n\n/**\n * @typedef {Object} Outro\n * @property {number} r\n * @property {Function[]} c\n * @property {Object} p\n */\n\n/**\n * @typedef {Object} PendingProgram\n * @property {number} start\n * @property {INTRO|OUTRO} b\n * @property {Outro} [group]\n */\n\n/**\n * @typedef {Object} Program\n * @property {number} a\n * @property {INTRO|OUTRO} b\n * @property {1|-1} d\n * @property {number} duration\n * @property {number} start\n * @property {number} end\n * @property {Outro} [group]\n */\n","import { transition_in, transition_out } from './transitions.js';\nimport { run_all } from './utils.js';\n\n// general each functions:\n\nexport function ensure_array_like(array_like_or_iterator) {\n\treturn array_like_or_iterator?.length !== undefined\n\t\t? array_like_or_iterator\n\t\t: Array.from(array_like_or_iterator);\n}\n\n// keyed each functions:\n\n/** @returns {void} */\nexport function destroy_block(block, lookup) {\n\tblock.d(1);\n\tlookup.delete(block.key);\n}\n\n/** @returns {void} */\nexport function outro_and_destroy_block(block, lookup) {\n\ttransition_out(block, 1, 1, () => {\n\t\tlookup.delete(block.key);\n\t});\n}\n\n/** @returns {void} */\nexport function fix_and_destroy_block(block, lookup) {\n\tblock.f();\n\tdestroy_block(block, lookup);\n}\n\n/** @returns {void} */\nexport function fix_and_outro_and_destroy_block(block, lookup) {\n\tblock.f();\n\toutro_and_destroy_block(block, lookup);\n}\n\n/** @returns {any[]} */\nexport function update_keyed_each(\n\told_blocks,\n\tdirty,\n\tget_key,\n\tdynamic,\n\tctx,\n\tlist,\n\tlookup,\n\tnode,\n\tdestroy,\n\tcreate_each_block,\n\tnext,\n\tget_context\n) {\n\tlet o = old_blocks.length;\n\tlet n = list.length;\n\tlet i = o;\n\tconst old_indexes = {};\n\twhile (i--) old_indexes[old_blocks[i].key] = i;\n\tconst new_blocks = [];\n\tconst new_lookup = new Map();\n\tconst deltas = new Map();\n\tconst updates = [];\n\ti = n;\n\twhile (i--) {\n\t\tconst child_ctx = get_context(ctx, list, i);\n\t\tconst key = get_key(child_ctx);\n\t\tlet block = lookup.get(key);\n\t\tif (!block) {\n\t\t\tblock = create_each_block(key, child_ctx);\n\t\t\tblock.c();\n\t\t} else if (dynamic) {\n\t\t\t// defer updates until all the DOM shuffling is done\n\t\t\tupdates.push(() => block.p(child_ctx, dirty));\n\t\t}\n\t\tnew_lookup.set(key, (new_blocks[i] = block));\n\t\tif (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key]));\n\t}\n\tconst will_move = new Set();\n\tconst did_move = new Set();\n\t/** @returns {void} */\n\tfunction insert(block) {\n\t\ttransition_in(block, 1);\n\t\tblock.m(node, next);\n\t\tlookup.set(block.key, block);\n\t\tnext = block.first;\n\t\tn--;\n\t}\n\twhile (o && n) {\n\t\tconst new_block = new_blocks[n - 1];\n\t\tconst old_block = old_blocks[o - 1];\n\t\tconst new_key = new_block.key;\n\t\tconst old_key = old_block.key;\n\t\tif (new_block === old_block) {\n\t\t\t// do nothing\n\t\t\tnext = new_block.first;\n\t\t\to--;\n\t\t\tn--;\n\t\t} else if (!new_lookup.has(old_key)) {\n\t\t\t// remove old block\n\t\t\tdestroy(old_block, lookup);\n\t\t\to--;\n\t\t} else if (!lookup.has(new_key) || will_move.has(new_key)) {\n\t\t\tinsert(new_block);\n\t\t} else if (did_move.has(old_key)) {\n\t\t\to--;\n\t\t} else if (deltas.get(new_key) > deltas.get(old_key)) {\n\t\t\tdid_move.add(new_key);\n\t\t\tinsert(new_block);\n\t\t} else {\n\t\t\twill_move.add(old_key);\n\t\t\to--;\n\t\t}\n\t}\n\twhile (o--) {\n\t\tconst old_block = old_blocks[o];\n\t\tif (!new_lookup.has(old_block.key)) destroy(old_block, lookup);\n\t}\n\twhile (n) insert(new_blocks[n - 1]);\n\trun_all(updates);\n\treturn new_blocks;\n}\n\n/** @returns {void} */\nexport function validate_each_keys(ctx, list, get_context, get_key) {\n\tconst keys = new Map();\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst key = get_key(get_context(ctx, list, i));\n\t\tif (keys.has(key)) {\n\t\t\tlet value = '';\n\t\t\ttry {\n\t\t\t\tvalue = `with value '${String(key)}' `;\n\t\t\t} catch (e) {\n\t\t\t\t// can't stringify\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot have duplicate keys in a keyed each: Keys at index ${keys.get(\n\t\t\t\t\tkey\n\t\t\t\t)} and ${i} ${value}are duplicates`\n\t\t\t);\n\t\t}\n\t\tkeys.set(key, i);\n\t}\n}\n","import {\n\tadd_render_callback,\n\tflush,\n\tflush_render_callbacks,\n\tschedule_update,\n\tdirty_components\n} from './scheduler.js';\nimport { current_component, set_current_component } from './lifecycle.js';\nimport { blank_object, is_empty, is_function, run, run_all, noop } from './utils.js';\nimport {\n\tchildren,\n\tdetach,\n\tstart_hydrating,\n\tend_hydrating,\n\tget_custom_elements_slots,\n\tinsert,\n\telement,\n\tattr\n} from './dom.js';\nimport { transition_in } from './transitions.js';\n\n/** @returns {void} */\nexport function bind(component, name, callback) {\n\tconst index = component.$$.props[name];\n\tif (index !== undefined) {\n\t\tcomponent.$$.bound[index] = callback;\n\t\tcallback(component.$$.ctx[index]);\n\t}\n}\n\n/** @returns {void} */\nexport function create_component(block) {\n\tblock && block.c();\n}\n\n/** @returns {void} */\nexport function claim_component(block, parent_nodes) {\n\tblock && block.l(parent_nodes);\n}\n\n/** @returns {void} */\nexport function mount_component(component, target, anchor) {\n\tconst { fragment, after_update } = component.$$;\n\tfragment && fragment.m(target, anchor);\n\t// onMount happens before the initial afterUpdate\n\tadd_render_callback(() => {\n\t\tconst new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n\t\t// if the component was destroyed immediately\n\t\t// it will update the `$$.on_destroy` reference to `null`.\n\t\t// the destructured on_destroy may still reference to the old array\n\t\tif (component.$$.on_destroy) {\n\t\t\tcomponent.$$.on_destroy.push(...new_on_destroy);\n\t\t} else {\n\t\t\t// Edge case - component was destroyed immediately,\n\t\t\t// most likely as a result of a binding initialising\n\t\t\trun_all(new_on_destroy);\n\t\t}\n\t\tcomponent.$$.on_mount = [];\n\t});\n\tafter_update.forEach(add_render_callback);\n}\n\n/** @returns {void} */\nexport function destroy_component(component, detaching) {\n\tconst $$ = component.$$;\n\tif ($$.fragment !== null) {\n\t\tflush_render_callbacks($$.after_update);\n\t\trun_all($$.on_destroy);\n\t\t$$.fragment && $$.fragment.d(detaching);\n\t\t// TODO null out other refs, including component.$$ (but need to\n\t\t// preserve final state?)\n\t\t$$.on_destroy = $$.fragment = null;\n\t\t$$.ctx = [];\n\t}\n}\n\n/** @returns {void} */\nfunction make_dirty(component, i) {\n\tif (component.$$.dirty[0] === -1) {\n\t\tdirty_components.push(component);\n\t\tschedule_update();\n\t\tcomponent.$$.dirty.fill(0);\n\t}\n\tcomponent.$$.dirty[(i / 31) | 0] |= 1 << i % 31;\n}\n\n// TODO: Document the other params\n/**\n * @param {SvelteComponent} component\n * @param {import('./public.js').ComponentConstructorOptions} options\n *\n * @param {import('./utils.js')['not_equal']} not_equal Used to compare props and state values.\n * @param {(target: Element | ShadowRoot) => void} [append_styles] Function that appends styles to the DOM when the component is first initialised.\n * This will be the `add_css` function from the compiled component.\n *\n * @returns {void}\n */\nexport function init(\n\tcomponent,\n\toptions,\n\tinstance,\n\tcreate_fragment,\n\tnot_equal,\n\tprops,\n\tappend_styles = null,\n\tdirty = [-1]\n) {\n\tconst parent_component = current_component;\n\tset_current_component(component);\n\t/** @type {import('./private.js').T$$} */\n\tconst $$ = (component.$$ = {\n\t\tfragment: null,\n\t\tctx: [],\n\t\t// state\n\t\tprops,\n\t\tupdate: noop,\n\t\tnot_equal,\n\t\tbound: blank_object(),\n\t\t// lifecycle\n\t\ton_mount: [],\n\t\ton_destroy: [],\n\t\ton_disconnect: [],\n\t\tbefore_update: [],\n\t\tafter_update: [],\n\t\tcontext: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n\t\t// everything else\n\t\tcallbacks: blank_object(),\n\t\tdirty,\n\t\tskip_bound: false,\n\t\troot: options.target || parent_component.$$.root\n\t});\n\tappend_styles && append_styles($$.root);\n\tlet ready = false;\n\t$$.ctx = instance\n\t\t? instance(component, options.props || {}, (i, ret, ...rest) => {\n\t\t\t\tconst value = rest.length ? rest[0] : ret;\n\t\t\t\tif ($$.ctx && not_equal($$.ctx[i], ($$.ctx[i] = value))) {\n\t\t\t\t\tif (!$$.skip_bound && $$.bound[i]) $$.bound[i](value);\n\t\t\t\t\tif (ready) make_dirty(component, i);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t  })\n\t\t: [];\n\t$$.update();\n\tready = true;\n\trun_all($$.before_update);\n\t// `false` as a special case of no DOM component\n\t$$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n\tif (options.target) {\n\t\tif (options.hydrate) {\n\t\t\tstart_hydrating();\n\t\t\t// TODO: what is the correct type here?\n\t\t\t// @ts-expect-error\n\t\t\tconst nodes = children(options.target);\n\t\t\t$$.fragment && $$.fragment.l(nodes);\n\t\t\tnodes.forEach(detach);\n\t\t} else {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t$$.fragment && $$.fragment.c();\n\t\t}\n\t\tif (options.intro) transition_in(component.$$.fragment);\n\t\tmount_component(component, options.target, options.anchor);\n\t\tend_hydrating();\n\t\tflush();\n\t}\n\tset_current_component(parent_component);\n}\n\nexport let SvelteElement;\n\nif (typeof HTMLElement === 'function') {\n\tSvelteElement = class extends HTMLElement {\n\t\t/** The Svelte component constructor */\n\t\t$$ctor;\n\t\t/** Slots */\n\t\t$$s;\n\t\t/** The Svelte component instance */\n\t\t$$c;\n\t\t/** Whether or not the custom element is connected */\n\t\t$$cn = false;\n\t\t/** Component props data */\n\t\t$$d = {};\n\t\t/** `true` if currently in the process of reflecting component props back to attributes */\n\t\t$$r = false;\n\t\t/** @type {Record<string, CustomElementPropDefinition>} Props definition (name, reflected, type etc) */\n\t\t$$p_d = {};\n\t\t/** @type {Record<string, Function[]>} Event listeners */\n\t\t$$l = {};\n\t\t/** @type {Map<Function, Function>} Event listener unsubscribe functions */\n\t\t$$l_u = new Map();\n\n\t\tconstructor($$componentCtor, $$slots, use_shadow_dom) {\n\t\t\tsuper();\n\t\t\tthis.$$ctor = $$componentCtor;\n\t\t\tthis.$$s = $$slots;\n\t\t\tif (use_shadow_dom) {\n\t\t\t\tthis.attachShadow({ mode: 'open' });\n\t\t\t}\n\t\t}\n\n\t\taddEventListener(type, listener, options) {\n\t\t\t// We can't determine upfront if the event is a custom event or not, so we have to\n\t\t\t// listen to both. If someone uses a custom event with the same name as a regular\n\t\t\t// browser event, this fires twice - we can't avoid that.\n\t\t\tthis.$$l[type] = this.$$l[type] || [];\n\t\t\tthis.$$l[type].push(listener);\n\t\t\tif (this.$$c) {\n\t\t\t\tconst unsub = this.$$c.$on(type, listener);\n\t\t\t\tthis.$$l_u.set(listener, unsub);\n\t\t\t}\n\t\t\tsuper.addEventListener(type, listener, options);\n\t\t}\n\n\t\tremoveEventListener(type, listener, options) {\n\t\t\tsuper.removeEventListener(type, listener, options);\n\t\t\tif (this.$$c) {\n\t\t\t\tconst unsub = this.$$l_u.get(listener);\n\t\t\t\tif (unsub) {\n\t\t\t\t\tunsub();\n\t\t\t\t\tthis.$$l_u.delete(listener);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tasync connectedCallback() {\n\t\t\tthis.$$cn = true;\n\t\t\tif (!this.$$c) {\n\t\t\t\t// We wait one tick to let possible child slot elements be created/mounted\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tif (!this.$$cn) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfunction create_slot(name) {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlet node;\n\t\t\t\t\t\tconst obj = {\n\t\t\t\t\t\t\tc: function create() {\n\t\t\t\t\t\t\t\tnode = element('slot');\n\t\t\t\t\t\t\t\tif (name !== 'default') {\n\t\t\t\t\t\t\t\t\tattr(node, 'name', name);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * @param {HTMLElement} target\n\t\t\t\t\t\t\t * @param {HTMLElement} [anchor]\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tm: function mount(target, anchor) {\n\t\t\t\t\t\t\t\tinsert(target, node, anchor);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\td: function destroy(detaching) {\n\t\t\t\t\t\t\t\tif (detaching) {\n\t\t\t\t\t\t\t\t\tdetach(node);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn obj;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst $$slots = {};\n\t\t\t\tconst existing_slots = get_custom_elements_slots(this);\n\t\t\t\tfor (const name of this.$$s) {\n\t\t\t\t\tif (name in existing_slots) {\n\t\t\t\t\t\t$$slots[name] = [create_slot(name)];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const attribute of this.attributes) {\n\t\t\t\t\t// this.$$data takes precedence over this.attributes\n\t\t\t\t\tconst name = this.$$g_p(attribute.name);\n\t\t\t\t\tif (!(name in this.$$d)) {\n\t\t\t\t\t\tthis.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, 'toProp');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.$$c = new this.$$ctor({\n\t\t\t\t\ttarget: this.shadowRoot || this,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...this.$$d,\n\t\t\t\t\t\t$$slots,\n\t\t\t\t\t\t$$scope: {\n\t\t\t\t\t\t\tctx: []\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Reflect component props as attributes\n\t\t\t\tconst reflect_attributes = () => {\n\t\t\t\t\tthis.$$r = true;\n\t\t\t\t\tfor (const key in this.$$p_d) {\n\t\t\t\t\t\tthis.$$d[key] = this.$$c.$$.ctx[this.$$c.$$.props[key]];\n\t\t\t\t\t\tif (this.$$p_d[key].reflect) {\n\t\t\t\t\t\t\tconst attribute_value = get_custom_element_value(\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\tthis.$$d[key],\n\t\t\t\t\t\t\t\tthis.$$p_d,\n\t\t\t\t\t\t\t\t'toAttribute'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (attribute_value == null) {\n\t\t\t\t\t\t\t\tthis.removeAttribute(this.$$p_d[key].attribute || key);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.setAttribute(this.$$p_d[key].attribute || key, attribute_value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.$$r = false;\n\t\t\t\t};\n\t\t\t\tthis.$$c.$$.after_update.push(reflect_attributes);\n\t\t\t\treflect_attributes(); // once initially because after_update is added too late for first render\n\n\t\t\t\tfor (const type in this.$$l) {\n\t\t\t\t\tfor (const listener of this.$$l[type]) {\n\t\t\t\t\t\tconst unsub = this.$$c.$on(type, listener);\n\t\t\t\t\t\tthis.$$l_u.set(listener, unsub);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.$$l = {};\n\t\t\t}\n\t\t}\n\n\t\t// We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte\n\t\t// and setting attributes through setAttribute etc, this is helpful\n\t\tattributeChangedCallback(attr, _oldValue, newValue) {\n\t\t\tif (this.$$r) return;\n\t\t\tattr = this.$$g_p(attr);\n\t\t\tthis.$$d[attr] = get_custom_element_value(attr, newValue, this.$$p_d, 'toProp');\n\t\t\tthis.$$c?.$set({ [attr]: this.$$d[attr] });\n\t\t}\n\n\t\tdisconnectedCallback() {\n\t\t\tthis.$$cn = false;\n\t\t\t// In a microtask, because this could be a move within the DOM\n\t\t\tPromise.resolve().then(() => {\n\t\t\t\tif (!this.$$cn) {\n\t\t\t\t\tthis.$$c.$destroy();\n\t\t\t\t\tthis.$$c = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t$$g_p(attribute_name) {\n\t\t\treturn (\n\t\t\t\tObject.keys(this.$$p_d).find(\n\t\t\t\t\t(key) =>\n\t\t\t\t\t\tthis.$$p_d[key].attribute === attribute_name ||\n\t\t\t\t\t\t(!this.$$p_d[key].attribute && key.toLowerCase() === attribute_name)\n\t\t\t\t) || attribute_name\n\t\t\t);\n\t\t}\n\t};\n}\n\n/**\n * @param {string} prop\n * @param {any} value\n * @param {Record<string, CustomElementPropDefinition>} props_definition\n * @param {'toAttribute' | 'toProp'} [transform]\n */\nfunction get_custom_element_value(prop, value, props_definition, transform) {\n\tconst type = props_definition[prop]?.type;\n\tvalue = type === 'Boolean' && typeof value !== 'boolean' ? value != null : value;\n\tif (!transform || !props_definition[prop]) {\n\t\treturn value;\n\t} else if (transform === 'toAttribute') {\n\t\tswitch (type) {\n\t\t\tcase 'Object':\n\t\t\tcase 'Array':\n\t\t\t\treturn value == null ? null : JSON.stringify(value);\n\t\t\tcase 'Boolean':\n\t\t\t\treturn value ? '' : null;\n\t\t\tcase 'Number':\n\t\t\t\treturn value == null ? null : value;\n\t\t\tdefault:\n\t\t\t\treturn value;\n\t\t}\n\t} else {\n\t\tswitch (type) {\n\t\t\tcase 'Object':\n\t\t\tcase 'Array':\n\t\t\t\treturn value && JSON.parse(value);\n\t\t\tcase 'Boolean':\n\t\t\t\treturn value; // conversion already handled above\n\t\t\tcase 'Number':\n\t\t\t\treturn value != null ? +value : value;\n\t\t\tdefault:\n\t\t\t\treturn value;\n\t\t}\n\t}\n}\n\n/**\n * @internal\n *\n * Turn a Svelte component into a custom element.\n * @param {import('./public.js').ComponentType} Component  A Svelte component constructor\n * @param {Record<string, CustomElementPropDefinition>} props_definition  The props to observe\n * @param {string[]} slots  The slots to create\n * @param {string[]} accessors  Other accessors besides the ones for props the component has\n * @param {boolean} use_shadow_dom  Whether to use shadow DOM\n * @param {(ce: new () => HTMLElement) => new () => HTMLElement} [extend]\n */\nexport function create_custom_element(\n\tComponent,\n\tprops_definition,\n\tslots,\n\taccessors,\n\tuse_shadow_dom,\n\textend\n) {\n\tlet Class = class extends SvelteElement {\n\t\tconstructor() {\n\t\t\tsuper(Component, slots, use_shadow_dom);\n\t\t\tthis.$$p_d = props_definition;\n\t\t}\n\t\tstatic get observedAttributes() {\n\t\t\treturn Object.keys(props_definition).map((key) =>\n\t\t\t\t(props_definition[key].attribute || key).toLowerCase()\n\t\t\t);\n\t\t}\n\t};\n\tObject.keys(props_definition).forEach((prop) => {\n\t\tObject.defineProperty(Class.prototype, prop, {\n\t\t\tget() {\n\t\t\t\treturn this.$$c && prop in this.$$c ? this.$$c[prop] : this.$$d[prop];\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tvalue = get_custom_element_value(prop, value, props_definition);\n\t\t\t\tthis.$$d[prop] = value;\n\t\t\t\tthis.$$c?.$set({ [prop]: value });\n\t\t\t}\n\t\t});\n\t});\n\taccessors.forEach((accessor) => {\n\t\tObject.defineProperty(Class.prototype, accessor, {\n\t\t\tget() {\n\t\t\t\treturn this.$$c?.[accessor];\n\t\t\t}\n\t\t});\n\t});\n\tif (extend) {\n\t\t// @ts-expect-error - assigning here is fine\n\t\tClass = extend(Class);\n\t}\n\tComponent.element = /** @type {any} */ (Class);\n\treturn Class;\n}\n\n/**\n * Base class for Svelte components. Used when dev=false.\n *\n * @template {Record<string, any>} [Props=any]\n * @template {Record<string, any>} [Events=any]\n */\nexport class SvelteComponent {\n\t/**\n\t * ### PRIVATE API\n\t *\n\t * Do not use, may change at any time\n\t *\n\t * @type {any}\n\t */\n\t$$ = undefined;\n\t/**\n\t * ### PRIVATE API\n\t *\n\t * Do not use, may change at any time\n\t *\n\t * @type {any}\n\t */\n\t$$set = undefined;\n\n\t/** @returns {void} */\n\t$destroy() {\n\t\tdestroy_component(this, 1);\n\t\tthis.$destroy = noop;\n\t}\n\n\t/**\n\t * @template {Extract<keyof Events, string>} K\n\t * @param {K} type\n\t * @param {((e: Events[K]) => void) | null | undefined} callback\n\t * @returns {() => void}\n\t */\n\t$on(type, callback) {\n\t\tif (!is_function(callback)) {\n\t\t\treturn noop;\n\t\t}\n\t\tconst callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);\n\t\tcallbacks.push(callback);\n\t\treturn () => {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index !== -1) callbacks.splice(index, 1);\n\t\t};\n\t}\n\n\t/**\n\t * @param {Partial<Props>} props\n\t * @returns {void}\n\t */\n\t$set(props) {\n\t\tif (this.$$set && !is_empty(props)) {\n\t\t\tthis.$$.skip_bound = true;\n\t\t\tthis.$$set(props);\n\t\t\tthis.$$.skip_bound = false;\n\t\t}\n\t}\n}\n\n/**\n * @typedef {Object} CustomElementPropDefinition\n * @property {string} [attribute]\n * @property {boolean} [reflect]\n * @property {'String'|'Boolean'|'Number'|'Array'|'Object'} [type]\n */\n","// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nexport const VERSION = '4.2.2';\nexport const PUBLIC_VERSION = '4';\n","import { PUBLIC_VERSION } from '../../../shared/version.js';\n\nif (typeof window !== 'undefined')\n\t// @ts-ignore\n\t(window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION);\n","// @ts-check\r\n\r\n/**\r\n * @module network/NetworkError\r\n */\r\n\r\n/** Class representing a network error */\r\nexport default class NetworkError extends Error {\r\n    /**\r\n     * Create a NetworkError\r\n     * @param {string} message - Error description (inherited from Error)\r\n     * @param {Object} response - HTTP response object\r\n     */\r\n    constructor(\r\n        message,\r\n        response\r\n    ) {\r\n        super(message);\r\n\r\n        this.response = response;\r\n    }\r\n};\r\n","/**\r\n * HTTP Status Codes.\r\n * @module network/responseStatuses\r\n */\r\nexport const ResponseStatuses = Object.freeze({\r\n    // Success\r\n    ok: 200,\r\n    created: 201,\r\n    accepted: 202,\r\n    nonAuthoritativeInformation: 203,\r\n    noContent: 204,\r\n    resetContent: 205,\r\n    partialContent: 206,\r\n    // Redirection\r\n    multipleChoices: 300,\r\n    movedPermanently: 301,\r\n    found: 302,\r\n    seeOther: 303,\r\n    notModified: 304,\r\n    useProxy: 305,\r\n    temporaryRedirect: 307,\r\n    // Client error\r\n    badRequest: 400,\r\n    unauthorized: 401,\r\n    paymentRequired: 402,\r\n    forbidden: 403,\r\n    notFound: 404,\r\n    methodNotAllowed: 405,\r\n    notAcceptable: 406,\r\n    proxyAuthenticationRequired: 407,\r\n    requestTimeout: 408,\r\n    conflict: 409,\r\n    gone: 410,\r\n    // Server error\r\n    internalServerError: 500,\r\n    notImplemented: 501,\r\n    badGateway: 502,\r\n    serviceUnavailable: 503,\r\n    gatewayTimeout: 504,\r\n    httpVersionNotSupported: 505,\r\n});\r\n","// @ts-check\r\n\r\n/**\r\n * @module network/fetch\r\n */\r\n\r\nimport NetworkError from './NetworkError';\r\nimport { ResponseStatuses } from './responseStatuses';\r\n\r\n/**\r\n * Fires a networked POST request with data serialized to json to an api\r\n * endpoint with the required options for api calls in itslearning\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function post(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('POST', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked PUT request with data serialized to json to an api\r\n * endpoint with the required options for api calls in itslearning\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function put(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('PUT', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked PATCH request with data serialized to json to an api endpoint\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function patch(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('PATCH', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked DELETE request with data serialized to json to an api endpoint - delete is a reserved\r\n * word in javascript so this method is called del\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function del(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('DELETE', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked GET request to an endpoint\r\n * @param {string} url - the url of the endpoint to GET\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function get(url, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('GET', undefined, options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * @param {Response} response The fetch response which may or may not be json\r\n * @returns {any} The parsed JSON response, undefined if there is no content or the text content of the response\r\n * @throws {Error} When response is not OK. And error object would have its response property initialized with rejected resonse object.\r\n */\r\nexport function tryParseResponse(response) {\r\n    if (!response.ok) {\r\n        throw new NetworkError(response.statusText, response);\r\n    }\r\n\r\n    // In case of 204 - NO CONTENT return undefined\r\n    if (response.status === ResponseStatuses.noContent) {\r\n        return new Promise((resolve) => resolve(undefined));\r\n    }\r\n\r\n    // response body can only be read once so clone before trying .json()\r\n    // so that we can fall back to .text() if needed\r\n    return response.clone().json().catch(() => response.text());\r\n}\r\n\r\n/**\r\n * Fires a networked GET request to an endpoint with the required options for\r\n * api calls in itslearning\r\n * @param {string} method - The method this fetch request will use (GET, PATCH, POST, DELETE, PUT)\r\n * @param {string} [body] - What to send as the fetch request's body\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {object} A RequestInit object for fetch request options\r\n */\r\nexport function fetchOptions(method, body, options) {\r\n    return {\r\n        method,\r\n        mode: options.mode !== undefined ? options.mode : 'cors',\r\n        cache: options.cache !== undefined ? options.cache : 'default',\r\n        credentials: options.credentials !== undefined ? options.credentials : 'same-origin',\r\n        headers: Object.assign({\r\n            'Content-Type': 'application/json; charset=utf-8',\r\n        }, options.headers),\r\n        body,\r\n    };\r\n}\r\n","// @ts-check\r\n\r\n/**\r\n * @module network/fetchJson\r\n */\r\n\r\nimport { post, get } from './fetch';\r\n\r\n/**\r\n * This method is preserved here for backwards compatibility but has been moved\r\n * to ./fetch.js as `post`\r\n *\r\n * Fires a networked POST request with data serialized to json to an api\r\n * endpoint with the required options for api calls in itslearning\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache=default] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport const postJson = post;\r\n\r\n/**\r\n *  * This method is preserved here for backwards compatibility but has been moved\r\n * to ./fetch.js as `get`\r\n *\r\n * Fires a networked GET request to an endpoint with the required options for\r\n * api calls in itslearning\r\n * @param {string} url - the url of the endpoint to GET\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache=default] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api\r\n */\r\nexport const getJson = get;\r\n","<div class=\"prom-avatar {sizeClass}\">\n    {#if length}\n        {#if (typeof src !== 'string') && length > 1}\n            <div class=\"prom-avatar__images {numberClass}\">\n                {#each avatars as avatar, i}\n                    {#if avatar}\n                        <img class=\"prom-avatar__image\" src={avatar} alt={alternativeText[i] || \"\"} />\n                    {:else}\n                        <div class=\"prom-avatar__image\"></div>\n                    {/if}\n                {/each}\n            </div>\n        {:else}\n            {#if avatars[0]}\n                <img class=\"prom-avatar__image\" src={avatars[0]} alt={altAvatarDescriptions[0] || \"\"} />\n            {:else}\n                <div class=\"prom-avatar__image\"></div>\n            {/if}\n        {/if}\n    {:else}\n        <div class=\"prom-avatar__image\"></div>\n    {/if}\n</div>\n\n<script>\n    $: sizeClass = `prom-avatar--${size}`;\n\n    /** @type {number} */\n    export let size = 200;\n    /** @type {string|string[]} */\n    export let src = [];\n    /** @type {string|string[]} */\n    export let alternativeText = [];\n\n    $: length = src ? src.length : undefined;\n\n    $: avatars = (typeof src === 'string')\n        ? [src]\n        : getFirstThree(src);\n\n    $: altAvatarDescriptions = (typeof alternativeText === 'string')\n        ? [alternativeText]\n        : getFirstThree(alternativeText);\n    $: numberClass = (typeof src === 'string') ? '' : getNumberClass(length);\n\n    function getNumberClass(length) {\n        switch(length) {\n            case 1: return 'prom-avatar--1';\n            case 2: return 'prom-avatar--2';\n            default: return 'prom-avatar--3';\n        }\n    }\n\n    function getFirstThree(src) {\n        return Array.isArray(src)\n            ? src.slice(0, 3)\n            : src;\n    }\n</script>\n","<script>\n  /** @type {'basic'|'basic-negative'|'primary'|'secondary'|'destructive'|'plain'} */\n  export let type = \"basic\";\n\n  /** @type {boolean} */\n  export let iconOnly = false;\n\n  /** @type {string} */\n  export let id = undefined;\n\n  /** @type {string} */\n  export let cssClass = \"\";\n\n  /** @type {string} */\n  export let text = \"\";\n\n  /** @type {boolean} */\n  export let large = false;\n\n  /** @type {boolean} */\n  export let disabled = false;\n\n  /** @type {boolean} */\n  export let loading = false;\n\n  /** @type {'submit'|'button'|'reset'} */\n  export let htmlType = \"submit\";\n\n  /** @type {'false'|'true'|'menu'|'listbox'|'tree'|'grid'|'dialog'} */\n  export let haspopup = undefined;\n\n  /** @type {boolean} */\n  export let expanded = undefined;\n\n  /** @type {string | undefined} */\n  export let ariaLabel = undefined;\n\n  /** @type {string | undefined} */\n  export let describedby = undefined;\n\n  /** @type {string | undefined} */\n  export let labelledby = undefined;\n\n  $: visuallyHidden = iconOnly ? \"prom-button__text--hidden\" : \"\";\n  $: isLarge = large ? \"prom-button--large\" : \"\";\n  $: isLoading = loading ? \"prom-button--loading\" : \"\";\n  $: isActive = !loading && !disabled;\n  $: ariaLabelText = ariaLabel \n    ? ariaLabel\n    : (iconOnly ? text : undefined);\n</script>\n\n<button\n  aria-haspopup={haspopup}\n  aria-expanded={expanded}\n  aria-label={ariaLabelText}\n  aria-labelledby={labelledby}\n  aria-describedby={describedby}\n  {id}\n  type={htmlType}\n  class=\"prom-button prom-button__{type} {cssClass} {isLoading} {isLarge}\"\n  {disabled}\n  data-active={isActive}\n  on:click\n  on:focus\n  on:blur\n  on:keyup\n  on:keydown\n>\n  <span class=\"prom-button__text\">\n    <span class={visuallyHidden}>{text}</span>\n  </span>\n</button>\n","{#if textOnly && iconOnly}\n    <Button\n        cssClass=\"prom-icon-button {iconPlacementClass} {iconClass}\"\n        {disabled}\n        {haspopup}\n        {expanded}\n        {id}\n        {large}\n        {loading}\n        {text}\n        {type}\n        {htmlType}\n        {ariaLabel}\n        {labelledby}\n        {describedby}\n        on:blur\n        on:click\n        on:focus\n        on:keyup\n        on:keydown\n    >\n    </Button>\n{:else if textOnly}\n    <Button\n        cssClass=\"prom-icon-button {textOnlyClass}\"\n        {disabled}\n        {haspopup}\n        {expanded}\n        {iconOnly}\n        {id}\n        {large}\n        {loading}\n        {text}\n        {type}\n        {htmlType}\n        {ariaLabel}\n        {labelledby}\n        {describedby}\n        on:blur\n        on:click\n        on:focus\n        on:keyup\n        on:keydown\n    >\n    </Button>\n{:else}\n    <Button\n        cssClass=\"prom-icon-button {iconOnlyClass} {iconPlacementClass} {iconClass}\"\n        {disabled}\n        {haspopup}\n        {expanded}\n        {iconOnly}\n        {id}\n        {large}\n        {loading}\n        {text}\n        {type}\n        {htmlType}\n        {ariaLabel}\n        {labelledby}\n        {describedby}\n        on:blur\n        on:click\n        on:focus\n        on:keyup\n        on:keydown\n    >\n    </Button>\n{/if}\n\n<script>\n    import Button from '../../Button/v1/Button.svelte';\n\n    /** @type {boolean} */\n    export let disabled = false;\n    /** @type {'false'|'true'|'menu'|'listbox'|'tree'|'grid'|'dialog'} */\n    export let haspopup = undefined;\n    /** @type {boolean} */\n    export let expanded = undefined;\n    /** @type {'submit'|'button'|'reset'} */\n    export let htmlType = 'submit';\n    /** @type {string} */\n    export let iconClass = '';\n    /** @type {boolean} */\n    export let iconOnly = false;\n    /** @type {'start'|'end'} */\n    export let iconPlacement = 'start';\n    /** @type {string} */\n    export let id = undefined;\n    /** @type {boolean} */\n    export let large = false;\n    /** @type {boolean} */\n    export let loading = false;\n    /** @type {string} */\n    export let text = '';\n    /** @type {boolean} */\n    export let textOnly = false;\n    /** @type {'basic'|'basic-negative'| 'primary'|'secondary'|'destructive'|'plain'} */\n    export let type = 'basic';\n    /** @type {string | undefined} */\n    export let ariaLabel = undefined;\n    /** @type {string | undefined} */\n    export let labelledby = undefined;\n    /** @type {string} */\n    export let describedby = undefined;\n\n    $: {\n        if (iconOnly && textOnly) {\n            console.warn('The attributes iconOnly and textOnly cannot be both set to false.');\n        }\n    }\n\n    $: {\n        if (!iconPlacement || typeof iconPlacement !== 'string' || (iconPlacement !== 'start' && iconPlacement !== 'end')) {\n            console.warn('Valid values for iconPlacement is \"start\" and \"end\".');\n        }\n    }\n\n    $: iconOnlyClass = iconOnly ? 'prom-icon-button--icon-only' : '';\n    $: textOnlyClass = textOnly ? 'prom-icon-button--text-only' : '';\n    $: iconPlacementClass = iconPlacement === 'end' ? 'prom-icon-button--icon-end' : '';\n</script>\n","<script>\n    import { onMount, createEventDispatcher } from 'svelte';\n    import IconButton from './../../../inputs/IconButton/v1/IconButton.svelte';\n\n    const dispatch = createEventDispatcher();\n\n    /** @type {'info'|'warning'|'loading'|'success'} */\n    export let type = 'info';\n    /** @type {boolean} */\n    export let visible = false;\n    /** @type {string} */\n    export let text = null;\n    /** @type {string} */\n    export let html = null;\n    /** @type {string} */\n    export let close = null;\n    /** @type {boolean} */\n    export let closable = true;\n    /** @type {'icon'|'secondary'} */\n    export let closeButtonType = 'icon';\n    /** @type {string} */\n    export let infoText = 'information';\n    /** @type {string} */\n    export let warningText = 'warning';\n    /** @type {string} */\n    export let loadingText = 'loading';\n    /** @type {string} */\n    export let successText = 'success';\n\n    /** internal */\n    let showMessage = false;\n\n    $: closeText =\n        close ||\n        !closable ||\n        console.warn('Banner close text is required but not included!');\n\n    let ariaLive = '';\n\n    $: {\n        ariaLive = { info: 'polite', warning: 'assertive' }[type] || 'polite';\n    }\n\n    let role = '';\n\n    $: {\n        role = { info: 'status', warning: 'alert' }[type] || 'status';\n    }\n\n    $: roleText = { info: infoText, warning: warningText, loading: loadingText, success: successText }[type];\n\n    $: onMount(() => {\n        if (visible) {\n            // Render the live-area container first, then show the message inside on the next frame\n            setTimeout(() => {\n                showMessage = visible;\n            }, 200);\n        }\n    });\n\n    $: {\n        // If the banner has been made visible show the message on the next frame\n        if (visible) {\n            setTimeout(() => {\n                showMessage = true;\n            }, 100);\n        } else {\n            showMessage = false;\n        }\n    }\n\n    function hide(event) {\n        visible = false;\n        dispatch('hidden', { event });\n    }\n</script>\n\n{#if visible}\n    <div class=\"prom-banner prom-banner--{type}\">\n        <div class=\"prom-banner__icon\" aria-hidden=\"true\"></div>\n        <span\n            class=\"prom-banner__message\"\n            aria-live=\"{ariaLive}\"\n            role=\"{role}\"\n            aria-atomic=\"true\">\n            {#if showMessage}\n                <span class=\"screen-reader\">{roleText}</span>\n                {#if text} {text} {/if}\n                {#if html} {@html html} {/if}\n                <slot />\n            {/if}\n        </span>\n        {#if closable}\n            <IconButton type=\"plain\" htmlType=\"button\" iconOnly={true} iconClass=\"close-button\" on:click=\"{hide}\"></IconButton>                     \n        {/if}\n    </div>\n{/if}\n","<div aria-live=\"polite\" class=\"screen-reader\">{liveRegionText}</div>\n{#if visible}\n    <div class:prom-loading-spinner-page={pageLoading}>\n        <div class=\"prom-loading-spinner {sizeClass}\"\n            role=\"progressbar\"\n            aria-label={label} \n            aria-valuemin={valueMin}\n            aria-valuemax={valueMax}\n            aria-valuenow={valueNow}\n            aria-valuetext={valueText}>\n            <div class=\"prom-loading-spinner__spinner {iconClass}\"></div>\n        </div>\n    </div>\n{/if}\n\n<script>\n    /** @type {'small'|'medium'|'large'} */\n    export let size = 'medium';\n    export let iconClass = '';\n    export let label;\n    export let statusText = undefined;\n    export let visible = false;\n    export let pageLoading = false;\n\n    export let progressEnabled = false;\n    export let progressMin = 0;\n    export let progressMax = 100;\n    export let progressValue = 0;\n    export let progressText = undefined;\n\n    $: sizeClass = `prom-loading-spinner--${size}`;\n    $: valueMin = progressEnabled ? progressMin : undefined;\n    $: valueMax = progressEnabled ? progressMax : undefined;\n    \n    $: valueNow = progressEnabled \n        ? (!isNaN(progressValue) ? progressValue : 0)\n        : (statusText ? 0 : undefined);\n    \n    $: valueText = progressEnabled \n        ? (progressText ? progressText : '')\n        : statusText;\n\n    $: liveRegionText = getLiveRegionText(visible, statusText, progressEnabled, progressText);\n\n    $: {\n        document.body.inert = visible && pageLoading;\n        document.body.classList.toggle(\"disable-scroll\", visible && pageLoading);\n    }\n    \n    function getLiveRegionText(visible, statusText, progressEnabled, progressText) {\n        if (visible) {\n            if (progressEnabled) {\n                return progressText ? progressText : '';\n            } else {\n                return statusText ? statusText : '';\n            }\n        } else {\n            return '';\n        }\n    }\n</script>\n","/**\n *  Make tab navigation loop within an element.\n */\n\n// Create attribute selectors to ignore when trying to find tabbables.\n/** @type {string} */\nconst nonTabbables = [\n    '[aria-hidden=\"true\"]',\n    '[disabled]',\n    '[hidden]',\n    '[type=\"hidden\"]',\n    '[tabindex=\"-1\"]'\n]\n    .map(selector => `:not(${selector})`)\n    .join('');\n\n// Select elements that are by default tabbable when tab navigating and\n// append the nonTabbables selectors to each.\n/** @type {string} */\nconst tabbables = [\n    `button`,\n    `[role=\"button\"]`,\n    `a[href]`,\n    `input`,\n    `[contentEditable=true]`,\n    `select`,\n    `textarea`,\n    `iframe`,\n    `[tabindex=\"0\"]`,\n    `audio`,\n    `video`\n]\n    .map(selector => `${selector}${nonTabbables}`)\n    .join(',');\n\nclass TabTrapper {\n    /**\n     * @param {HTMLElement} element\n     */\n    constructor(element) {\n        /** @type {Array<HTMLElement>} */\n        this.tabbables = [];\n\n        /** @type {HTMLElement} */\n        this.element = element;\n\n        /** @type {HTMLElement} */\n        this.innerDocBody = null;\n\n        this.element.addEventListener('keydown', this.maybeLoopFocus.bind(this));\n    }\n\n    teardown() {\n        this.element.removeEventListener('keydown', this.maybeLoopFocus);\n\n        if (this.innerDocBody) {\n            this.innerDocBody.removeEventListener('keydown', this.maybeLoopFocus.bind(this));\n        }\n    }\n\n    /**\n     * Reselects tabbable elements. This function should be called on each\n     * update of element contents.\n     */\n    init() {\n        /** @type {NodeListOf<Element>} */\n        const elements = this.element.querySelectorAll(tabbables);\n\n        /** @type {Array<HTMLElement>} */\n        const visibleTabbables = removeInvisibles(elements);\n\n        /** @type {HTMLElement} */\n        this.firstTabbable = visibleTabbables[0];\n\n        /** @type {HTMLElement} */\n        this.lastTabbable = visibleTabbables[visibleTabbables.length - 1];\n    }\n\n    /**\n     * Advance focus to next tabbable element if the event is a TAB key press\n     *\n     * @param {KeyboardEvent} event\n     */\n    maybeLoopFocus(event) {\n        if (event.key !== 'Tab') {\n            return;\n        }\n\n        if (!event.shiftKey && event.target === this.lastTabbable) {\n            event.preventDefault();\n            if (this.firstTabbable.nodeName === 'INPUT' && this.firstTabbable.type === 'radio') {\n                const selectedElement = document.querySelector(`input[name=\"${this.firstTabbable.name}\"]:checked`);\n                selectedElement\n                    ? selectedElement.focus()\n                    : this.firstTabbable.focus();\n            } else {\n                this.firstTabbable.focus();\n            }\n        }\n\n        if (event.shiftKey && (event.target === this.firstTabbable || isInSameRadioGroup(event.target, this.firstTabbable))) {\n            event.preventDefault();\n            this.lastTabbable.focus();\n        }\n    }\n\n    /**\n     * Update last tabbable if the last element is an iframe\n     *\n     * @param {HTMLElement} innerDocBody document body of inner iframe\n     */\n    updateLastTabbableIfIframeIsTheLastElement(innerDocBody) {\n        this.innerDocBody = innerDocBody;\n\n        const elements = innerDocBody.querySelectorAll(tabbables);\n        const visibleTabbables = removeInvisibles(elements);\n\n        if (visibleTabbables.length === 0) {\n            this.lastTabbable = innerDocBody;\n        } else {\n            this.lastTabbable = visibleTabbables[visibleTabbables.length - 1];\n        }\n\n        innerDocBody.addEventListener('keydown', this.maybeLoopFocus.bind(this));\n    }\n}\n\nexport default TabTrapper;\n\n/**\n * This may have an issue with screen reader only elements, it needs to be tested.\n *\n * @param {NodeListOf<Element>} elements\n * @return {Array<HTMLElement>} All elements that have computed style of visisble.\n */\nfunction removeInvisibles(elements) {\n    return [].filter.call(elements, element => {\n        return element.style.visibility !== 'hidden' &&\n            element.style.display !== 'none';\n    });\n}\n\nfunction isInSameRadioGroup(element1, element2) {\n    return element1.nodeName === 'INPUT' && element1.type === 'radio' &&\n        element2.nodeName === 'INPUT' && element2.type === 'radio' && element1.name === element2.name;\n}\n","/**\n * Known keys. You don't need to import this as you would still be able to use normalized string.\n * @module keyboard/keys\n */\nexport const Keys = {\n    BACKSPACE: 'Backspace',\n    DOWN: 'Down',\n    ENTER: 'Enter',\n    ESCAPE: 'Escape',\n    LEFT: 'Left',\n    RIGHT: 'Right',\n    SHIFT: 'Shift',\n    SPACE: 'Space',\n    TAB: 'Tab',\n    UP: 'Up',\n};\n","/**\n * Helper function to normalize key string identifiers.\n * @module keyboard/normalize\n */\n\nimport { Keys } from './keys';\n\n/**\n * Normalizes keys for convenience.\n *\n * @param {string} key The key that should be normalized.\n * @return {string} A normalized representation of the requested key.\n */\nexport function normalizeKey(key) {\n    switch (key) {\n        case 'Down':\n        case 'ArrowDown':\n            return Keys.DOWN;\n        case 'Left':\n        case 'ArrowLeft':\n            return Keys.LEFT;\n        case 'Right':\n        case 'ArrowRight':\n            return Keys.RIGHT;\n        case 'Up':\n        case 'ArrowUp':\n            return Keys.UP;\n        case 'Enter':\n            return Keys.ENTER;\n        case 'Esc':\n        case 'Escape':\n            return Keys.ESCAPE;\n        case 'Spacebar':\n        case ' ':\n            return Keys.SPACE;\n        case 'Tab':\n            return Keys.TAB;\n        case 'Backspace':\n            return Keys.BACKSPACE;\n\n        default:\n            return key;\n    }\n}\n","<!--htmlhint inline-style-disabled:false -->\n\n<svelte:window on:keyup={keyUpHandler} on:resize={windowResize} />\n\n{#if enabled}\n    <div class=\"prom-modal2__wrapper\">\n        <div class=\"prom-modal2__backdrop\" on:click={() => clickOutsideCloses && cancel()}></div>\n        <section\n            {id}\n            bind:this={dialogElement}\n            role=\"dialog\"\n            class=\"prom-modal2__dialog\"\n            class:prom-modal2__dialog--wide={wide}\n            style={modalStyle}\n            aria-labelledby=\"{id}-header\"\n            aria-describedby={describedById}\n            aria-modal=\"true\">\n\n            <h1 id=\"{id}-header\" class=\"prom-modal2__header\">\n                <slot name=\"title\" />\n                {#if titleText}{titleText}{/if}\n            </h1>\n\n            <div class=\"prom-modal2__inner\">\n                <div\n                    class=\"prom-modal2__content\"\n                    bind:this={contentElement}\n                    on:scroll={contentScroll}>\n\n                    {#if $$slots.banner}\n                        <div class=\"prom-modal2__banner-slot\">\n                            <slot name=\"banner\" />\n                        </div>\n                    {/if}\n\n                    {#if !titleOnly}\n                        <div id=\"{id}-body\" class=\"prom-modal2__body\" class:prom-modal2__body--scroll={scrollBody}>\n                            <slot name=\"body\" />\n                            {#if bodyText}{bodyText}{/if}\n                            {#if bodyHtml}{@html bodyHtml}{/if}\n                        </div>\n                    {/if}\n                </div>\n\n                <div class=\"prom-modal2__content-gradient\">\n                    <div\n                        class=\"prom-modal2__content-gradient--inner\"\n                        style={gradientStyle}\n                    ></div>\n                </div>\n\n                <div class=\"prom-modal2__footer\">\n                    <slot name=\"footer\">\n                        <Button\n                            type={confirmButtonType}\n                            htmlType=\"button\"\n                            on:click={confirm}\n                            text={confirmText}\n                            large\n                        />\n                        {#if showCancel}\n                        <Button\n                            type={cancelButtonType}\n                            htmlType=\"button\"\n                            on:click={cancel}\n                            text={cancelText}\n                            large\n                        />\n                        {/if}\n                    </slot>\n                </div>\n\n            </div>\n        </section>\n    </div>\n{/if}\n\n<script>\n    import TabTrapHelper from '../../../../lib/helpers/TabTrapHelper';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import Button from '../../../inputs/Button/v1/Button.svelte';\n    import { createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    /** @type {string} Defaults to a random string */\n    export let id = Math.random().toString(36).substr(2, 16);\n    /** @type {boolean} */\n    export let enabled = false;\n    /** @type {boolean} */\n    export let wide = false;\n    /** @type {boolean} */\n    export let titleOnly = false;\n    /** @type {string} */\n    export let confirmText = undefined;\n    /** @type {string} */\n    export let cancelText = undefined;\n    /** @type {string} */\n    export let titleText = undefined;\n    /** @type {string} */\n    export let bodyText = undefined;\n    /** @type {string} */\n    export let bodyHtml = undefined;\n    /** @type {boolean} If the cancel button should be included, remember even without it\n     * the modal can still be canceled with escape or clicking the backdrop.*/\n    export let showCancel = true;\n    /** @type {boolean} If the body slot should scroll on its own without the title.*/\n    export let scrollBody = false;\n    /** @type {string} */\n    export let describedBy = undefined;\n\n    /** @type {string|'basic'|'basic-negative'|'primary'|'secondary'|'destructive'|'plain'} */\n    export let confirmButtonType = 'primary';\n    /** @type {string|'basic'|'basic-negative'|'primary'|'secondary'|'destructive'|'plain'} */\n    export let cancelButtonType = 'secondary';\n\n    /** @type {boolean} */\n    export let clickOutsideCloses = true;\n\n    let hasScroll = false;\n    let contentScrollRemaining = 50;\n    let scrollContainer = document.querySelector('html');\n    let promptResolve = undefined;\n    let modalStyle = '';\n\n    let focusedBeforeModal = undefined;\n    let tabTrapper = undefined;\n\n    let dialogElement;\n    let contentElement;\n\n    let gradientStyle;\n\n    $: {\n        let height = 0;\n\n        if (hasScroll) {\n            height = Math.min(contentScrollRemaining, 30);\n        }\n\n        gradientStyle = `height: ${height}px;`;\n    }\n\n    $: describedById =describedBy || `${id}-body`;\n\n    let previouslyEnabled = false;\n\n    $: if (enabled && !previouslyEnabled) {\n        previouslyEnabled = enabled;\n        onOpen();\n    } else if (!enabled && previouslyEnabled) {\n        previouslyEnabled = enabled;\n        onClose();\n    }\n\n    $: if (enabled && wide) {\n        windowResize();\n    }\n\n    function onOpen() {\n        focusedBeforeModal = document.activeElement;\n\n        scrollContainer.classList.add('prom-modal2--open-within');\n\n        // Run window resize in case window sizes have changed while\n        // the modal was disabled\n        windowResize();\n\n        // Set timeout to let the dialog enter the DOM\n        setTimeout(() => {\n            if (dialogElement) {\n                const buttons = dialogElement.querySelectorAll('button');\n                tabTrapper = new TabTrapHelper(dialogElement);\n\n                tabTrapper.init();\n\n                // Focus the last button in the dialog, either the cancel button\n                // or confirm if there is only one\n                if (buttons.length) {\n                    buttons[buttons.length - 1].focus();\n                }\n            }\n        }, 0);\n\n        // Run windowResize again after animations have completed\n        setTimeout(() => windowResize(), 300);\n    }\n\n    export function reinitTabTrapper() {\n        if (tabTrapper) {\n            tabTrapper.init();\n        }\n    }\n\n    function onClose() {\n        scrollContainer.classList.remove('prom-modal2--open-within');\n\n        // Return focus to the element that was focused before opening\n        if (focusedBeforeModal) {\n            focusedBeforeModal.focus();\n        }\n\n        // Disable the tab trap\n        if (tabTrapper) {\n            tabTrapper.teardown();\n        }\n    }\n\n    function keyUpHandler(event) {\n        if (enabled && (normalizeKey(event.key) === Keys.ESCAPE)) {\n            cancel(event);\n        }\n    }\n\n    function windowResize() {\n        if (!enabled) {\n            return;\n        }\n\n        // size-700 from top and bottom\n        const verticalGap = 24 * 2;\n\n        // Max modal height is 600 and the page height\n        // Do not apply the 600 height limit on small screens, let\n        // the modal fill the screen in all dimensions\n        let maxHeight = window.innerWidth > 640\n            ? Math.min(window.innerHeight - verticalGap, wide ? 1200 : 600)\n            : window.innerHeight - verticalGap;\n\n        modalStyle = `max-height: ${maxHeight}px;`;\n\n        setTimeout(() => {\n            if (contentElement) {\n                hasScroll = contentElement.clientHeight !== contentElement.scrollHeight;\n            }\n        }, 0);\n    }\n\n    function cancel() {\n        enabled = false;\n\n        dispatch('close', { confirmed: false });\n        dispatch('cancel');\n\n        if (promptResolve) {\n            promptResolve(false);\n        }\n    }\n\n    function confirm() {\n        enabled = false;\n\n        dispatch('close', { confirmed: true });\n        dispatch('confirm');\n\n        if (promptResolve) {\n            promptResolve(true);\n        }\n    }\n\n    export function prompt(properties) {\n        if (properties.titleOnly !== undefined) titleOnly = properties.titleOnly;\n        if (properties.confirmText !== undefined) confirmText = properties.confirmText;\n        if (properties.cancelText !== undefined) cancelText = properties.cancelText;\n        if (properties.titleText !== undefined) titleText = properties.titleText;\n        if (properties.bodyText !== undefined) bodyText = properties.bodyText;\n        if (properties.bodyHtml !== undefined) bodyHtml = properties.bodyHtml;\n        if (properties.titleOnly !== undefined) titleOnly = properties.titleOnly;\n        if (properties.showCancel !== undefined) showCancel = properties.showCancel;\n        if (properties.describedBy !== undefined) describedBy = properties.describedBy;\n        if (properties.confirmButtonType !== undefined) confirmButtonType = properties.confirmButtonType;\n        if (properties.cancelButtonType !== undefined) cancelButtonType = properties.cancelButtonType;\n\n        enabled = true;\n\n        return new Promise(resolve => {\n            promptResolve = resolve;\n        });\n    }\n\n    function contentScroll() {\n        const scrollHeight = contentElement.scrollHeight;\n        const clientHeight = contentElement.clientHeight;\n        const scrollTop = contentElement.scrollTop;\n\n        contentScrollRemaining = scrollHeight - (clientHeight + scrollTop);\n    }\n</script>\n","<script>\n    /** @type {'primary'|'secondary'|'standalone'|'primary-standalone'} */\n    export let kind = 'primary';\n    /** @type {string} */\n    export let href = '#';\n    /** @type {string} */\n    export let rel = '';\n    /** @type {string} */\n    export let iconClass = '';\n    /** @type {'start'|'end'} */\n    export let iconPlacement = 'start';\n    /** @type {string} */\n    export let target = '_self';\n    /** @type {boolean} */\n    export let large = false;\n    /** @type {string} */\n    export let label = null;\n    /** @type {string} */\n    export let text = undefined;\n    /** @type {string} */\n    export let ping = undefined;\n    /** @type {boolean} */\n    export let standalone = false;\n    /** @type {boolean} */\n    export let downloadable = false;\n    /** @type {string} */\n    export let fileName = null;\n\n    $: download = downloadable ? fileName || '' : null;\n\n    $: icon =\n        kind === 'standalone' && iconClass\n            ? 'prom-link--icon ' + iconPlacementClass + iconClass\n            : '';\n\n    $: iconPlacementClass =\n        iconPlacement === 'start'\n            ? 'prom-link--icon-start '\n            : 'prom-link--icon-end ';\n\n    if (standalone) {\n        kind = 'standalone';\n    }\n\n    $: {\n        if (iconClass && kind !== 'standalone') {\n            console.warn(\n                \"Icons can only be added to links in 'standalone' mode.\"\n            );\n        }\n\n        if (iconClass && !text && !label) {\n            console.warn(\n                \"Links must have discernible text. If it is an icon-only link, use 'label' to add hidden text.\"\n            );\n        }\n    }\n</script>\n\n<a\n    class=\"prom-link prom-link--{kind} {icon}\"\n    class:prom-link--large={large}\n    {href}\n    {rel}\n    {target}\n    {ping}\n    {download}\n    aria-label={label}\n    on:click\n>\n    <slot />\n    {#if text}{text}{/if}\n</a>\n","// @ts-check\r\n\r\n/**\r\n * @module strings/format\r\n */\r\n\r\n/**\r\n * Replaces placeholders within a template string with corresponding values.\r\n *\r\n * @param {string} template - Template string.\r\n * @param {RegExp} regex - Regular expression to detect placeholders within template.\r\n * @param {string[]} values - Template replacement values.\r\n *\r\n * Template string placeholder format is specified by the `regex` parameter.\r\n */\r\nexport function formatString(template, regex, ...values) {\r\n    if (!template) {\r\n        throw TypeError('Template not specified');\r\n    }\r\n\r\n    if (typeof template !== 'string') {\r\n        throw TypeError('Template is not a string');\r\n    }\r\n\r\n    return template.replace(\r\n        regex,\r\n        (match, number) => number in values ? values[number] : match\r\n    );\r\n}\r\n\r\n/**\r\n * Replaces placeholders within a template string with corresponding values.\r\n *\r\n * @param {string} template - Template string.\r\n * @param {string[]} values - Template replacement values.\r\n *\r\n * Template string placeholder format: {n}, where n >= 0 and n < values.length\r\n */\r\nexport function formatLanguageString(template, ...values) {\r\n    const regex = /\\{(\\d+)\\}/g;\r\n\r\n    return formatString(template, regex, ...values);\r\n}\r\n","<script>\r\n    import {\r\n        onMount,\r\n        onDestroy,\r\n        tick,\r\n    } from 'svelte';\r\n    import { getJson } from '@itslearning/atlas/network/fetchJson';\r\n\r\n    import Avatar from '@itslearning/prometheus/assets/nodes/Avatar/v1/Avatar.svelte';\r\n    import Banner from \"@itslearning/prometheus/assets/feedback/Banner/v1/Banner.svelte\";\r\n    import Button from '@itslearning/prometheus/assets/inputs/Button/v1/Button.svelte';\r\n    import LoadingSpinner from '@itslearning/prometheus/assets/nodes/LoadingSpinner/v1/LoadingSpinner.svelte';\r\n    import Modal from '@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte';\r\n    import Link from '@itslearning/prometheus/assets/Navigation/Link/v1/Link.svelte';\r\n    import TabTrapHelper from '@itslearning/prometheus/lib/helpers/TabTrapHelper';\r\n    import { formatLanguageString } from \"@itslearning/atlas/strings/format.js\";\r\n\r\n    export let i18n;\r\n\r\n    let enabled = false;\r\n    let loading = false;\r\n    let personId;\r\n    let personData;\r\n    let relations = [];\r\n\r\n    let tabTrapper = undefined;\r\n    let dialogElement;\r\n\r\n    onMount(() => {\r\n        // @ts-ignore\r\n        window.newProfileCardSupported = true;\r\n        document.addEventListener('openProfileCard', onOpenProfileCard);\r\n    });\r\n\r\n    onDestroy(() => {\r\n        document.removeEventListener('openProfileCard', onOpenProfileCard);\r\n        personData = undefined;\r\n    });\r\n\r\n    const getAvatarDescription = (person) => person.predefinedAvatarId === null\r\n        ? person.pictureDescription\r\n        : i18n.predefinedAvatars[`avatar${person.predefinedAvatarId}`];\r\n\r\n    async function onOpenProfileCard(event) {\r\n        enabled = loading = true;\r\n        personId = event.detail.personId;\r\n\r\n        try {\r\n            const [\r\n                personDataResponse,\r\n                relationsResponse,\r\n            ] = await Promise.all([\r\n                getJson(`/restapi/profilecard/api/about/${personId}/v1`),\r\n                getJson(`/restapi/persons/relations/${personId}`),\r\n            ]);\r\n\r\n            personData = {...personDataResponse, pictureDescription : getAvatarDescription(personDataResponse) };\r\n            relations = relationsResponse;\r\n        } finally {\r\n            loading = false;\r\n\r\n            dialogElement = document.querySelector(\".prom-modal2__dialog\");\r\n            await tick();\r\n\r\n            // Reset tab trapper when data have been populated\r\n            if (dialogElement) {\r\n                tabTrapper = new TabTrapHelper(dialogElement);\r\n                tabTrapper.init();\r\n            }\r\n        }\r\n    }\r\n</script>\r\n\r\n<Modal bind:enabled={enabled}>\r\n    <div slot=\"body\" class=\"profile-card-container\" class:profile-card-container--loading={loading}>\r\n        <LoadingSpinner label={i18n.loading} visible={loading} size=\"large\" />\r\n\r\n        {#if !loading && personData}\r\n\r\n            <Avatar size={600} src={personData.pictureUrl} alternativeText={personData.pictureDescription} />\r\n\r\n            <h2>{personData.personFullName}</h2>\r\n\r\n            <div class=\"profile-card__privacy-protection\">\r\n                <Banner\r\n                    type={'info'}\r\n                    text={formatLanguageString(i18n.userPersonalInfoIsProtected, personData.personFullName)}\r\n                    bind:visible={personData.isPrivacyProtectionEnabledForStaff}\r\n                    closable={false}\r\n                />\r\n            </div>\r\n\r\n            {#if personData.isEPortfolioEnabled && personData.ePortfolioUrl}\r\n                <Link\r\n                    href={personData.ePortfolioUrl}\r\n                    kind=\"standalone\"\r\n                    iconClass=\"eportfolio-icon\"\r\n                    iconPlacement=\"end\"\r\n                    target=\"_blank\"\r\n                    text={i18n.viewEPortfolio}\r\n                />\r\n            {/if}\r\n\r\n            <div class=\"profile-card__relationships\">\r\n                {#each relations as relation}\r\n                    <p>\r\n                        {relation.text}\r\n                        {#if relation.items}\r\n                            {#each relation.items as item, index}\r\n                                <span>\r\n                                    {item}{#if index !== relation.items.length - 1}{i18n.commaSeparator}{/if}\r\n                                </span>\r\n                            {/each}\r\n                        {/if}\r\n                    </p>\r\n                {/each}\r\n            </div>\r\n\r\n            {#if personData.showExtraUserInfo}\r\n                <div class=\"profile-card__extra-user-info\">\r\n                    <div class=\"profile-card__extra-user-info-label\">{personData.extraUserInformationTitle}</div>\r\n                    {#if personData.extraUserInformation}\r\n                        <div class=\"profile-card__extra-user-info-value\">{personData.extraUserInformation}</div>\r\n                    {:else}\r\n                        <div class=\"profile-card__extra-user-info-value\">—</div>\r\n                    {/if}\r\n                </div>\r\n            {/if}\r\n        {/if}\r\n    </div>\r\n\r\n    <div slot=\"footer\">\r\n        <Link\r\n            kind=\"primary-standalone\"\r\n            large={true}\r\n            text={i18n.seeFullProfile}\r\n            href={`/ProfilePage/Index?PersonId=${personId}`}\r\n        />\r\n        <Button type=\"secondary\"\r\n            htmlType=\"button\"\r\n            large={true}\r\n            text={i18n.close}\r\n            on:click={() => enabled = false} />\r\n    </div>\r\n</Modal>\r\n","import \"prometheus.aaa.scss\";\r\nimport \"prometheus.modern.scss\";\r\n\r\nimport \"./theme.aaa.scss\";\r\nimport \"./theme.modern.scss\";\r\n\r\n\r\nimport App from \"./lib/App/App.svelte\";\r\n\r\n// @ts-ignore\r\nconst i18n = window.profileCardTerms;\r\n\r\n// @ts-ignore\r\nconst newProfileCardEnabled = window.newProfileCardEnabled;\r\n\r\nconst app = newProfileCardEnabled ? new App({\r\n    target: document.getElementById(\"itsl-profile-card-dialog\"),\r\n    props: {\r\n        i18n\r\n    }\r\n}) : null;\r\n\r\nexport default app;\r\n"],"names":["noop","assign","tar","src","k","run","fn","blank_object","run_all","fns","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","src_url_equal","element_src","url","is_empty","obj","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","get_slot_changes","dirty","lets","merged","len","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","get_all_dirty_from_scope","length","compute_slots","slots","result","key","globals","append","target","node","insert","anchor","detach","destroy_each","iterations","detaching","element","name","svg_element","text","data","space","empty","listen","event","handler","options","attr","attribute","value","children","set_data","toggle_class","toggle","custom_event","type","detail","bubbles","cancelable","HtmlTag","is_svg","__publicField","html","current_component","set_current_component","component","get_current_component","onMount","onDestroy","createEventDispatcher","callbacks","bubble","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","update_scheduled","schedule_update","flush","tick","add_render_callback","add_flush_callback","seen_callbacks","flushidx","saved_component","update","callback","$$","flush_render_callbacks","filtered","targets","c","outroing","outros","group_outros","check_outros","transition_in","block","local","transition_out","ensure_array_like","array_like_or_iterator","bind","index","create_component","mount_component","fragment","after_update","new_on_destroy","destroy_component","make_dirty","init","instance","create_fragment","not_equal","props","append_styles","parent_component","ready","ret","rest","nodes","SvelteComponent","PUBLIC_VERSION","NetworkError","message","response","ResponseStatuses","get","resolve","reject","fetchOptions","tryParseResponse","method","body","getJson","div","create_if_block_1","create_if_block_3","img","img_src_value","create_if_block_2","create_if_block","getFirstThree","size","$$props","alternativeText","getNumberClass","$$invalidate","sizeClass","avatars","altAvatarDescriptions","numberClass","button","button_class_value","span1","span0","iconOnly","id","cssClass","large","disabled","loading","htmlType","haspopup","expanded","ariaLabel","describedby","labelledby","visuallyHidden","isLarge","isLoading","isActive","ariaLabelText","button_changes","iconClass","iconPlacement","textOnly","iconOnlyClass","textOnlyClass","iconPlacementClass","div1","div0","span","create_if_block_4","dispatch","visible","close","closable","closeButtonType","infoText","warningText","loadingText","successText","showMessage","ariaLive","role","hide","roleText","div2","getLiveRegionText","statusText","progressEnabled","progressText","label","pageLoading","progressMin","progressMax","progressValue","valueMin","valueMax","valueNow","valueText","liveRegionText","nonTabbables","selector","tabbables","TabTrapper","elements","visibleTabbables","removeInvisibles","selectedElement","isInSameRadioGroup","innerDocBody","element1","element2","Keys","normalizeKey","create_if_block_6","if_block1","create_if_block_5","div6","section","h1","div5","div3","div4","enabled","wide","titleOnly","confirmText","cancelText","titleText","bodyText","bodyHtml","showCancel","scrollBody","describedBy","confirmButtonType","cancelButtonType","clickOutsideCloses","hasScroll","contentScrollRemaining","scrollContainer","promptResolve","modalStyle","focusedBeforeModal","tabTrapper","dialogElement","contentElement","gradientStyle","previouslyEnabled","onOpen","windowResize","buttons","TabTrapHelper","reinitTabTrapper","onClose","keyUpHandler","cancel","verticalGap","maxHeight","confirm","prompt","properties","contentScroll","scrollHeight","clientHeight","scrollTop","click_handler","$$value","height","describedById","a_class_value","current","kind","href","rel","ping","standalone","downloadable","fileName","download","icon","formatString","template","regex","values","match","number","formatLanguageString","t1_value","banner_props","if_block0","h2","avatar_changes","t1","banner_changes","link_changes","each_value_1","t_value","if_block","t0","t0_value","p","t","loadingspinner_changes","i18n","personId","personData","relations","onOpenProfileCard","getAvatarDescription","person","personDataResponse","relationsResponse","$$self","newProfileCardEnabled","App"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}