From 65432926d914aadb1b3e8f829032df57c2073c3e Mon Sep 17 00:00:00 2001 From: Mrin Date: Thu, 3 Oct 2024 19:51:28 -0400 Subject: [PATCH] generated latest build --- dist/index.html | 2 +- dist/index.html.gz | Bin 667 -> 675 bytes dist/rapidoc-min.js | 128 +++++++++++++++++----------------- dist/rapidoc-min.js.gz | Bin 217230 -> 217510 bytes dist/rapidoc-min.js.map | 2 +- dist/rapidoc-min.js.map.gz | Bin 80820 -> 81123 bytes dist/rapidoc.js | 136 +++++++++++++++++++------------------ dist/report.html | 4 +- 8 files changed, 139 insertions(+), 133 deletions(-) diff --git a/dist/index.html b/dist/index.html index fce2ed65..7ed1f6fc 100644 --- a/dist/index.html +++ b/dist/index.html @@ -3,4 +3,4 @@ docEl.addEventListener('before-try', (e) => { e.detail.request.headers.append('AAA-BBB', 'CCC DDDD'); }); - }); \ No newline at end of file + }); \ No newline at end of file diff --git a/dist/index.html.gz b/dist/index.html.gz index 4fe218eadcf7975c80c1d3a21664b8cfe07bf03e..aea99e400b27c08768ff9a7a8c11668f80b85906 100644 GIT binary patch delta 649 zcmV;40(SkI1)~L!CVzt)xCyivJh*mdP5bY=*iG7WeVZj4?iUBnJ!bjQL``Fd!cyy3 z%kmW-!oHChB-;pPwQP|k4o;(* zjH}iK*Y>T-8ay`FS8S34f3o|GX)<8T_K2B5$dSj@59r)o)PKu*HkaOoCy~%MGSlcW zTSUgT33rXGYi&aHm<@V2q$(iQds|z#x1L{m%q6b47$M`APu2BJbzN_J=S@8?RvX+w z@2TSbRyvnmWSv|`A}9S{>z|UQr60@6^}O^6g0V3*avJ0enE3GACG~GjJ-6rCJh))u zp#o#>2X4WG%YWPnOc#s0@833aTOJ}9G>a>7fhFZqG%NA@gW!kzmKi7$LAStQ+U6gg<-CRFyMe$`y1S z28Ou3y;bY=nkyHZ%|_hubHw{Ijr@I~U>nW2S{8~F?|(+*4z=nN3!|#bJlBM6SB=nm zDV%BKd;lqUEW$OAo+K+Nm?FK>{zmTj@EHxWuQ>^hZc2#kv+yTKzD%5&HGSm5({ zZ09^OYk!9@C!B+&p)kTK*5qP%1KTrwft-fdvA#1vs8Z|+PjCs_IG|#JyXg4bd=)S~ zTQGZ6{GX#&z+5mVQnWzYs&W~z=5dd|r07@}tf~p{M37F=d$mOigNsa3Zet{S+#8GT j1U_?KD0ori^D_MN97V&^Sw;192mS?Kc07j@1p)v7`tCj& delta 640 zcmV-`0)PFZ1)BwsCVzqH8g2qD1`n>CMbrNKE_RbPTi<5M#`lW@=N?$TH&N4}M`5Y+ zt7Z8L4`J6x43cdGvs!jYAhd;)ks3MBR^7;FZ-5RPIXc|;F_9EH2ExEuduPZt21ln+ zO~zH{g6oD(Wepyi>nk?Nfj`+p#xxnwvVFkJAmqs7>KpX#E`RD}J)2AK!jnko8=2|g zFN5e)jL~Tx3ivKddwxRxELYhrw`TjO?6$jgY%}IC#wx^ zVenM(dMlmFDzZ+lCy|r>ulY|&)6|b;=6as`1i{#t8aWMe228wp?vnbqrk>mLZ0=n! zabJNk_anF9!GC4$1g49{-PbRhxh)S744TE2xWJNfDVmk|^-l1^eanm<^}QEO8HbJ& zsvXk3$MU;Ad^Q&gvdFQ;<;SULN`C{e#cfQeC>|gWmq@PR|$U%n5imzz?3WK zdkhS5dwZ+a>or#{Hk*yO6wsjtvzI~Vz&cV`H7-2bUaxwe`J1~8LoQBu2p*KLNQXB|Ra0$COqGE#k z=y>0JConxNm>nuU@aPpV7tDzi9gw!F+)6Bd+~H3tdR7R_YXUqGq*L@>wP;~ ${this.resolvedSpec.securitySchemes&&this.resolvedSpec.securitySchemes.length>0?J` - ${this.resolvedSpec.securitySchemes.map((e=>J` + ${this.resolvedSpec.securitySchemes.filter((e=>e.scheme&&e.type)).map((e=>J` \n \n ${this.allowTry === 'true'\n ? html`\n `\n : ''\n }\n ${paramSchema.default || paramSchema.constrain || paramSchema.allowedValues || paramSchema.pattern\n ? html`\n `\n : html``\n }\n \n \n ${this.allowTry === 'true' ? html`` : ''}\n \n \n `);\n }\n\n return html`\n
${title}
\n
\n
\n ${tableRows}\n
\n `;\n }\n\n // This method is called before navigation change in focused mode\n async beforeNavigationFocusedMode() {\n // this.saveExampleState();\n }\n\n // This method is called after navigation change in focused mode\n async afterNavigationFocusedMode() {\n this.selectedRequestBodyType = '';\n this.selectedRequestBodyExample = '';\n this.updateExamplesFromDataAttr();\n this.clearResponseData();\n }\n\n // Request-Body Event Handlers\n onSelectExample(e) {\n this.selectedRequestBodyExample = e.target.value;\n const exampleDropdownEl = e.target;\n window.setTimeout((selectEl) => {\n const readOnlyExampleEl = selectEl.closest('.example-panel').querySelector('.request-body-param');\n const userInputExampleTextareaEl = selectEl.closest('.example-panel').querySelector('.request-body-param-user-input');\n userInputExampleTextareaEl.value = readOnlyExampleEl.innerText;\n\n const requestPanelEl = this.getRequestPanel({ target: selectEl });\n this.liveCURLSyntaxUpdate(requestPanelEl);\n }, 0, exampleDropdownEl);\n }\n\n onMimeTypeChange(e) {\n this.selectedRequestBodyType = e.target.value;\n const mimeDropdownEl = e.target;\n this.selectedRequestBodyExample = '';\n window.setTimeout((selectEl) => {\n const readOnlyExampleEl = selectEl.closest('.request-body-container').querySelector('.request-body-param');\n if (readOnlyExampleEl) {\n const userInputExampleTextareaEl = selectEl.closest('.request-body-container').querySelector('.request-body-param-user-input');\n userInputExampleTextareaEl.value = readOnlyExampleEl.innerText;\n }\n }, 0, mimeDropdownEl);\n }\n\n requestBodyTemplate() {\n if (!this.request_body) {\n return '';\n }\n if (Object.keys(this.request_body).length === 0) {\n return '';\n }\n\n // Variable to store partial HTMLs\n let reqBodyTypeSelectorHtml = '';\n let reqBodyFileInputHtml = '';\n let reqBodyFormHtml = '';\n let reqBodySchemaHtml = '';\n let reqBodyExampleHtml = '';\n\n const requestBodyTypes = [];\n const { content } = this.request_body;\n for (const mimeType in content) {\n requestBodyTypes.push({\n mimeType,\n schema: content[mimeType].schema,\n example: content[mimeType].example,\n examples: content[mimeType].examples,\n });\n if (!this.selectedRequestBodyType) {\n this.selectedRequestBodyType = mimeType;\n }\n }\n // MIME Type selector\n reqBodyTypeSelectorHtml = requestBodyTypes.length === 1\n ? ''\n : html`\n \n `;\n\n // For Loop - Main\n requestBodyTypes.forEach((reqBody) => {\n let schemaAsObj;\n let reqBodyExamples = [];\n\n if (this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text') || this.selectedRequestBodyType.includes('jose')) {\n // Generate Example\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n reqBodyExamples = generateExample(\n reqBody.schema,\n reqBody.mimeType,\n standardizeExample(reqBody.examples),\n standardizeExample(reqBody.example),\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n 'text',\n false,\n );\n if (!this.selectedRequestBodyExample) {\n this.selectedRequestBodyExample = (reqBodyExamples.length > 0 ? reqBodyExamples[0].exampleId : '');\n }\n reqBodyExampleHtml = html`\n ${reqBodyExampleHtml}\n
\n ${reqBodyExamples.length === 1\n ? ''\n : html`\n \n `\n }\n ${reqBodyExamples\n .filter((v) => v.exampleId === this.selectedRequestBodyExample)\n .map((v) => html`\n
\n ${v.exampleSummary && v.exampleSummary.length > 80 ? html`
${v.exampleSummary}
` : ''}\n ${v.exampleDescription ? html`
${unsafeHTML(marked(v.exampleDescription || ''))}
` : ''}\n \n
${(v.exampleFormat === 'text' ? v.exampleValue : JSON.stringify(v.exampleValue, null, 2))}
\n\n \n \n
\n `)}\n\n
\n `;\n }\n } else if (this.selectedRequestBodyType.includes('form-urlencoded') || this.selectedRequestBodyType.includes('form-data')) {\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n const ex = generateExample(\n reqBody.schema,\n reqBody.mimeType,\n reqBody.examples,\n reqBody.example,\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n 'text',\n false,\n );\n if (reqBody.schema) {\n reqBodyFormHtml = this.formDataTemplate(reqBody.schema, reqBody.mimeType, (ex[0] ? ex[0].exampleValue : ''));\n }\n }\n } else if ((/^audio\\/|^image\\/|^video\\/|^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$/.test(this.selectedRequestBodyType))) {\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n reqBodyFileInputHtml = html`\n
\n \n
\n `;\n }\n }\n\n // Generate Schema\n if (reqBody.mimeType.includes('json') || reqBody.mimeType.includes('xml') || reqBody.mimeType.includes('text') || this.selectedRequestBodyType.includes('jose')) {\n schemaAsObj = schemaInObjectNotation(reqBody.schema, {});\n if (this.schemaStyle === 'table') {\n reqBodySchemaHtml = html`\n ${reqBodySchemaHtml}\n \n `;\n } else if (this.schemaStyle === 'tree') {\n reqBodySchemaHtml = html`\n ${reqBodySchemaHtml}\n \n `;\n }\n }\n });\n\n return html`\n
\n
\n REQUEST BODY ${this.request_body.required ? html`*` : ''} \n ${this.selectedRequestBodyType}\n \n ${reqBodyTypeSelectorHtml}\n
\n ${this.request_body.description ? html`
${unsafeHTML(marked(this.request_body.description))}
` : ''}\n \n ${(this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text') || this.selectedRequestBodyType.includes('jose'))\n ? html`\n
\n
{ if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; } }}\">\n \n \n
\n ${html`
${reqBodyExampleHtml}
`}\n ${html`
${reqBodySchemaHtml}
`}\n
`\n : html` \n ${reqBodyFileInputHtml}\n ${reqBodyFormHtml}`\n }\n
\n `;\n }\n\n formDataParamAsObjectTemplate(fieldName, fieldSchema, mimeType) {\n // This template is used when form-data param should be send as a object (application/json, application/xml)\n const formdataPartSchema = schemaInObjectNotation(fieldSchema, {});\n const formdataPartExample = generateExample(\n fieldSchema,\n 'json',\n standardizeExample(fieldSchema.examples),\n standardizeExample(fieldSchema.example),\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n 'text',\n false,\n );\n\n return html`\n
\n
\n
{\n if (e.target.classList.contains('v-tab-btn')) {\n const { tab } = e.target.dataset;\n if (tab) {\n const tabPanelEl = e.target.closest('.tab-panel');\n const selectedTabBtnEl = tabPanelEl.querySelector(`.v-tab-btn[data-tab=\"${tab}\"]`);\n const otherTabBtnEl = [...tabPanelEl.querySelectorAll(`.v-tab-btn:not([data-tab=\"${tab}\"])`)];\n const selectedTabContentEl = tabPanelEl.querySelector(`.tab-content[data-tab=\"${tab}\"]`);\n const otherTabContentEl = [...tabPanelEl.querySelectorAll(`.tab-content:not([data-tab=\"${tab}\"])`)];\n selectedTabBtnEl.classList.add('active');\n selectedTabContentEl.style.display = 'block';\n otherTabBtnEl.forEach((el) => { el.classList.remove('active'); });\n otherTabContentEl.forEach((el) => { el.style.display = 'none'; });\n }\n }\n if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; }\n }}\">\n \n \n
\n
\n ${html`\n
\n \n
`\n }\n ${html`\n
\n \n
`\n }\n
\n `;\n }\n\n formDataTemplate(schema, mimeType, exampleValue = '') {\n const formDataTableRows = [];\n if (schema.properties) {\n for (const fieldName in schema.properties) {\n const fieldSchema = schema.properties[fieldName];\n if (fieldSchema.readOnly) {\n continue;\n }\n const fieldExamples = fieldSchema.examples || fieldSchema.example || '';\n const fieldType = fieldSchema.type;\n const paramSchema = getTypeInfo(fieldSchema);\n const labelColWidth = 'read focused'.includes(this.renderStyle) ? '200px' : '160px';\n const example = normalizeExamples((paramSchema.examples || paramSchema.example), paramSchema.type);\n formDataTableRows.push(html`\n \n \n
\n ${fieldName}${(schema.required?.includes(fieldName) || fieldSchema.required) ? html`*` : ''}\n
\n
${paramSchema.type}
\n \n \n ${fieldType === 'array'\n ? fieldSchema.items?.format === 'binary'\n ? html`\n
this.onAddRemoveFileInput(e, fieldName, mimeType)}\">\n
\n \n \n
\n \n
\n `\n : html`\n \n \n `\n : html`\n ${fieldType === 'object'\n ? this.formDataParamAsObjectTemplate.call(this, fieldName, fieldSchema, mimeType)\n : html`\n ${this.allowTry === 'true'\n ? html``\n : ''\n }\n `\n }`\n }\n \n ${fieldType === 'object'\n ? ''\n : html`\n \n ${paramSchema.default || paramSchema.constrain || paramSchema.allowedValues || paramSchema.pattern\n ? html`\n
\n ${paramSchema.default ? html`Default: ${paramSchema.default}
` : ''}\n ${paramSchema.pattern ? html`Pattern: ${paramSchema.pattern}
` : ''}\n ${paramSchema.constrain ? html`${paramSchema.constrain}
` : ''}\n ${paramSchema.allowedValues && paramSchema.allowedValues.split('┃').map((v, i) => html`\n ${i > 0 ? '┃' : html`Allowed: `}\n ${html`\n {\n const inputEl = e.target.closest('table').querySelector(`[data-pname=\"${fieldName}\"]`);\n if (inputEl) {\n if (e.target.dataset.type === 'array') {\n inputEl.value = [e.target.dataset.enum];\n } else {\n inputEl.value = e.target.dataset.enum;\n }\n }\n }}\"\n > \n ${v} \n `\n }`)\n }\n
`\n : ''\n }\n `\n }\n \n ${fieldType === 'object'\n ? ''\n : html`\n \n \n \n ${unsafeHTML(marked(fieldSchema.description || ''))}\n ${this.exampleListTemplate.call(this, fieldName, paramSchema.type, example.exampleList)}\n \n \n `\n }`);\n }\n return html`\n \n ${formDataTableRows}\n
\n `;\n }\n\n return html`\n \n ${schema.description ? html`${unsafeHTML(marked(schema.description))}` : ''}\n `;\n }\n\n curlSyntaxTemplate(display = 'flex') {\n return html`\n
\n \n
${unsafeHTML(Prism.highlight(this.curlSyntax.trim().replace(/\\\\$/, ''), Prism.languages.shell, 'shell'))}
\n
\n `;\n }\n\n apiResponseTabTemplate() {\n let responseFormat = '';\n let responseContent = '';\n if (!this.responseIsBlob) {\n if (this.responseHeaders.includes('application/x-ndjson')) {\n responseFormat = 'json';\n const prismLines = this.responseText.split('\\n').map((q) => Prism.highlight(q, Prism.languages[responseFormat], responseFormat)).join('\\n');\n responseContent = html`${unsafeHTML(prismLines)}`;\n } else if (this.responseHeaders.includes('json')) {\n responseFormat = 'json';\n responseContent = html`${unsafeHTML(Prism.highlight(this.responseText, Prism.languages[responseFormat], responseFormat))}`;\n } else if (this.responseHeaders.includes('html') || this.responseHeaders.includes('xml')) {\n responseFormat = 'html';\n responseContent = html`${unsafeHTML(Prism.highlight(this.responseText, Prism.languages[responseFormat], responseFormat))}`;\n } else {\n responseFormat = 'text';\n responseContent = html`${this.responseText}`;\n }\n }\n return html`\n
\n
Response Status: ${this.responseMessage}
\n
\n \n
\n
\n
{\n if (e.target.classList.contains('tab-btn') === false) { return; }\n this.activeResponseTab = e.target.dataset.tab;\n }}\">\n \n \n ${this.showCurlBeforeTry === 'true'\n ? ''\n : html``}\n
\n ${this.responseIsBlob\n ? html`\n
\n ${this.responseBlobType === 'image'\n ? html``\n : ''\n } \n \n ${this.responseBlobType === 'view' || this.responseBlobType === 'image'\n ? html``\n : ''\n }\n
`\n : html`\n
\n \n
${responseContent}
\n
`\n }\n
\n \n
${unsafeHTML(Prism.highlight(this.responseHeaders, Prism.languages.css, 'css'))}
\n
\n ${this.showCurlBeforeTry === 'true' ? '' : this.curlSyntaxTemplate(this.activeResponseTab === 'curl' ? 'flex' : 'none')}\n
`;\n }\n\n apiCallTemplate() {\n const selectedServerHtml = html`\n
\n ${this.serverUrl\n ? html`\n
\n
API Server
\n ${this.serverUrl} \n
\n `\n : ''\n }\n
\n `;\n\n return html`\n
\n
\n
\n ${selectedServerHtml}\n
\n
\n
Authentication
\n ${this.security?.length > 0\n ? html`\n ${this.api_keys.length > 0\n ? html`
\n ${this.api_keys.length === 1\n ? `${this.api_keys[0]?.typeDisplay} in ${this.api_keys[0].in}`\n : `${this.api_keys.length} API keys applied`\n } \n
`\n : html`
Required (None Applied)
`\n }`\n : html` Not Required `\n }\n
\n
\n ${\n this.parameters.length > 0 || this.request_body\n ? html`\n \n `\n : ''\n }\n \n
\n
\n ${this.showCurlBeforeTry === 'true' ? this.curlSyntaxTemplate() : ''}\n
\n ${this.responseMessage === '' ? '' : this.apiResponseTabTemplate()}\n `;\n }\n /* eslint-enable indent */\n\n async onFillRequestData(e) {\n const requestPanelEl = e.target.closest('.request-panel');\n const requestPanelInputEls = [...requestPanelEl.querySelectorAll('input, tag-input, textarea:not(.is-hidden)')];\n requestPanelInputEls.forEach((el) => {\n if (el.dataset.example) {\n if (el.tagName.toUpperCase() === 'TAG-INPUT') {\n el.value = el.dataset.example.split('~|~');\n } else {\n el.value = el.dataset.example;\n }\n }\n });\n }\n\n async onClearRequestData(e) {\n const requestPanelEl = e.target.closest('.request-panel');\n const requestPanelInputEls = [...requestPanelEl.querySelectorAll('input, tag-input, textarea:not(.is-hidden)')];\n requestPanelInputEls.forEach((el) => { el.value = ''; });\n }\n\n buildFetchURL(requestPanelEl) {\n let fetchUrl;\n const pathParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='path']\")];\n const queryParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='query']\")];\n const queryParamObjTypeEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='query-object']\")];\n fetchUrl = this.path;\n // Generate URL using Path Params\n pathParamEls.map((el) => {\n fetchUrl = fetchUrl.replace(`{${el.dataset.pname}}`, encodeURIComponent(el.value));\n });\n\n // Query Params\n const urlQueryParamsMap = new Map();\n const queryParamsWithReservedCharsAllowed = [];\n if (queryParamEls.length > 0) {\n queryParamEls.forEach((el) => {\n const queryParam = new URLSearchParams();\n if (el.dataset.paramAllowReserved === 'true') {\n queryParamsWithReservedCharsAllowed.push(el.dataset.pname);\n }\n if (el.dataset.array === 'false') {\n if (el.value !== '') {\n queryParam.append(el.dataset.pname, el.value);\n }\n } else {\n const { paramSerializeStyle, paramSerializeExplode } = el.dataset;\n let vals = ((el.value && Array.isArray(el.value)) ? el.value : []);\n vals = Array.isArray(vals) ? vals.filter((v) => v !== '') : [];\n if (vals.length > 0) {\n if (paramSerializeStyle === 'spaceDelimited') {\n queryParam.append(el.dataset.pname, vals.join(' ').replace(/^\\s|\\s$/g, ''));\n } else if (paramSerializeStyle === 'pipeDelimited') {\n queryParam.append(el.dataset.pname, vals.join('|').replace(/^\\||\\|$/g, ''));\n } else {\n if (paramSerializeExplode === 'true') { // eslint-disable-line no-lonely-if\n vals.forEach((v) => { queryParam.append(el.dataset.pname, v); });\n } else {\n queryParam.append(el.dataset.pname, vals.join(',').replace(/^,|,$/g, ''));\n }\n }\n }\n }\n if (queryParam.toString()) {\n urlQueryParamsMap.set(el.dataset.pname, queryParam);\n }\n });\n }\n\n // Query Params (Dynamic - create from JSON)\n if (queryParamObjTypeEls.length > 0) {\n queryParamObjTypeEls.map((el) => {\n const queryParam = new URLSearchParams();\n try {\n let queryParamObj = {};\n const { paramSerializeStyle, paramSerializeExplode, pname } = el.dataset;\n queryParamObj = Object.assign(queryParamObj, JSON.parse(el.value.replace(/\\s+/g, ' ')));\n if (el.dataset.paramAllowReserved === 'true') {\n queryParamsWithReservedCharsAllowed.push(el.dataset.pname);\n }\n if ('json xml'.includes(paramSerializeStyle)) {\n if (paramSerializeStyle === 'json') {\n queryParam.append(el.dataset.pname, JSON.stringify(queryParamObj));\n } else if (paramSerializeStyle === 'xml') {\n queryParam.append(el.dataset.pname, json2xml(queryParamObj));\n }\n } else {\n for (const key in queryParamObj) {\n const pKey = `${pname}[${key}]`;\n if (typeof queryParamObj[key] === 'object') {\n if (Array.isArray(queryParamObj[key])) {\n if (paramSerializeStyle === 'spaceDelimited') {\n queryParam.append(pKey, queryParamObj[key].join(' '));\n } else if (paramSerializeStyle === 'pipeDelimited') {\n queryParam.append(pKey, queryParamObj[key].join('|'));\n } else {\n if (paramSerializeExplode === 'true') { // eslint-disable-line no-lonely-if\n queryParamObj[key].forEach((v) => {\n queryParam.append(pKey, v);\n });\n } else {\n queryParam.append(pKey, queryParamObj[key]);\n }\n }\n }\n } else {\n queryParam.append(pKey, queryParamObj[key]);\n }\n }\n }\n } catch {\n console.error('RapiDoc: unable to parse %s into object', el.value); // eslint-disable-line no-console\n }\n if (queryParam.toString()) {\n urlQueryParamsMap.set(el.dataset.pname, queryParam);\n }\n });\n }\n let urlQueryParamString = '';\n if (urlQueryParamsMap.size) {\n urlQueryParamsMap.forEach((val, pname) => {\n if (queryParamsWithReservedCharsAllowed.includes(pname)) {\n urlQueryParamString += `${pname}=`;\n urlQueryParamString += val.getAll(pname).join(`&${pname}=`);\n urlQueryParamString += '&';\n } else {\n urlQueryParamString += `${val.toString()}&`;\n }\n });\n urlQueryParamString = urlQueryParamString.slice(0, -1);\n }\n if (urlQueryParamString.length !== 0) {\n fetchUrl = `${fetchUrl}${fetchUrl.includes('?') ? '&' : '?'}${urlQueryParamString}`;\n }\n\n // Add authentication Query-Param if provided\n this.api_keys\n .filter((v) => (v.in === 'query'))\n .forEach((v) => {\n fetchUrl = `${fetchUrl}${fetchUrl.includes('?') ? '&' : '?'}${v.name}=${encodeURIComponent(v.finalKeyValue)}`;\n });\n\n fetchUrl = `${this.serverUrl.replace(/\\/$/, '')}${fetchUrl}`;\n return fetchUrl;\n }\n\n buildFetchHeaders(requestPanelEl) {\n const respEl = this.closest('.expanded-req-resp-container, .req-resp-container')?.getElementsByTagName('api-response')[0];\n const headerParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='header'], [data-ptype='header-object']\")];\n const requestBodyContainerEl = requestPanelEl.querySelector('.request-body-container');\n const acceptHeader = respEl?.selectedMimeType;\n const reqHeaders = new Headers();\n if (acceptHeader) {\n // Uses the acceptHeader from Response panel\n reqHeaders.append('Accept', acceptHeader);\n } else if (this.accept) {\n reqHeaders.append('Accept', this.accept);\n }\n\n // Add Authentication Header if provided\n this.api_keys\n .filter((v) => (v.in === 'header'))\n .forEach((v) => {\n reqHeaders.append(v.name, v.finalKeyValue);\n });\n\n // Add Header Params\n headerParamEls.map((el) => {\n if (el.value) {\n if (el.dataset.ptype === 'header-object') {\n /* CONVERT\n a header value from below object style\n {\n \"key1\": \"val1\",\n \"key2\": {\n \"key2_1\": \"val2_1\",\n \"key2_2\": {\n \"key2_2_1\": \"val2_2_1\"\n }\n },\n \"key3\": \"val3\"\n };\n\n TO >>>\n key1=val1, key2={\"key2_1\":\"val2_1\",\"key2_2\":{\"key2_2_1\":\"val2_2_1\"}}, key3=val3\n */\n const headerObjVal = JSON.parse(el.value.replace(/\\n/g, '').trim());\n const firstLevelKeySeparator = el.dataset.paramSerializeExplode === 'true' ? '=' : ',';\n const headerStrVal = Object.keys(headerObjVal)\n .map((key) => {\n const value = headerObjVal[key];\n if (typeof value === 'object') {\n return `${key}${firstLevelKeySeparator}${JSON.stringify(value)}`;\n }\n return `${key}${firstLevelKeySeparator}${value}`;\n })\n .join(',');\n reqHeaders.append(el.dataset.pname, headerStrVal);\n } else {\n reqHeaders.append(el.dataset.pname, el.value);\n }\n }\n });\n\n if (requestBodyContainerEl) {\n const requestBodyType = requestBodyContainerEl.dataset.selectedRequestBodyType;\n // Common for all request-body\n if (!requestBodyType.includes('form-data')) {\n // For multipart/form-data dont set the content-type to allow creation of browser generated part boundaries\n reqHeaders.append('Content-Type', requestBodyType);\n }\n }\n return reqHeaders;\n }\n\n buildFetchBodyOptions(requestPanelEl) {\n const requestBodyContainerEl = requestPanelEl.querySelector('.request-body-container');\n const fetchOptions = {\n method: this.method.toUpperCase(),\n };\n if (requestBodyContainerEl) {\n const requestBodyType = requestBodyContainerEl.dataset.selectedRequestBodyType;\n if (requestBodyType.includes('form-urlencoded')) {\n // url-encoded Form Params (dynamic) - Parse JSON and generate Params\n const formUrlDynamicTextAreaEl = requestPanelEl.querySelector(\"[data-ptype='dynamic-form']\");\n if (formUrlDynamicTextAreaEl) {\n const val = formUrlDynamicTextAreaEl.value;\n const formUrlDynParams = new URLSearchParams();\n let proceed = true;\n let tmpObj;\n if (val) {\n try {\n tmpObj = JSON.parse(val);\n } catch (err) {\n proceed = false;\n console.warn('RapiDoc: Invalid JSON provided', err); // eslint-disable-line no-console\n }\n } else {\n proceed = false;\n }\n if (proceed) {\n for (const prop in tmpObj) {\n formUrlDynParams.append(prop, JSON.stringify(tmpObj[prop]));\n }\n fetchOptions.body = formUrlDynParams;\n }\n } else {\n // url-encoded Form Params (regular)\n const formUrlEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='form-urlencode']\")];\n const formUrlParams = new URLSearchParams();\n formUrlEls\n .filter((v) => (v.type !== 'file'))\n .forEach((el) => {\n if (el.dataset.array === 'false') {\n if (el.value) {\n formUrlParams.append(el.dataset.pname, el.value);\n }\n } else {\n const vals = (el.value && Array.isArray(el.value)) ? el.value.join(',') : '';\n formUrlParams.append(el.dataset.pname, vals);\n }\n });\n fetchOptions.body = formUrlParams;\n }\n } else if (requestBodyType.includes('form-data')) {\n const formDataParams = new FormData();\n const formDataEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='form-data']\")];\n formDataEls.forEach((el) => {\n if (el.dataset.array === 'false') {\n if (el.type === 'file' && el.files[0]) {\n formDataParams.append(el.dataset.pname, el.files[0], el.files[0].name);\n } else if (el.value) {\n formDataParams.append(el.dataset.pname, el.value);\n }\n } else if (el.value && Array.isArray(el.value)) {\n formDataParams.append(el.dataset.pname, el.value.join(','));\n }\n });\n fetchOptions.body = formDataParams;\n } else if (/^audio\\/|^image\\/|^video\\/|^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$/.test(requestBodyType)) {\n const bodyParamFileEl = requestPanelEl.querySelector('.request-body-param-file');\n if (bodyParamFileEl?.files[0]) {\n fetchOptions.body = bodyParamFileEl.files[0]; // eslint-disable-line prefer-destructuring\n }\n } else if (requestBodyType.includes('json') || requestBodyType.includes('xml') || requestBodyType.includes('text')) {\n const exampleTextAreaEl = requestPanelEl.querySelector('.request-body-param-user-input');\n if (exampleTextAreaEl?.value) {\n fetchOptions.body = exampleTextAreaEl.value;\n }\n }\n }\n\n return fetchOptions;\n }\n\n async onTryClick(e) {\n const tryBtnEl = e.target;\n const requestPanelEl = tryBtnEl.closest('.request-panel');\n const fetchUrl = this.buildFetchURL(requestPanelEl);\n const fetchOptions = this.buildFetchBodyOptions(requestPanelEl);\n const reqHeaders = this.buildFetchHeaders(requestPanelEl);\n this.responseUrl = '';\n this.responseHeaders = [];\n this.curlSyntax = this.generateCURLSyntax(fetchUrl, reqHeaders, fetchOptions, requestPanelEl);\n this.responseStatus = 'success';\n this.responseIsBlob = false;\n\n this.respContentDisposition = '';\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n if (this.fetchCredentials) {\n fetchOptions.credentials = this.fetchCredentials;\n }\n const controller = new AbortController();\n const { signal } = controller;\n fetchOptions.headers = reqHeaders;\n const tempRequest = { url: fetchUrl, ...fetchOptions };\n this.dispatchEvent(new CustomEvent('before-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: tempRequest,\n controller,\n },\n }));\n const updatedFetchOptions = {\n method: tempRequest.method,\n headers: tempRequest.headers,\n credentials: tempRequest.credentials,\n body: tempRequest.body,\n };\n const fetchRequest = new Request(tempRequest.url, updatedFetchOptions);\n\n let fetchResponse;\n let responseClone;\n try {\n let respBlob;\n let respJson;\n let respText;\n tryBtnEl.disabled = true;\n this.responseText = '⌛';\n this.responseMessage = '';\n this.requestUpdate();\n const startTime = performance.now();\n fetchResponse = await fetch(fetchRequest, { signal });\n const endTime = performance.now();\n // Allow to modify response\n /*\n let resolveModifiedResponse; // Create a promise that will be resolved from the event listener\n const modifiedResponsePromise = new Promise((resolve) => {\n resolveModifiedResponse = resolve;\n });\n this.dispatchEvent(new CustomEvent('fetched-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: fetchRequest,\n response: fetchResponse,\n resolveModifiedResponse, // pass the resolver function\n },\n }));\n fetchResponse = await modifiedResponsePromise; // Wait for the modified response\n */\n responseClone = fetchResponse.clone(); // create a response clone to allow reading response body again (response.json, response.text etc)\n tryBtnEl.disabled = false;\n this.responseMessage = html`${fetchResponse.statusText ? `${fetchResponse.statusText}:${fetchResponse.status}` : fetchResponse.status}
Took ${Math.round(endTime - startTime)} milliseconds
`;\n this.responseUrl = fetchResponse.url;\n const respHeadersObj = {};\n fetchResponse.headers.forEach((hdrVal, hdr) => {\n respHeadersObj[hdr] = hdrVal;\n this.responseHeaders = `${this.responseHeaders}${hdr}: ${hdrVal}\\n`;\n });\n const contentType = fetchResponse.headers.get('content-type').split(';')[0].trim();\n const respEmpty = (await fetchResponse.clone().text()).length === 0;\n if (respEmpty) {\n this.responseText = '';\n } else if (contentType) {\n if (contentType === 'application/x-ndjson') {\n this.responseText = await fetchResponse.text();\n } else if (contentType.includes('json')) {\n if ((/charset=[^\"']+/).test(contentType)) {\n const encoding = contentType.split('charset=')[1];\n const buffer = await fetchResponse.arrayBuffer();\n try {\n respText = new TextDecoder(encoding).decode(buffer);\n } catch {\n respText = new TextDecoder('utf-8').decode(buffer);\n }\n try {\n respJson = JSON.parse(respText);\n this.responseText = JSON.stringify(respJson, null, 2);\n } catch {\n this.responseText = respText;\n }\n } else {\n respJson = await fetchResponse.json();\n this.responseText = JSON.stringify(respJson, null, 2);\n }\n // eslint-disable-next-line no-useless-escape\n } else if (/^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$|^application\\/vnd\\./.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'download';\n } else if (/^image/.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'image';\n } else if (/^audio|^image|^video/.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'view';\n } else {\n respText = await fetchResponse.text();\n if (contentType.includes('xml')) {\n this.responseText = formatXml(respText, { textNodesOnSameLine: true, indentor: ' ' });\n } else {\n this.responseText = respText;\n }\n }\n if (this.responseIsBlob) {\n const contentDisposition = fetchResponse.headers.get('content-disposition');\n let filenameFromContentDeposition = 'filename';\n const filenameStarRegexMatch = contentDisposition.match(/filename\\*=\\s*UTF-8''([^;]+)/); // Support Headers like >>> Content-Disposition: attachment; filename*=UTF-8''example%20file.pdf\n if (filenameStarRegexMatch) {\n filenameFromContentDeposition = decodeURIComponent(filenameStarRegexMatch[1]); // the filename* format in the Content-Disposition header follows RFC 5987, which allows encoding non-ASCII characters using percent encoding. so example%20file.pdf becomes example file.pdf\n } else {\n // Fallback to the regular filename format\n const filenameMatch = contentDisposition.match(/filename=\"?([^\"]+)\"?/); // Content-Disposition: attachment; filename=example.pdf\n if (filenameMatch) {\n filenameFromContentDeposition = filenameMatch[1];\n }\n }\n this.respContentDisposition = filenameFromContentDeposition;\n respBlob = await fetchResponse.blob();\n this.responseBlobUrl = URL.createObjectURL(respBlob);\n }\n } else {\n respText = await fetchResponse.text();\n this.responseText = respText;\n }\n this.dispatchEvent(new CustomEvent('after-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: fetchRequest,\n response: responseClone,\n responseHeaders: respHeadersObj,\n responseBody: respJson || respText || respBlob,\n responseStatus: responseClone.ok,\n },\n }));\n } catch (err) {\n tryBtnEl.disabled = false;\n if (err.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('request-aborted', {\n bubbles: true,\n composed: true,\n detail: {\n err,\n request: fetchRequest,\n },\n }));\n this.responseMessage = 'Request Aborted';\n this.responseText = 'Request Aborted';\n } else {\n this.dispatchEvent(new CustomEvent('after-try', {\n bubbles: true,\n composed: true,\n detail: {\n err,\n request: fetchRequest,\n },\n }));\n this.responseMessage = `${err.message} (CORS or Network Issue)`;\n }\n }\n this.requestUpdate();\n }\n\n liveCURLSyntaxUpdate(requestPanelEl) {\n this.applyCURLSyntax(requestPanelEl);\n this.requestUpdate();\n }\n\n onGenerateCURLClick(e) {\n const requestPanelEl = this.getRequestPanel(e);\n this.applyCURLSyntax(requestPanelEl);\n }\n\n getRequestPanel(e) {\n return e.target.closest('.request-panel');\n }\n\n applyCURLSyntax(requestPanelEl) {\n const fetchUrl = this.buildFetchURL(requestPanelEl);\n const fetchOptions = this.buildFetchBodyOptions(requestPanelEl);\n const fetchHeaders = this.buildFetchHeaders(requestPanelEl);\n\n this.curlSyntax = this.generateCURLSyntax(fetchUrl, fetchHeaders, fetchOptions, requestPanelEl);\n }\n\n generateCURLSyntax(fetchUrl, fetchHeaders, fetchOptions, requestPanelEl) {\n let curlUrl;\n let curl = '';\n let curlHeaders = '';\n let curlData = '';\n let curlForm = '';\n const requestBodyContainerEl = requestPanelEl.querySelector('.request-body-container');\n\n if (fetchUrl.startsWith('http') === false) {\n const url = new URL(fetchUrl, window.location.href);\n curlUrl = url.href;\n } else {\n curlUrl = fetchUrl;\n }\n\n curl = `curl -X ${this.method.toUpperCase()} \"${curlUrl}\" \\\\\\n`;\n\n fetchHeaders.forEach((value, key) => {\n let tempHeaderArray = value.split(',');\n tempHeaderArray = tempHeaderArray.map((el) => el.trim()).filter((string, index) => tempHeaderArray.indexOf(string) === index);\n fetchHeaders.set(key, tempHeaderArray.join(', '));\n });\n\n curlHeaders = Array.from(fetchHeaders).map(([key, value]) => ` -H '${key}: ${value}'`).join('\\\\\\n');\n if (curlHeaders) {\n curlHeaders = `${curlHeaders} \\\\\\n`;\n }\n if (fetchOptions.body instanceof URLSearchParams) {\n curlData = ` -d ${fetchOptions.body.toString()} \\\\\\n`;\n } else if (fetchOptions.body instanceof File) {\n curlData = ` --data-binary @${fetchOptions.body.name} \\\\\\n`;\n } else if (fetchOptions.body instanceof FormData) {\n curlForm = Array.from(fetchOptions.body).reduce((aggregator, [key, value]) => {\n if (value instanceof File) {\n return [...aggregator, ` -F \"${key}=@${value.name}\"`];\n }\n\n const multiple = value.match(/([^,],)/gm);\n\n if (multiple) {\n const multipleResults = multiple.map((one) => `-F \"${key}[]=${one}\"`);\n\n return [...aggregator, ...multipleResults];\n }\n\n return [...aggregator, ` -F \"${key}=${value}\"`];\n }, []).join('\\\\\\n');\n } else if (requestBodyContainerEl && requestBodyContainerEl.dataset.selectedRequestBodyType) {\n const requestBodyType = requestBodyContainerEl.dataset.selectedRequestBodyType;\n const exampleTextAreaEl = requestPanelEl.querySelector('.request-body-param-user-input');\n if (exampleTextAreaEl?.value) {\n fetchOptions.body = exampleTextAreaEl.value;\n if (requestBodyType.includes('json')) {\n try {\n curlData = ` -d '${JSON.stringify(JSON.parse(exampleTextAreaEl.value))}' \\\\\\n`;\n } catch {\n // Ignore.\n }\n }\n if (!curlData) {\n curlData = ` -d '${exampleTextAreaEl.value.replace(/'/g, '\\'\"\\'\"\\'')}' \\\\\\n`;\n }\n }\n }\n\n return `${curl}${curlHeaders}${curlData}${curlForm}`;\n }\n\n onAddRemoveFileInput(e, pname, ptype) {\n if (e.target.tagName.toLowerCase() !== 'button') {\n return;\n }\n\n if (e.target.classList.contains('file-input-remove-btn')) {\n // Remove File Input Set\n const el = e.target.closest('.input-set');\n el.remove();\n return;\n }\n const el = e.target.closest('.file-input-container');\n\n // Add File Input Set\n\n // Container\n const newInputContainerEl = document.createElement('div');\n newInputContainerEl.setAttribute('class', 'input-set row');\n\n // File Input\n const newInputEl = document.createElement('input');\n newInputEl.type = 'file';\n newInputEl.style = 'width:200px; margin-top:2px;';\n newInputEl.setAttribute('data-pname', pname);\n newInputEl.setAttribute('data-ptype', ptype.includes('form-urlencode') ? 'form-urlencode' : 'form-data');\n newInputEl.setAttribute('data-array', 'false');\n newInputEl.setAttribute('data-file-array', 'true');\n\n // Remover Button\n const newRemoveBtnEl = document.createElement('button');\n newRemoveBtnEl.setAttribute('class', 'file-input-remove-btn');\n newRemoveBtnEl.innerHTML = '✕';\n\n newInputContainerEl.appendChild(newInputEl);\n newInputContainerEl.appendChild(newRemoveBtnEl);\n el.insertBefore(newInputContainerEl, e.target);\n // el.appendChild(newInputContainerEl);\n }\n\n clearResponseData() {\n this.responseUrl = '';\n this.responseHeaders = '';\n this.responseText = '';\n this.responseStatus = 'success';\n this.responseMessage = '';\n this.responseIsBlob = false;\n this.responseBlobType = '';\n this.respContentDisposition = '';\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n }\n\n disconnectedCallback() {\n this.curlSyntax = '';\n // Cleanup ObjectURL for the blob data if this component created one\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n super.disconnectedCallback();\n }\n}\n\n// Register the element with the browser\ncustomElements.define('api-request', ApiRequest);\n","import RandExp from 'randexp';\n\n// Make RandExp determinist\nRandExp.prototype.randInt = (from) => from;\n\n// Takes a value as input and provides a printable string to replresent null values, spaces, blankstring etc\nexport function getPrintableVal(val) {\n if (val === undefined) {\n return '';\n }\n if (val === null) {\n return 'null';\n }\n if (val === '') {\n return '∅';\n }\n if (typeof val === 'boolean' || typeof val === 'number') {\n return `${val}`;\n }\n if (Array.isArray(val)) {\n return val.map((v) => (v === null ? 'null' : v === '' ? '∅' : v.toString().replace(/^ +| +$/g, (m) => '●'.repeat(m.length)) || '')).join(', ');\n }\n if (typeof val === 'object') {\n const keys = Object.keys(val);\n return `{ ${keys[0]}:${val[keys[0]]}${keys.length > 1 ? ',' : ''} ... }`;\n }\n return val.toString().replace(/^ +| +$/g, (m) => '●'.repeat(m.length)) || '';\n}\n\n/* Generates an schema object containing type and constraint info */\nexport function getTypeInfo(schema) {\n if (!schema) {\n return;\n }\n let dataType = '';\n let constrain = '';\n // let examples;\n\n if (schema.$ref) {\n const n = schema.$ref.lastIndexOf('/');\n const schemaNode = schema.$ref.substring(n + 1);\n dataType = `{recursive: ${schemaNode}} `;\n } else if (schema.type) {\n dataType = Array.isArray(schema.type) ? schema.type.join(schema.length === 2 ? ' or ' : '┃') : schema.type;\n if (schema.format || schema.enum || schema.const) {\n dataType = dataType.replace('string', schema.enum ? 'enum' : schema.const ? 'const' : schema.format);\n }\n if (schema.nullable) {\n dataType += '┃null';\n }\n } else if (schema.const) {\n dataType = 'const';\n } else if (Object.keys(schema).length === 0) {\n dataType = 'any';\n } else {\n dataType = '{missing-type-info}';\n }\n\n const info = {\n type: dataType,\n format: schema.format || '',\n pattern: (schema.pattern && !schema.enum) ? schema.pattern : '',\n readOrWriteOnly: (schema.readOnly ? '🆁' : schema.writeOnly ? '🆆' : ''),\n deprecated: schema.deprecated ? '❌' : '',\n examples: schema.examples || schema.example,\n default: getPrintableVal(schema.default),\n description: schema.description || '',\n constrain: '',\n allowedValues: '',\n arrayType: '',\n html: '',\n };\n\n if (info.type === '{recursive}') {\n info.description = schema.$ref.substring(schema.$ref.lastIndexOf('/') + 1);\n } else if (info.type === '{missing-type-info}' || info.type === 'any') {\n info.description = info.description || '';\n }\n // Set Allowed Values\n info.allowedValues = schema.const\n ? schema.const\n : Array.isArray(schema.enum)\n ? schema.enum.map((v) => (getPrintableVal(v))).join('┃')\n : '';\n\n if (dataType === 'array' && schema.items) {\n const arrayItemType = schema.items?.type;\n const arrayItemDefault = getPrintableVal(schema.items.default);\n\n info.arrayType = `${schema.type} of ${Array.isArray(arrayItemType) ? arrayItemType.join('') : arrayItemType}`;\n info.default = arrayItemDefault;\n info.allowedValues = schema.items.const\n ? schema.const\n : Array.isArray(schema.items?.enum)\n ? schema.items.enum.map((v) => (getPrintableVal(v))).join('┃')\n : '';\n }\n if (dataType.match(/integer|number/g)) {\n if (schema.minimum !== undefined || schema.exclusiveMinimum !== undefined) {\n constrain += schema.minimum !== undefined ? `Min ${schema.minimum}` : `More than ${schema.exclusiveMinimum}`;\n }\n if (schema.maximum !== undefined || schema.exclusiveMaximum !== undefined) {\n constrain += schema.maximum !== undefined ? `${constrain ? '┃' : ''}Max ${schema.maximum}` : `${constrain ? '┃' : ''}Less than ${schema.exclusiveMaximum}`;\n }\n if (schema.multipleOf !== undefined) {\n constrain += `${constrain ? '┃' : ''} multiple of ${schema.multipleOf}`;\n }\n }\n if (dataType.match(/string/g)) {\n if (schema.minLength !== undefined && schema.maxLength !== undefined) {\n constrain += `${constrain ? '┃' : ''}${schema.minLength} to ${schema.maxLength} chars`;\n } else if (schema.minLength !== undefined) {\n constrain += `${constrain ? '┃' : ''}Min ${schema.minLength} chars`;\n } else if (schema.maxLength !== undefined) {\n constrain += `Max ${constrain ? '┃' : ''}${schema.maxLength} chars`;\n }\n }\n info.constrain = constrain;\n info.html = `${info.type}~|~${info.readOrWriteOnly}~|~${info.constrain}~|~${info.default}~|~${info.allowedValues}~|~${info.pattern}~|~${info.description}~|~${schema.title || ''}~|~${info.deprecated ? 'deprecated' : ''}`;\n return info;\n}\n\n/**\n *\n * @param {*} ex if the value\n * - Is an Object with 'value' property like\n * { 'value': 'example_val1', 'description': 'some description' }\n * Returns >>>\n * {\n * 'Example': { 'value' : 'example_val1', 'description': 'some description' },\n * }\n * - Is an object where each key represents a valid example object (i,e has a value property)\n * {\n * 'example1': { 'value' : 'example_val1', 'description': 'some description' },\n * 'example2': { 'value' : 'example_val2', 'description': 'some other description' },\n * 'invalid': { 'description': 'invalid example object without any value property' }\n * }\n * Returns >>>\n * {\n * 'example1': { 'value' : 'example_val1', 'description': 'some description' },\n * 'example2': { 'value' : 'example_val2', 'description': 'some other description' }\n * }\n * if none of the keys represents an object with 'value' property then return undefined\n * - Is an array of premitive values\n * ['example_val1', 'example_val2']\n * Returns >>>\n * {\n * 'Example1': {value:'value1'}\n * 'Example2': {value:'value2'}\n * }\n * - Is a premitive value\n * 'example_val1'\n * Returns >>>\n * {\n * 'Example': { 'value': 'example_val1' }\n * }\n * - Is undefined\n * returns undefined\n * @returns\n */\n\nexport function standardizeExample(ex) {\n if (typeof ex === 'object' && !Array.isArray(ex)) {\n if (ex.value !== undefined) {\n // Case 1: Single object with 'value' property\n return { Example: { ...ex } };\n }\n // Case 2: Object where each key is an object with a 'value' property\n const filteredEntries = Object.entries(ex).filter(([_, obj]) => obj.value !== undefined); // eslint-disable-line\n // If no valid entries found, return JSON.stringify of the input\n if (filteredEntries.length === 0) {\n return undefined;\n }\n return Object.fromEntries(filteredEntries);\n } if (Array.isArray(ex)) {\n // Case 3: Array of primitive values\n return ex.reduce((acc, value, index) => {\n acc[`Example${index + 1}`] = { value };\n return acc;\n }, {});\n }\n // Case 4: Single primitive value\n return ex ? { Example: { value: ex } } : undefined;\n}\n\n/**\n * Normalize example object in the following format (List of object which is used to render example links and fill the input boxes)\n * [{\n * exampleVal : 'value to be rendered on the input control (text-box)',\n * exampleList : [\n * value : '',\n * printableValue: '',\n * summary : '',\n * description : ''\n * ]\n * }]\n * */\nexport function normalizeExamples(examples, dataType = 'string') {\n if (!examples) {\n return {\n exampleVal: '',\n exampleList: [],\n };\n }\n if (examples.constructor === Object) {\n const exampleList = Object.values(examples)\n .filter((v) => (v['x-example-show-value'] !== false))\n .map((v) => ({\n value: (typeof v.value === 'boolean' || typeof v.value === 'number' ? `${v.value}` : (v.value || '')),\n printableValue: getPrintableVal(v.value),\n summary: v.summary || '',\n description: v.description || '',\n }));\n const exampleVal = exampleList.length > 0\n ? exampleList[0].value\n : '';\n return { exampleVal, exampleList };\n }\n\n // This is non-standard way to provide example but will support for now\n if (!Array.isArray(examples)) {\n examples = examples ? [examples] : [];\n }\n\n if (examples.length === 0) {\n return {\n exampleVal: '',\n exampleList: [],\n };\n }\n\n if (dataType === 'array') {\n const [exampleVal] = examples;\n const exampleList = examples.map((v) => ({\n value: v,\n printableValue: getPrintableVal(v),\n }));\n return { exampleVal, exampleList };\n }\n\n const exampleVal = examples[0].toString();\n const exampleList = examples.map((v) => ({\n value: v.toString(),\n printableValue: getPrintableVal(v),\n }));\n return { exampleVal, exampleList };\n}\n\nexport function anyExampleWithSummaryOrDescription(examples) {\n return examples.some((x) => x.summary?.length > 0 || x.description?.length > 0);\n}\n\nexport function getSampleValueByType(schemaObj) {\n const example = schemaObj.examples\n ? schemaObj.examples[0]\n : schemaObj.example === null\n ? null\n : schemaObj.example || undefined;\n if (example === '') { return ''; }\n if (example === null) { return null; }\n if (example === 0) { return 0; }\n if (example === false) { return false; }\n if (example instanceof Date) {\n switch (schemaObj.format.toLowerCase()) {\n case 'date':\n return example.toISOString().split('T')[0];\n case 'time':\n return example.toISOString().split('T')[1];\n default:\n return example.toISOString();\n }\n }\n if (example) { return example; }\n\n if (Object.keys(schemaObj).length === 0) {\n return null;\n }\n if (schemaObj.$ref) {\n // Indicates a Circular ref\n return {};\n }\n if (schemaObj.const === false || schemaObj.const === 0 || schemaObj.const === null || schemaObj.const === '') {\n return schemaObj.const;\n }\n if (schemaObj.const) {\n return schemaObj.const;\n }\n if (schemaObj.default) {\n return schemaObj.default;\n }\n const typeValue = Array.isArray(schemaObj.type) ? schemaObj.type[0] : schemaObj.type;\n if (!typeValue) {\n return null;\n }\n if (typeValue.match(/^integer|^number/g)) {\n const multipleOf = Number.isNaN(Number(schemaObj.multipleOf)) ? undefined : Number(schemaObj.multipleOf);\n const maximum = Number.isNaN(Number(schemaObj.maximum)) ? undefined : Number(schemaObj.maximum);\n const minimumPossibleVal = Number.isNaN(Number(schemaObj.minimum))\n ? Number.isNaN(Number(schemaObj.exclusiveMinimum))\n ? maximum || 0\n : Number(schemaObj.exclusiveMinimum) + (typeValue.startsWith('integer') ? 1 : 0.001)\n : Number(schemaObj.minimum);\n const finalVal = multipleOf\n ? multipleOf >= minimumPossibleVal\n ? multipleOf\n : minimumPossibleVal % multipleOf === 0\n ? minimumPossibleVal\n : Math.ceil(minimumPossibleVal / multipleOf) * multipleOf\n : minimumPossibleVal;\n return finalVal;\n }\n if (typeValue.match(/^boolean/g)) { return false; }\n if (typeValue.match(/^null/g)) { return null; }\n if (typeValue.match(/^string/g)) {\n if (schemaObj.enum) { return schemaObj.enum[0]; }\n if (schemaObj.const) { return schemaObj.const; }\n if (schemaObj.pattern) {\n try {\n return new RandExp(schemaObj.pattern).gen();\n } catch {\n return schemaObj.pattern;\n }\n }\n if (schemaObj.format) {\n const u = `${Date.now().toString(16)}${Math.random().toString(16)}0`.repeat(16);\n switch (schemaObj.format.toLowerCase()) {\n case 'url':\n case 'uri':\n return 'http://example.com';\n case 'date':\n return (new Date(0)).toISOString().split('T')[0];\n case 'time':\n return (new Date(0)).toISOString().split('T')[1];\n case 'date-time':\n return (new Date(0)).toISOString();\n case 'duration':\n return 'P3Y6M4DT12H30M5S'; // P=Period 3-Years 6-Months 4-Days 12-Hours 30-Minutes 5-Seconds\n case 'email':\n case 'idn-email':\n return 'user@example.com';\n case 'hostname':\n case 'idn-hostname':\n return 'www.example.com';\n case 'ipv4':\n return '198.51.100.42';\n case 'ipv6':\n return '2001:0db8:5b96:0000:0000:426f:8e17:642a';\n case 'uuid':\n return [u.substring(0, 8), u.substring(8, 12), `4000-8${u.substring(13, 16)}`, u.substring(16, 28)].join('-');\n case 'byte':\n return 'ZXhhbXBsZQ=='; // 'example' base64 encoded. See https://spec.openapis.org/oas/v3.0.0#data-types\n default:\n return '';\n }\n } else {\n const minLength = Number.isNaN(schemaObj.minLength) ? undefined : Number(schemaObj.minLength);\n const maxLength = Number.isNaN(schemaObj.maxLength) ? undefined : Number(schemaObj.maxLength);\n const finalLength = minLength || (maxLength > 6 ? 6 : maxLength || undefined);\n return finalLength ? 'A'.repeat(finalLength) : 'string';\n }\n }\n // If type cannot be determined\n return null;\n}\n\n/*\njson2xml- TestCase\n {\n 'prop1' : 'one',\n 'prop2' : 'two',\n 'prop3' : [ 'a', 'b', 'c' ],\n 'prop4' : {\n 'ob1' : 'val-1',\n 'ob2' : 'val-2'\n }\n }\n \n simple\n \n <0>a\n <1>b\n <2>c\n \n \n val-1\n val-2\n \n \n*/\nexport function json2xml(obj, level = 1) {\n const indent = ' '.repeat(level);\n let xmlText = '';\n if (level === 1 && typeof obj !== 'object') {\n return `\\n${indent}${obj.toString()}`;\n }\n for (const prop in obj) {\n const tagNameOrProp = (obj[prop]['::XML_TAG'] || prop);\n let tagName = '';\n if (Array.isArray(obj[prop])) {\n tagName = tagNameOrProp[0]['::XML_TAG'] || `${prop}`;\n } else {\n tagName = tagNameOrProp;\n }\n if (prop.startsWith('::')) {\n continue;\n }\n if (Array.isArray(obj[prop])) {\n xmlText = `${xmlText}\\n${indent}<${tagName}>${json2xml(obj[prop], level + 1)}\\n${indent}`;\n } else if (typeof obj[prop] === 'object') {\n xmlText = `${xmlText}\\n${indent}<${tagName}>${json2xml(obj[prop], level + 1)}\\n${indent}`;\n } else {\n xmlText = `${xmlText}\\n${indent}<${tagName}>${obj[prop].toString()}`;\n }\n }\n return xmlText;\n}\n\nfunction addSchemaInfoToExample(schema, obj) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n if (schema.title) {\n obj['::TITLE'] = schema.title;\n }\n if (schema.description) {\n obj['::DESCRIPTION'] = schema.description;\n }\n if (schema.xml?.name) {\n obj['::XML_TAG'] = schema.xml?.name;\n }\n if (schema.xml?.wrapped) {\n obj['::XML_WRAP'] = schema.xml?.wrapped.toString();\n }\n}\n\nfunction removeTitlesAndDescriptions(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n delete obj['::TITLE'];\n delete obj['::DESCRIPTION'];\n delete obj['::XML_TAG'];\n delete obj['::XML_WRAP'];\n for (const k in obj) {\n removeTitlesAndDescriptions(obj[k]);\n }\n}\n\nfunction addPropertyExampleToObjectExamples(example, obj, propertyKey) {\n for (const key in obj) {\n obj[key][propertyKey] = example;\n }\n}\n\nfunction mergePropertyExamples(obj, propertyName, propExamples) {\n // Create an example for each variant of the propertyExample, merging them with the current (parent) example\n let i = 0;\n const maxCombinations = 10;\n const mergedObj = {};\n for (const exampleKey in obj) {\n for (const propExampleKey in propExamples) {\n mergedObj[`example-${i}`] = { ...obj[exampleKey] };\n mergedObj[`example-${i}`][propertyName] = propExamples[propExampleKey];\n i++;\n if (i >= maxCombinations) {\n break;\n }\n }\n if (i >= maxCombinations) {\n break;\n }\n }\n return mergedObj;\n}\n\n/* For changing JSON-Schema to a Sample Object, as per the schema (to generate examples based on schema) */\nexport function schemaToSampleObj(schema, config = { }) {\n let obj = {};\n if (!schema) {\n return;\n }\n if (schema.allOf) {\n const objWithAllProps = {};\n\n if (schema.allOf.length === 1 && !schema.allOf[0]?.properties && !schema.allOf[0]?.items) {\n // If allOf has single item and the type is not an object or array, then its a primitive\n if (schema.allOf[0].$ref) {\n return '{ }';\n }\n if (schema.allOf[0].readOnly && config.includeReadOnly) {\n const tempSchema = schema.allOf[0];\n return getSampleValueByType(tempSchema);\n }\n return;\n }\n\n schema.allOf.forEach((v) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const partialObj = schemaToSampleObj(v, config);\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type === 'array' || v.items) {\n const partialObj = [schemaToSampleObj(v, config)];\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type) {\n const prop = `prop${Object.keys(objWithAllProps).length}`;\n objWithAllProps[prop] = getSampleValueByType(v);\n } else {\n return '';\n }\n });\n\n obj = objWithAllProps;\n } else if (schema.oneOf) {\n // 1. First create example with scheme.properties\n const objWithSchemaProps = {};\n if (schema.properties) {\n for (const propertyName in schema.properties) {\n if (schema.properties[propertyName].properties || schema.properties[propertyName].properties?.items) {\n objWithSchemaProps[propertyName] = schemaToSampleObj(schema.properties[propertyName], config);\n } else {\n objWithSchemaProps[propertyName] = getSampleValueByType(schema.properties[propertyName]);\n }\n }\n }\n\n if (schema.oneOf.length > 0) {\n /*\n oneOf:\n - type: object\n properties:\n option1_PropA:\n type: string\n option1_PropB:\n type: string\n - type: object\n properties:\n option2_PropX:\n type: string\n properties:\n prop1:\n type: string\n prop2:\n type: string\n minLength: 10\n\n The aboove Schem should generate the following 2 examples\n\n Example-1\n {\n prop1: 'string',\n prop2: 'AAAAAAAAAA', <-- min-length 10\n option1_PropA: 'string',\n option1_PropB: 'string'\n }\n\n Example-2\n {\n prop1: 'string',\n prop2: 'AAAAAAAAAA', <-- min-length 10\n option2_PropX: 'string'\n }\n */\n let i = 0;\n // Merge all examples of each oneOf-schema\n for (const key in schema.oneOf) {\n const oneOfSamples = schemaToSampleObj(schema.oneOf[key], config);\n for (const sampleKey in oneOfSamples) {\n // 2. In the final example include a one-of item along with properties\n let finalExample;\n if (Object.keys(objWithSchemaProps).length > 0) {\n if (oneOfSamples[sampleKey] === null || typeof oneOfSamples[sampleKey] !== 'object') {\n // This doesn't really make sense since every oneOf schema _should_ be an object if there are common properties, so we'll skip this\n continue;\n } else {\n finalExample = Object.assign(oneOfSamples[sampleKey], objWithSchemaProps);\n }\n } else {\n finalExample = oneOfSamples[sampleKey];\n }\n obj[`example-${i}`] = finalExample;\n addSchemaInfoToExample(schema.oneOf[key], obj[`example-${i}`]);\n i++;\n }\n }\n }\n } else if (schema.anyOf) {\n // First generate values for regular properties\n let commonObj;\n if (schema.type === 'object' || schema.properties) {\n commonObj = { 'example-0': {} };\n for (const propertyName in schema.properties) {\n if (schema.example) {\n commonObj = schema;\n break;\n }\n if (schema.properties[propertyName].deprecated && !config.includeDeprecated) { continue; }\n if (schema.properties[propertyName].readOnly && !config.includeReadOnly) { continue; }\n if (schema.properties[propertyName].writeOnly && !config.includeWriteOnly) { continue; }\n commonObj = mergePropertyExamples(commonObj, propertyName, schemaToSampleObj(schema.properties[propertyName], config));\n }\n }\n\n // Combine every variant of the regular properties with every variant of the anyOf samples\n let i = 0;\n for (const key in schema.anyOf) {\n const anyOfSamples = schemaToSampleObj(schema.anyOf[key], config);\n for (const sampleKey in anyOfSamples) {\n if (typeof commonObj !== 'undefined') {\n for (const commonKey in commonObj) {\n obj[`example-${i}`] = { ...commonObj[commonKey], ...anyOfSamples[sampleKey] };\n }\n } else {\n obj[`example-${i}`] = anyOfSamples[sampleKey];\n }\n addSchemaInfoToExample(schema.anyOf[key], obj[`example-${i}`]);\n i++;\n }\n }\n } else if (schema.type === 'object' || schema.properties) {\n obj['example-0'] = {};\n addSchemaInfoToExample(schema, obj['example-0']);\n if (schema.example) {\n obj['example-0'] = schema.example;\n } else {\n for (const propertyName in schema.properties) {\n if (schema.properties[propertyName]?.deprecated && !config.includeDeprecated) { continue; }\n if (schema.properties[propertyName]?.readOnly && !config.includeReadOnly) { continue; }\n if (schema.properties[propertyName]?.writeOnly && !config.includeWriteOnly) { continue; }\n if (schema.properties[propertyName]?.type === 'array' || schema.properties[propertyName]?.items) {\n if (schema.properties[propertyName].example) {\n addPropertyExampleToObjectExamples(schema.properties[propertyName].example, obj, propertyName);\n } else if (schema.properties[propertyName]?.items?.example) { // schemas and properties support single example but not multiple examples.\n addPropertyExampleToObjectExamples([schema.properties[propertyName].items.example], obj, propertyName);\n } else {\n const itemSamples = schemaToSampleObj(schema.properties[propertyName].items, config);\n if (config.useXmlTagForProp) {\n const xmlTagName = schema.properties[propertyName].xml?.name || propertyName;\n if (schema.properties[propertyName].xml?.wrapped) {\n const wrappedItemSample = JSON.parse(`{ \"${xmlTagName}\" : { \"${xmlTagName}\" : ${JSON.stringify(itemSamples['example-0'])} } }`);\n obj = mergePropertyExamples(obj, xmlTagName, wrappedItemSample);\n } else {\n obj = mergePropertyExamples(obj, xmlTagName, itemSamples);\n }\n } else {\n const arraySamples = [];\n for (const key in itemSamples) {\n arraySamples[key] = [itemSamples[key]];\n }\n obj = mergePropertyExamples(obj, propertyName, arraySamples);\n }\n }\n continue;\n }\n obj = mergePropertyExamples(obj, propertyName, schemaToSampleObj(schema.properties[propertyName], config));\n }\n if (typeof schema.additionalProperties === 'object') {\n const propertyName = schema.additionalProperties['x-additionalPropertiesName'] || 'property';\n obj = mergePropertyExamples(obj, `${propertyName}1`, schemaToSampleObj(schema.additionalProperties, config));\n obj = mergePropertyExamples(obj, `${propertyName}2`, schemaToSampleObj(schema.additionalProperties, config));\n }\n }\n } else if (schema.type === 'array' || schema.items) {\n if (schema.items || schema.example) {\n if (schema.example) {\n obj['example-0'] = schema.example;\n } else if (schema.items?.example) { // schemas and properties support single example but not multiple examples.\n obj['example-0'] = [schema.items.example];\n } else {\n const samples = schemaToSampleObj(schema.items, config);\n let i = 0;\n for (const key in samples) {\n obj[`example-${i}`] = [samples[key]];\n addSchemaInfoToExample(schema.items, obj[`example-${i}`]);\n i++;\n }\n }\n } else {\n obj['example-0'] = [];\n }\n } else {\n return { 'example-0': getSampleValueByType(schema) };\n }\n return obj;\n}\n\nfunction generateMarkdownForArrayAndObjectDescription(schema, level = 0) {\n let markdown = ((schema.description || schema.title) && (schema.minItems || schema.maxItems)) ? '' : '';\n if (schema.title) {\n if (schema.description) {\n markdown = `${markdown} ${schema.title}: ${schema.description}
`;\n } else {\n markdown = `${markdown} ${schema.title}
`;\n }\n } else if (schema.description) {\n markdown = `${markdown} ${schema.description}
`;\n }\n if (schema.minItems) {\n markdown = `${markdown} Min Items: ${schema.minItems}`;\n }\n if (schema.maxItems) {\n markdown = `${markdown} Max Items: ${schema.maxItems}`;\n }\n if (level > 0 && schema.items?.description) {\n let itemsMarkdown = '';\n if (schema.items.minProperties) {\n itemsMarkdown = `Min Properties: ${schema.items.minProperties}`;\n }\n if (schema.items.maxProperties) {\n itemsMarkdown = `${itemsMarkdown} Max Properties: ${schema.items.maxProperties}`;\n }\n markdown = `${markdown} ⮕ ${itemsMarkdown} [ ${schema.items.description} ] `;\n }\n return markdown;\n}\n/**\n * For changing OpenAPI-Schema to an Object Notation,\n * This Object would further be an input to UI Components to generate an Object-Tree\n * @param {object} schema - Schema object from OpenAPI spec\n * @param {object} obj - recursivly pass this object to generate object notation\n * @param {number} level - recursion level\n * @param {string} suffix - used for suffixing property names to avoid duplicate props during object composion\n */\nexport function schemaInObjectNotation(schema, obj, level = 0, suffix = '') {\n if (!schema) {\n return;\n }\n if (schema.allOf) {\n const objWithAllProps = {};\n if (schema.allOf.length === 1 && !schema.allOf[0].properties && !schema.allOf[0].items) {\n // If allOf has single item and the type is not an object or array, then its a primitive\n const tempSchema = schema.allOf[0];\n return `${getTypeInfo(tempSchema).html}`;\n }\n // If allOf is an array of multiple elements, then all the keys makes a single object\n schema.allOf.map((v, i) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const propSuffix = (v.anyOf || v.oneOf) && i > 0 ? i : '';\n const partialObj = schemaInObjectNotation(v, {}, (level + 1), propSuffix);\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type === 'array' || v.items) {\n const partialObj = schemaInObjectNotation(v, {}, (level + 1));\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type) {\n const prop = `prop${Object.keys(objWithAllProps).length}`;\n const typeObj = getTypeInfo(v);\n objWithAllProps[prop] = `${typeObj.html}`;\n } else {\n return '';\n }\n });\n obj = objWithAllProps;\n } else if (schema.anyOf || schema.oneOf) {\n obj['::description'] = schema.description || '';\n // 1. First iterate the regular properties\n if (schema.type === 'object' || schema.properties) {\n obj['::description'] = schema.description || '';\n obj['::type'] = 'object';\n // obj['::deprecated'] = schema.deprecated || false;\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n obj[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n obj[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n }\n // 2. Then show allof/anyof objects\n const objWithAnyOfProps = {};\n const xxxOf = schema.anyOf ? 'anyOf' : 'oneOf';\n schema[xxxOf].forEach((v, index) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const partialObj = schemaInObjectNotation(v, {});\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`] = partialObj;\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`]['::readwrite'] = ''; // xxx-options cannot be read or write only\n objWithAnyOfProps['::type'] = 'xxx-of-option';\n } else if (v.type === 'array' || v.items) {\n // This else-if block never seems to get executed\n const partialObj = schemaInObjectNotation(v, {});\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`] = partialObj;\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`]['::readwrite'] = ''; // xxx-options cannot be read or write only\n objWithAnyOfProps['::type'] = 'xxx-of-array';\n } else {\n const prop = `::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`;\n objWithAnyOfProps[prop] = `${getTypeInfo(v).html}`;\n objWithAnyOfProps['::type'] = 'xxx-of-option';\n }\n });\n obj[(schema.anyOf ? `::ANY~OF ${suffix}` : `::ONE~OF ${suffix}`)] = objWithAnyOfProps;\n // obj['::type'] = 'object';\n obj['::type'] = 'object';\n } else if (Array.isArray(schema.type)) {\n // When a property has multiple types, then check further if any of the types are array or object, if yes then modify the schema using one-of\n // Clone the schema - as it will be modified to replace multi-data-types with one-of;\n const subSchema = JSON.parse(JSON.stringify(schema));\n const primitiveType = [];\n const complexTypes = [];\n subSchema.type.forEach((v) => {\n if (v.match(/integer|number|string|null|boolean/g)) {\n primitiveType.push(v);\n } else if (v === 'array' && typeof subSchema.items?.type === 'string' && subSchema.items?.type.match(/integer|number|string|null|boolean/g)) {\n // Array with primitive types should also be treated as primitive type\n if (subSchema.items.type === 'string' && subSchema.items.format) {\n primitiveType.push(`[${subSchema.items.format}]`);\n } else {\n primitiveType.push(`[${subSchema.items.type}]`);\n }\n } else {\n complexTypes.push(v);\n }\n });\n let multiPrimitiveTypes;\n if (primitiveType.length > 0) {\n subSchema.type = primitiveType.join(primitiveType.length === 2 ? ' or ' : '┃');\n multiPrimitiveTypes = getTypeInfo(subSchema);\n if (complexTypes.length === 0) {\n return `${multiPrimitiveTypes?.html || ''}`;\n }\n }\n if (complexTypes.length > 0) {\n obj['::type'] = 'object';\n const multiTypeOptions = {\n '::type': 'xxx-of-option',\n };\n\n // Generate ONE-OF options for complexTypes\n complexTypes.forEach((v, i) => {\n if (v === 'null') {\n multiTypeOptions[`::OPTION~${i + 1}`] = 'NULL~|~~|~~|~~|~~|~~|~~|~~|~';\n } else if ('integer, number, string, boolean,'.includes(`${v},`)) {\n subSchema.type = Array.isArray(v) ? v.join('┃') : v;\n const primitiveTypeInfo = getTypeInfo(subSchema);\n multiTypeOptions[`::OPTION~${i + 1}`] = primitiveTypeInfo.html;\n } else if (v === 'object') {\n // If object type iterate all the properties and create an object-type-option\n const objTypeOption = {\n '::title': schema.title || '',\n '::description': schema.description || '',\n '::type': 'object',\n '::deprecated': schema.deprecated || false,\n };\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n objTypeOption[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n objTypeOption[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n multiTypeOptions[`::OPTION~${i + 1}`] = objTypeOption;\n } else if (v === 'array') {\n multiTypeOptions[`::OPTION~${i + 1}`] = {\n '::title': schema.title || '',\n '::description': schema.description || '',\n '::type': 'array',\n '::props': schemaInObjectNotation(schema.items, {}, (level + 1)),\n };\n }\n });\n multiTypeOptions[`::OPTION~${complexTypes.length + 1}`] = multiPrimitiveTypes?.html || '';\n obj['::ONE~OF'] = multiTypeOptions;\n }\n } else if (schema.type === 'object' || schema.properties) { // If Object\n obj['::title'] = schema.title || '';\n obj['::description'] = generateMarkdownForArrayAndObjectDescription(schema, level);\n obj['::type'] = 'object';\n if ((Array.isArray(schema.type) && schema.type.includes('null')) || schema.nullable) {\n obj['::dataTypeLabel'] = 'object or null';\n obj['::nullable'] = true;\n }\n obj['::deprecated'] = schema.deprecated || false;\n obj['::readwrite'] = schema.readOnly ? 'readonly' : schema.writeOnly ? 'writeonly' : '';\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n obj[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n obj[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n for (const key in schema.patternProperties) {\n obj[`[pattern: ${key}]`] = schemaInObjectNotation(schema.patternProperties[key], obj, (level + 1));\n }\n if (schema.additionalProperties) {\n obj['[any-key]'] = schemaInObjectNotation(schema.additionalProperties, {});\n }\n } else if (schema.type === 'array' || schema.items) { // If Array\n obj['::title'] = schema.title || '';\n obj['::description'] = generateMarkdownForArrayAndObjectDescription(schema, level);\n obj['::type'] = 'array';\n if ((Array.isArray(schema.type) && schema.type.includes('null')) || schema.nullable) {\n obj['::dataTypeLabel'] = 'array or null';\n obj['::nullable'] = true;\n }\n obj['::deprecated'] = schema.deprecated || false;\n obj['::readwrite'] = schema.readOnly ? 'readonly' : schema.writeOnly ? 'writeonly' : '';\n if (schema.items?.items) {\n obj['::array-type'] = schema.items.items.type;\n }\n obj['::props'] = schemaInObjectNotation(schema.items, {}, (level + 1));\n } else {\n const typeObj = getTypeInfo(schema);\n if (typeObj?.html) {\n return `${typeObj.html}`;\n }\n return '';\n }\n return obj;\n}\n\n/* Create Example object */\nexport function generateExample(schema, mimeType, examples = {}, example = {}, includeReadOnly = true, includeWriteOnly = true, outputType = 'json', includeGeneratedExample = false) {\n const finalExamples = [];\n // First check if examples is provided\n if (examples) {\n for (const eg in examples) {\n let egContent = '';\n let egFormat = 'json';\n if (mimeType?.toLowerCase().includes('json')) {\n if (outputType === 'text') {\n egContent = typeof examples[eg].value === 'string' ? examples[eg].value : JSON.stringify(examples[eg].value, undefined, 2);\n egFormat = 'text';\n } else {\n egContent = examples[eg].value;\n if (typeof examples[eg].value === 'string') {\n try {\n // const fixedJsonString = examples[eg].value.replace((/([\\w]+)(:)/g), '\"$1\"$2').replace((/'/g), '\"');\n const fixedJsonString = examples[eg].value;\n egContent = JSON.parse(fixedJsonString);\n egFormat = 'json';\n } catch {\n egFormat = 'text';\n egContent = examples[eg].value;\n }\n }\n }\n } else {\n egContent = examples[eg].value;\n egFormat = 'text';\n }\n\n finalExamples.push({\n exampleId: eg,\n exampleSummary: examples[eg].summary || eg,\n exampleDescription: examples[eg].description || '',\n exampleType: mimeType,\n exampleValue: egContent,\n exampleFormat: egFormat,\n });\n }\n } else if (example) {\n let egContent = '';\n let egFormat = 'json';\n if (mimeType?.toLowerCase().includes('json')) {\n if (outputType === 'text') {\n egContent = typeof example === 'string' ? example : JSON.stringify(example, undefined, 2);\n egFormat = 'text';\n } else if (typeof example === 'object') {\n egContent = example;\n egFormat = 'json';\n } else if (typeof example === 'string') {\n try {\n egContent = JSON.parse(example);\n egFormat = 'json';\n } catch {\n egFormat = 'text';\n egContent = example;\n }\n }\n } else {\n egContent = example;\n egFormat = 'text';\n }\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: egContent,\n exampleFormat: egFormat,\n });\n }\n // If schema-level examples are not provided or includeGeneratedExample === true then generate one based on the schema field types\n if (finalExamples.length === 0 || includeGeneratedExample === true) {\n if (schema) {\n if (schema.example) {\n // Note: Deprecated: The 'example' property has been deprecated in 3.1.0 in favor of the JSON Schema 'examples' keyword\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: schema.example,\n exampleFormat: ((mimeType?.toLowerCase().includes('json') && typeof schema.example === 'object') ? 'json' : 'text'),\n });\n } else if (mimeType?.toLowerCase().includes('json') || mimeType?.toLowerCase().includes('text') || mimeType?.toLowerCase().includes('*/*') || mimeType?.toLowerCase().includes('xml')) {\n let xmlRootStart = '';\n let xmlRootEnd = '';\n let exampleFormat = '';\n let exampleValue = '';\n if (mimeType?.toLowerCase().includes('xml')) {\n xmlRootStart = schema.xml?.name ? `<${schema.xml.name} ${schema.xml.namespace ? `xmlns=\"${schema.xml.namespace}\"` : ''}>` : '';\n xmlRootEnd = schema.xml?.name ? `` : '';\n exampleFormat = 'text';\n } else {\n exampleFormat = outputType;\n }\n const samples = schemaToSampleObj(schema, { includeReadOnly, includeWriteOnly, deprecated: true, useXmlTagForProp: mimeType?.toLowerCase().includes('xml') });\n let i = 0;\n for (const samplesKey in samples) {\n if (!samples[samplesKey]) {\n continue;\n }\n const summary = samples[samplesKey]['::TITLE'] || `Example ${++i}`;\n const description = samples[samplesKey]['::DESCRIPTION'] || '';\n if (mimeType?.toLowerCase().includes('xml')) {\n exampleValue = `\\n${xmlRootStart}${json2xml(samples[samplesKey], 1)}\\n${xmlRootEnd}`;\n } else {\n removeTitlesAndDescriptions(samples[samplesKey]);\n exampleValue = outputType === 'text' ? JSON.stringify(samples[samplesKey], null, 2) : samples[samplesKey];\n }\n\n finalExamples.push({\n exampleId: samplesKey,\n exampleSummary: summary,\n exampleDescription: description,\n exampleType: mimeType,\n exampleFormat,\n exampleValue,\n });\n }\n } else if (mimeType?.toLowerCase().includes('jose')) {\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: 'Base64 Encoded',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: schema.pattern || 'bXJpbg==',\n exampleFormat: 'text',\n });\n } else {\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: '',\n exampleFormat: 'text',\n });\n }\n } else {\n // No Example or Schema provided (should never reach here)\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: '',\n exampleFormat: 'text',\n });\n }\n }\n return finalExamples;\n}\n\nfunction getSerializeStyleForContentType(contentType) {\n if (contentType === 'application/json') {\n return 'json';\n }\n if (contentType === 'application/xml') {\n return 'xml';\n }\n return null;\n}\n\nexport function getSchemaFromParam(param) {\n if (param.schema) {\n return [param.schema, null, null];\n }\n if (param.content) {\n // we gonna use the first content-encoding\n for (const contentType of Object.keys(param.content)) {\n if (param.content[contentType].schema) {\n return [param.content[contentType].schema, getSerializeStyleForContentType(contentType), param.content[contentType]];\n }\n }\n }\n return [null, null, null];\n}\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport FontStyles from '~/styles/font-styles';\nimport SchemaStyles from '~/styles/schema-styles';\nimport CustomStyles from '~/styles/custom-styles';\n\nexport default class SchemaTable extends LitElement {\n static get properties() {\n return {\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n data: { type: Object },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true false'.includes(this.schemaDescriptionExpanded)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.schemaHideReadOnly || !'true false'.includes(this.schemaHideReadOnly)) { this.schemaHideReadOnly = 'true'; }\n if (!this.schemaHideWriteOnly || !'true false'.includes(this.schemaHideWriteOnly)) { this.schemaHideWriteOnly = 'true'; }\n }\n\n static get styles() {\n return [\n FontStyles,\n SchemaStyles,\n css`\n .table {\n font-size: var(--font-size-small);\n text-align: left;\n line-height: calc(var(--font-size-small) + 6px);\n }\n .table .tr {\n width: calc(100% - 5px);\n padding: 0 0 0 5px;\n border-bottom: 1px dotted var(--light-border-color);\n }\n .table .td {\n padding: 4px 0;\n }\n .table .key {\n width: 240px;\n }\n .key .key-label {\n font-size: var(--font-size-mono);\n }\n .key.deprecated .key-label {\n color: var(--red);\n }\n\n .table .key-type {\n white-space: normal;\n width: 150px;\n }\n .collapsed-all-descr .tr:not(.expanded-descr) {\n max-height: calc(var(--font-size-small) + var(--font-size-small));\n }\n\n .obj-toggle {\n padding: 0 2px;\n border-radius:2px;\n border: 1px solid transparent;\n display: inline-block;\n margin-left: -16px;\n color:var(--primary-color);\n cursor:pointer;\n font-size: calc(var(--font-size-small) + 4px);\n font-family: var(--font-mono);\n background-clip: border-box;\n }\n .obj-toggle:hover {\n border-color: var(--primary-color);\n }\n .tr.expanded + .object-body {\n display:block;\n }\n .tr.collapsed + .object-body {\n display:none;\n }`,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
this.handleAllEvents(e)}\">\n
\n
${this.data?.['::type'] || ''}
\n ${this.allowSchemaDescriptionExpandToggle === 'true'\n ? html`\n
\n
\n ${this.schemaDescriptionExpanded === 'true' ? 'Single line description' : 'Multiline description'}\n
\n `\n : ''\n }\n
\n ${unsafeHTML(marked(this.data?.['::description'] || ''))} \n
\n
\n
Field
\n
Type
\n
Description
\n
\n ${this.data\n ? html`\n ${this.generateTree(\n this.data['::type'] === 'array' ? this.data['::props'] : this.data,\n this.data['::type'],\n this.data['::array-type'],\n )}`\n : ''\n } \n
\n
\n `;\n }\n\n generateTree(data, dataType = 'object', arrayType = '', key = '', description = '', schemaLevel = 0, indentLevel = 0, readOrWrite = '', isDeprecated = false) {\n if (this.schemaHideReadOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'readonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'readonly') {\n return;\n }\n }\n if (this.schemaHideWriteOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'writeonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'writeonly') {\n return;\n }\n }\n if (!data) {\n return html`
\n   \n ${key.replace('::OPTION~', '')}\n ${\n dataType === 'array'\n ? html` [ ] `\n : dataType === 'object'\n ? html` { } `\n : html` schema undefined `\n }\n
`;\n }\n\n const newSchemaLevel = data['::type']?.startsWith('xxx-of') ? schemaLevel : (schemaLevel + 1);\n const newIndentLevel = dataType === 'xxx-of-option' || data['::type'] === 'xxx-of-option' || key.startsWith('::OPTION') ? indentLevel : (indentLevel + 1);\n const leftPadding = 16 * newIndentLevel; // 2 space indentation at each level\n if (Object.keys(data).length === 0) {\n return html`${key}`;\n }\n let keyLabel = '';\n let keyDescr = '';\n let isOneOfLabel = false;\n if (key.startsWith('::ONE~OF') || key.startsWith('::ANY~OF')) {\n keyLabel = key.replace('::', '').replace('~', ' ');\n isOneOfLabel = true;\n } else if (key.startsWith('::OPTION')) {\n const parts = key.split('~');\n keyLabel = parts[1]; // eslint-disable-line prefer-destructuring\n keyDescr = parts[2]; // eslint-disable-line prefer-destructuring\n } else {\n keyLabel = key;\n }\n\n let detailObjType = '';\n if (data['::type'] === 'object') {\n if (dataType === 'array') {\n detailObjType = 'array of object'; // Array of Object\n } else {\n detailObjType = data['::dataTypeLabel'] || data['::type'];\n }\n } else if (data['::type'] === 'array') {\n if (dataType === 'array') {\n // detailObjType = 'array of array'; // Array of array\n detailObjType = `array of array ${arrayType !== 'object' ? `of ${arrayType}` : ''}`; // Array of array\n } else {\n detailObjType = data['::dataTypeLabel'] || data['::type'];\n }\n }\n\n if (typeof data === 'object') {\n return html`\n ${newSchemaLevel >= 0 && key\n ? html`\n
\n
\n ${(keyLabel || keyDescr)\n ? html`\n \n ${schemaLevel < this.schemaExpandLevel ? '-' : '+'}\n `\n : ''\n }\n ${data['::type'] === 'xxx-of-option' || data['::type'] === 'xxx-of-array' || key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : keyLabel.endsWith('*')\n ? html`${(isDeprecated || data['::deprecated']) ? '✗' : ''} ${keyLabel.substring(0, keyLabel.length - 1)}*`\n : html`${(isDeprecated || data['::deprecated']) ? '✗' : ''} ${keyLabel === '::props' ? '' : keyLabel}`\n }\n ${data['::type'] === 'xxx-of' && dataType === 'array' ? html`ARRAY` : ''} \n
\n
\n ${(data['::type'] || '').includes('xxx-of') ? '' : detailObjType}\n ${data['::readwrite'] === 'readonly' ? ' 🆁' : data['::readwrite'] === 'writeonly' ? ' 🆆' : ''}\n
\n
${unsafeHTML(marked(description || ''))}
\n
`\n : html`\n ${data['::type'] === 'array' && dataType === 'array'\n ? html`\n
\n
\n
\n ${arrayType && arrayType !== 'object' ? `${dataType} of ${arrayType}` : dataType}\n
\n
\n
`\n : ''\n }`\n }\n
\n ${Array.isArray(data) && data[0]\n ? html`${this.generateTree(data[0], 'xxx-of-option', '', '::ARRAY~OF', '', newSchemaLevel, newIndentLevel, '')}`\n : html`\n ${Object.keys(data).map((dataKey) => html`\n ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite', '::dataTypeLabel', '::nullable'].includes(dataKey)\n ? data[dataKey]['::type'] === 'array' || data[dataKey]['::type'] === 'object'\n ? html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]['::description'],\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n (isDeprecated || data[dataKey]['::deprecated']),\n )}`\n : ''\n : html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]?.['::description'] || '',\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n (isDeprecated || data[dataKey]['::deprecated']),\n )}`\n }\n `)}\n `\n }\n
\n `;\n }\n\n // For Primitive Data types\n // eslint-disable-next-line no-unused-vars\n const [type, readOrWriteOnly, constraint, defaultValue, allowedValues, pattern, schemaDescription, schemaTitle, deprecated] = data.split('~|~');\n if (readOrWriteOnly === '🆁' && this.schemaHideReadOnly === 'true') {\n return;\n }\n if (readOrWriteOnly === '🆆' && this.schemaHideWriteOnly === 'true') {\n return;\n }\n const dataTypeCss = type.replace(/┃.*/g, '').replace(/[^a-zA-Z0-9+]/g, '').substring(0, 4).toLowerCase();\n const descrExpander = `${constraint || defaultValue || allowedValues || pattern ? '' : ''}`;\n let dataTypeHtml = '';\n if (dataType === 'array') {\n dataTypeHtml = html` \n
\n [${type}] ${readOrWrite === 'readonly' ? '🆁' : readOrWrite === 'writeonly' ? '🆆' : ''}\n
`;\n } else {\n dataTypeHtml = html` \n
\n ${type} ${readOrWriteOnly}\n
`;\n }\n return html`\n
\n
\n ${isDeprecated || deprecated ? html`` : ''}\n ${keyLabel?.endsWith('*')\n ? html`\n ${keyLabel.substring(0, keyLabel.length - 1)}\n *`\n : key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : html`${keyLabel ? html` ${keyLabel}` : html`${schemaTitle}`}`\n }\n
\n ${dataTypeHtml}\n
\n ${html`\n ${unsafeHTML(marked(dataType === 'array'\n ? `${descrExpander} ${description}`\n : schemaTitle\n ? `${descrExpander} ${schemaTitle}: ${schemaDescription}`\n : `${descrExpander} ${schemaDescription}`))}\n `\n }\n ${constraint ? html`
Constraints: ${constraint}
` : ''}\n ${defaultValue ? html`
Default: ${defaultValue}
` : ''}\n ${allowedValues ? html`
${type === 'const' ? 'Value' : 'Allowed'}: ${allowedValues}
` : ''}\n ${pattern ? html`
Pattern: ${pattern}
` : ''}\n
\n
\n `;\n }\n /* eslint-enable indent */\n\n handleAllEvents(e) {\n if (e.target.classList.contains('obj-toggle')) {\n this.toggleObjectExpand(e);\n } else if (e.target.classList.contains('schema-multiline-toggle')) {\n this.schemaDescriptionExpanded = (this.schemaDescriptionExpanded === 'true' ? 'false' : 'true');\n } else if (e.target.classList.contains('descr-expand-toggle')) {\n const trEl = e.target.closest('.tr');\n if (trEl) {\n trEl.classList.toggle('expanded-descr');\n trEl.style.maxHeight = trEl.scrollHeight;\n }\n }\n }\n\n toggleObjectExpand(e) {\n const rowEl = e.target.closest('.tr');\n if (rowEl.classList.contains('expanded')) {\n rowEl.classList.add('collapsed');\n rowEl.classList.remove('expanded');\n e.target.innerText = '+';\n } else {\n rowEl.classList.remove('collapsed');\n rowEl.classList.add('expanded');\n e.target.innerText = '-';\n }\n }\n}\ncustomElements.define('schema-table', SchemaTable);\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { rapidocApiKey } from '~/utils/common-utils';\nimport { pathSecurityTemplate } from '~/templates/security-scheme-template';\nimport codeSamplesTemplate from '~/templates/code-samples-template';\nimport callbackTemplate from '~/templates/callback-template';\nimport '~/components/api-request';\nimport '~/components/api-response';\n\n/* eslint-disable indent */\nfunction headingRenderer(tagElementId) {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nfunction expandCollapseTagDescription(e) {\n const tagDescriptionEl = e.target.closest('.tag-container').querySelector('.tag-description');\n const tagIconEl = e.target.closest('.tag-container').querySelector('.tag-icon');\n if (tagDescriptionEl && tagIconEl) {\n const isExpanded = tagDescriptionEl.classList.contains('expanded');\n if (isExpanded) {\n tagDescriptionEl.style.maxHeight = 0;\n tagDescriptionEl.classList.replace('expanded', 'collapsed');\n tagIconEl.classList.replace('expanded', 'collapsed');\n } else {\n tagDescriptionEl.style.maxHeight = `${tagDescriptionEl.scrollHeight}px`;\n tagDescriptionEl.classList.replace('collapsed', 'expanded');\n tagIconEl.classList.replace('collapsed', 'expanded');\n }\n }\n}\n\nexport function expandedEndpointBodyTemplate(path, tagName = '', tagDescription = '') {\n const acceptContentTypes = new Set();\n for (const respStatus in path.responses) {\n for (const acceptContentType in (path.responses[respStatus]?.content)) {\n acceptContentTypes.add(acceptContentType.trim());\n }\n }\n const accept = [...acceptContentTypes].join(', ');\n\n // Filter API Keys that are non-empty and are applicable to the the path\n const nonEmptyApiKeys = this.resolvedSpec.securitySchemes.filter((v) => (v.finalKeyValue && path.security?.some((ps) => (v.securitySchemeId in ps)))) || [];\n\n // If a RapiDoc API Key is specified on the element and its value is not hyphen(-) then include it for all paths\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === rapidocApiKey && v.value !== '-'));\n if (rapiDocApiKey) {\n nonEmptyApiKeys.push(rapiDocApiKey);\n }\n\n const codeSampleTabPanel = path.xCodeSamples ? codeSamplesTemplate.call(this, path.xCodeSamples) : '';\n return html`\n ${this.renderStyle === 'read' ? html`
` : ''}\n
\n ${(this.renderStyle === 'focused' && tagName !== 'General ⦂')\n ? html`\n
\n ${tagName} \n ${tagDescription\n ? html`\n { expandCollapseTagDescription.call(this, e); }}\"\n >\n \n \n
\n
${unsafeHTML(marked(tagDescription))}
\n
`\n : ''\n } \n
\n `\n : ''\n }\n ${path.deprecated ? html`
DEPRECATED
` : ''}\n ${html`\n ${path.xBadges && path.xBadges?.length > 0\n ? html`\n
\n ${path.xBadges.map((v) => (\n v.color === 'none'\n ? ''\n : html`${v.label}`\n ))\n }\n
\n `\n : ''\n }\n

${path.shortSummary || `${path.method.toUpperCase()} ${path.path}`}

\n ${path.isWebhook\n ? html` WEBHOOK `\n : html`\n
\n ${path.method} \n ${path.path}\n
\n `\n }\n `\n }\n ${path.description ? html`
${unsafeHTML(marked(path.description))}
` : ''}\n ${pathSecurityTemplate.call(this, path.security)}\n ${path.externalDocs?.url || path.externalDocs?.description\n ? html`
\n
${unsafeHTML(marked(path.externalDocs?.description || ''))}
\n ${path.externalDocs?.url\n ? html`\n ${path.externalDocs?.url}
\n
`\n : ''\n }\n
`\n : ''\n }\n ${codeSampleTabPanel}\n
\n \n\n ${path.callbacks ? callbackTemplate.call(this, path.callbacks) : ''}\n\n \n
\n
\n `;\n}\n\nexport default function expandedEndpointTemplate() {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${this.resolvedSpec.tags.map((tag) => html`\n
\n
${tag.displayName || tag.name}
\n \n
\n ${\n unsafeHTML(`\n
\n ${marked(tag.description || '', this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer(tag.elementId) } : undefined)}\n
`)\n }\n
\n
\n
\n ${tag.paths.map((path) => expandedEndpointBodyTemplate.call(this, path))}\n
\n `)\n }\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { schemaInObjectNotation } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport '~/components/schema-table';\n\nfunction schemaBodyTemplate(sComponent) {\n return html`\n
\n
\n
${sComponent.name} Schema
\n ${this.schemaStyle === 'table'\n ? html`\n `\n : html`\n `\n}\n
`;\n}\n\nfunction componentBodyTemplate(sComponent, componentType) {\n if (sComponent.id.indexOf('schemas-') !== -1) {\n return schemaBodyTemplate.call(this, sComponent);\n }\n return html`\n
\n
\n ${html`\n
${sComponent.name} ${componentType}
\n ${sComponent.component\n ? html`\n
\n \n
`\n : ''}\n `}\n
\n `;\n}\n\nexport default function componentsTemplate() {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${this.resolvedSpec.components.map((component) => html`\n
\n
${component.name}
\n
\n ${unsafeHTML(`
${marked(component.description ? component.description : '')}
`)}\n
\n
\n
\n ${component.subComponents.filter((c) => c.expanded !== false).map((sComponent) => componentBodyTemplate.call(this, sComponent, component.name))}\n
\n `)\n}\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { downloadResource, viewResource } from '~/utils/common-utils';\n\n/* eslint-disable indent */\nfunction headingRenderer() {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nexport default function overviewTemplate() {\n return html`\n
\n ${this.resolvedSpec?.info\n ? html`\n
\n ${this.resolvedSpec.info.title}\n ${!this.resolvedSpec.info.version ? '' : html`\n \n ${this.resolvedSpec.info.version}\n `\n }\n
\n
\n ${this.resolvedSpec.info.contact?.email\n ? html`${this.resolvedSpec.info.contact.name || 'Email'}: \n ${this.resolvedSpec.info.contact.email}\n `\n : ''\n }\n ${this.resolvedSpec.info.contact?.url\n ? html`URL: ${this.resolvedSpec.info.contact.url}`\n : ''\n }\n ${this.resolvedSpec.info.license\n ? html`License: \n ${this.resolvedSpec.info.license.url\n ? html`${this.resolvedSpec.info.license.name}`\n : this.resolvedSpec.info.license.name\n } `\n : ''\n }\n ${this.resolvedSpec.info.termsOfService\n ? html`Terms of Service`\n : ''\n }\n ${this.specUrl && this.allowSpecFileDownload === 'true'\n ? html`\n
\n \n ${this.specUrl?.trim().toLowerCase().endsWith('json')\n ? html``\n : ''\n }\n
`\n : ''\n }\n
\n \n
\n ${this.resolvedSpec.info.description\n ? html`${\n unsafeHTML(`\n
\n ${marked(this.resolvedSpec.info.description, this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer() } : undefined)}\n
`)}`\n : ''\n }\n
\n `\n : ''\n }\n
\n `;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\nexport function setApiServer(serverUrl) {\n const serverObj = this.resolvedSpec?.servers.find((s) => s.url === serverUrl);\n if (!serverObj) {\n return false;\n }\n this.selectedServer = serverObj;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('api-server-change', {\n bubbles: true,\n composed: true,\n detail: {\n selectedServer: serverObj,\n },\n }));\n return true;\n}\n\nfunction onApiServerVarChange(e, serverObj) {\n const inputEls = [...e.currentTarget.closest('table').querySelectorAll('input, select')];\n let tempUrl = serverObj.url;\n inputEls.forEach((v) => {\n const regex = new RegExp(`{${v.dataset.var}}`, 'g');\n tempUrl = tempUrl.replace(regex, v.value);\n });\n serverObj.computedUrl = tempUrl;\n this.requestUpdate();\n}\n\n/* eslint-disable indent */\nfunction serverVarsTemplate() {\n // const selectedServerObj = this.resolvedSpec.servers.find((v) => (v.url === this.selectedServer));\n return this.selectedServer && this.selectedServer.variables\n ? html`\n
SERVER VARIABLES
\n \n ${Object.entries(this.selectedServer.variables).map((kv) => html`\n \n \n \n \n ${kv[1].description\n ? html``\n : ''\n }\n `)}\n \n `\n : '';\n}\n\nexport default function serverTemplate() {\n if (!this.resolvedSpec || this.resolvedSpec.specLoadError) { return ''; }\n return html`\n
\n
API SERVER
\n
\n ${!this.resolvedSpec.servers || this.resolvedSpec.servers?.length === 0\n ? ''\n : html`\n ${this.resolvedSpec?.servers.map((server, i) => html`\n { setApiServer.call(this, server.url); }}\n .checked = '${this.selectedServer.url === server.url}'\n style = 'margin:4px 0; cursor:pointer'\n />\n \n
\n `)}\n `}\n
SELECTED: ${this.selectedServer?.computedUrl || 'none'}
\n
\n \n ${serverVarsTemplate.call(this)}\n
`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { marked } from 'marked';\nimport { getMatchedPaths } from '~/utils/common-utils';\n\nexport function expandCollapseNavBarTag(navLinkEl, action = 'toggle') {\n const tagAndPathEl = navLinkEl?.closest('.nav-bar-tag-and-paths');\n const pathsUnderTagEl = tagAndPathEl?.querySelector('.nav-bar-paths-under-tag');\n if (tagAndPathEl) {\n const isExpanded = tagAndPathEl.classList.contains('expanded');\n if (isExpanded && (action === 'toggle' || action === 'collapse')) {\n pathsUnderTagEl.style.maxHeight = 0;\n tagAndPathEl.classList.replace('expanded', 'collapsed');\n } else if (!isExpanded && (action === 'toggle' || action === 'expand')) {\n tagAndPathEl.classList.replace('collapsed', 'expanded');\n pathsUnderTagEl.style.maxHeight = `${pathsUnderTagEl.scrollHeight}px`;\n }\n }\n}\n\nexport function expandCollapseAll(event, action = 'expand-all') {\n if (!(event.type === 'click' || (event.type === 'keyup' && event.keyCode === 13))) {\n return;\n }\n const navEl = event.target.closest('.nav-scroll');\n const elList = [...navEl.querySelectorAll('.nav-bar-tag-and-paths')];\n if (action === 'expand-all') {\n elList.forEach((el) => {\n const navBarPathsUnderTagEl = el.querySelector('.nav-bar-paths-under-tag');\n el.classList.replace('collapsed', 'expanded');\n navBarPathsUnderTagEl.style.maxHeight = `${navBarPathsUnderTagEl?.scrollHeight}px`;\n });\n } else {\n elList.forEach((el) => {\n el.classList.replace('expanded', 'collapsed');\n el.querySelector('.nav-bar-paths-under-tag').style.maxHeight = 0;\n });\n }\n}\n\nexport function navBarClickAndEnterHandler(event) {\n if (!(event.type === 'click' || (event.type === 'keyup' && event.keyCode === 13))) {\n return;\n }\n const navEl = event.target;\n event.stopPropagation();\n if (navEl.dataset?.action === 'navigate') {\n this.scrollToEventTarget(event, false);\n } else if (navEl.dataset?.action === 'expand-all' || (navEl.dataset?.action === 'collapse-all')) {\n expandCollapseAll(event, navEl.dataset.action);\n } else if (navEl.dataset?.action === 'expand-collapse-tag') {\n expandCollapseNavBarTag(navEl, 'toggle');\n }\n}\n\n/* eslint-disable indent */\nexport default function navbarTemplate() {\n if (!this.resolvedSpec || this.resolvedSpec.specLoadError) {\n return html`\n \n `;\n }\n return html`\n \n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { expandedEndpointBodyTemplate } from '~/templates/expanded-endpoint-template';\nimport '~/components/api-request';\nimport '~/components/api-response';\nimport componentsTemplate from '~/templates/components-template';\nimport overviewTemplate from '~/templates/overview-template';\nimport serverTemplate from '~/templates/server-template';\nimport securitySchemeTemplate from '~/templates/security-scheme-template';\nimport { expandCollapseNavBarTag } from '~/templates/navbar-template';\n\nfunction headingRenderer(tagElementId) {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nfunction wrapFocusedTemplate(templateToWrap) {\n return html`\n
\n ${templateToWrap}\n
`;\n}\n\nfunction defaultContentTemplate() {\n // In focused mode default content is overview or first path\n if (this.showInfo === 'true') {\n return wrapFocusedTemplate(overviewTemplate.call(this));\n }\n const selectedTagObj = this.resolvedSpec.tags[0];\n const selectedPathObj = this.resolvedSpec.tags[0]?.paths[0];\n return (selectedTagObj && selectedPathObj)\n ? wrapFocusedTemplate(expandedEndpointBodyTemplate.call(this, selectedPathObj, selectedTagObj.name))\n : wrapFocusedTemplate('');\n}\n\n/* eslint-disable indent */\nfunction focusedTagBodyTemplate(tag) {\n return html`\n

${tag.displayName || tag.name}

\n ${this.onNavTagClick === 'show-description' && tag.description\n ? html`\n
\n ${\n unsafeHTML(`\n
\n ${marked(tag.description || '', this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer(tag.elementId) } : undefined)}\n
`)\n }\n
`\n : ''\n }\n `;\n}\n\nexport default function focusedEndpointTemplate() {\n if (!this.focusedElementId || !this.resolvedSpec) {\n return;\n }\n const focusElId = this.focusedElementId;\n let selectedPathObj = null;\n let selectedTagObj = null;\n let focusedTemplate;\n let i = 0;\n if (focusElId.startsWith('overview') && this.showInfo === 'true') {\n focusedTemplate = overviewTemplate.call(this);\n } else if (focusElId === 'auth' && this.allowAuthentication === 'true') {\n focusedTemplate = securitySchemeTemplate.call(this);\n } else if (focusElId === 'servers' && this.allowServerSelection === 'true') {\n focusedTemplate = serverTemplate.call(this);\n } else if (focusElId === 'operations-top') {\n focusedTemplate = html`\n
\n \n
`;\n } else if (focusElId.startsWith('cmp--') && this.showComponents === 'true') {\n focusedTemplate = componentsTemplate.call(this);\n } else if (focusElId.startsWith('tag--')) {\n const idToFocus = focusElId.indexOf('--', 4) > 0 ? focusElId.substring(0, focusElId.indexOf('--', 5)) : focusElId;\n selectedTagObj = this.resolvedSpec.tags.find((v) => v.elementId === idToFocus);\n if (selectedTagObj) {\n focusedTemplate = wrapFocusedTemplate.call(this, focusedTagBodyTemplate.call(this, selectedTagObj));\n } else {\n focusedTemplate = defaultContentTemplate.call(this);\n }\n } else {\n for (i = 0; i < this.resolvedSpec.tags.length; i += 1) {\n selectedTagObj = this.resolvedSpec.tags[i];\n selectedPathObj = this.resolvedSpec.tags[i].paths.find((v) => `${v.elementId}` === focusElId);\n if (selectedPathObj) {\n break;\n }\n }\n if (selectedPathObj) {\n // In focused mode we must expand the nav-bar tag element if it is collapsed\n const newNavEl = this.shadowRoot.getElementById(`link-${focusElId}`);\n expandCollapseNavBarTag(newNavEl, 'expand');\n focusedTemplate = wrapFocusedTemplate.call(\n this,\n expandedEndpointBodyTemplate.call(this, selectedPathObj, (selectedTagObj.name || ''), (selectedTagObj.description || '')),\n );\n } else {\n // if focusedElementId is not found then show the default content (overview or first-path)\n focusedTemplate = defaultContentTemplate.call(this);\n }\n }\n return focusedTemplate;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport '~/components/api-request';\nimport '~/components/api-response';\nimport codeSamplesTemplate from '~/templates/code-samples-template';\nimport callbackTemplate from '~/templates/callback-template';\nimport { pathSecurityTemplate } from '~/templates/security-scheme-template';\nimport { getMatchedPaths, rapidocApiKey } from '~/utils/common-utils';\n\nfunction toggleExpand(path) {\n if (path.expanded) {\n path.expanded = false; // collapse\n if (this.updateRoute === 'true') {\n this.replaceHistoryState('');\n }\n } else {\n path.expanded = true; // Expand\n if (this.updateRoute === 'true') {\n const newHash = `${this.routePrefix || '#'}${path.elementId}`;\n if (window.location.hash !== newHash) {\n this.replaceHistoryState(path.elementId);\n }\n }\n }\n this.requestUpdate();\n}\n\nexport function expandCollapseAll(operationsRootEl, action = 'expand-all') {\n const elList = [...operationsRootEl.querySelectorAll('.section-tag')];\n if (action === 'expand-all') {\n elList.map((el) => {\n el.classList.replace('collapsed', 'expanded');\n });\n } else {\n elList.map((el) => {\n el.classList.replace('expanded', 'collapsed');\n });\n }\n}\n\nfunction onExpandCollapseAll(e, action = 'expand-all') {\n expandCollapseAll.call(this, e.target.closest('.operations-root'), action);\n}\n\n/* eslint-disable indent */\nfunction endpointHeadTemplate(path, pathsExpanded = false) {\n return html`\n { toggleExpand.call(this, path, e); }}\" part=\"section-endpoint-head-${path.expanded ? 'expanded' : 'collapsed'}\" class='endpoint-head ${path.method} ${path.deprecated ? 'deprecated' : ''} ${pathsExpanded || path.expanded ? 'expanded' : 'collapsed'}'>\n
${path.method}
\n
\n ${path.path} \n ${path.isWebhook ? html` Webhook` : ''}\n
\n ${path.deprecated\n ? html`\n \n deprecated \n `\n : ''\n }\n ${this.showSummaryWhenCollapsed\n ? html`\n
\n
${path.summary || path.shortSummary}
`\n : ''\n }\n
\n `;\n}\n\nfunction endpointBodyTemplate(path) {\n const acceptContentTypes = new Set();\n for (const respStatus in path.responses) {\n for (const acceptContentType in (path.responses[respStatus]?.content)) {\n acceptContentTypes.add(acceptContentType.trim());\n }\n }\n const accept = [...acceptContentTypes].join(', ');\n // Filter API Keys that are non-empty and are applicable to the the path\n const nonEmptyApiKeys = this.resolvedSpec.securitySchemes.filter((v) => (v.finalKeyValue && path.security?.some((ps) => (v.securitySchemeId in ps)))) || [];\n\n // If a RapiDoc API Key is specified on the element and its value is not hyphen(-) then include it for all paths\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === rapidocApiKey && v.value !== '-'));\n if (rapiDocApiKey) {\n nonEmptyApiKeys.push(rapiDocApiKey);\n }\n\n const codeSampleTabPanel = path.xCodeSamples ? codeSamplesTemplate(path.xCodeSamples) : '';\n return html`\n
\n
\n ${path.summary\n ? html`
${path.summary}
`\n : path.shortSummary !== path.description\n ? html`
${path.shortSummary}
`\n : ''\n }\n ${path.xBadges && path.xBadges?.length > 0\n ? html`\n
\n ${path.xBadges.map((v) => (\n v.color === 'none'\n ? ''\n : html`${v.label}`\n ))\n }\n
\n `\n : ''\n }\n\n ${path.description ? html`
${unsafeHTML(marked(path.description))}
` : ''}\n ${path.externalDocs?.url || path.externalDocs?.description\n ? html`
\n
${unsafeHTML(marked(path.externalDocs?.description || ''))}
\n ${path.externalDocs?.url\n ? html` \n ${path.externalDocs?.url}
\n
`\n : ''\n }\n
`\n : ''\n }\n \n ${pathSecurityTemplate.call(this, path.security)}\n ${codeSampleTabPanel}\n
\n
\n
\n 0 ? path.servers[0].url : this.selectedServer?.computedUrl}\" \n active-schema-tab = \"${this.defaultSchemaTab}\"\n fill-request-fields-with-example = \"${this.fillRequestFieldsWithExample}\"\n allow-try = \"${this.allowTry}\"\n show-curl-before-try = \"${this.showCurlBeforeTry}\"\n accept = \"${accept}\"\n render-style=\"${this.renderStyle}\" \n schema-style = \"${this.schemaStyle}\" \n schema-expand-level = \"${this.schemaExpandLevel}\"\n schema-description-expanded = \"${this.schemaDescriptionExpanded}\"\n allow-schema-description-expand-toggle = \"${this.allowSchemaDescriptionExpandToggle}\"\n schema-hide-read-only = \"${this.schemaHideReadOnly === 'never' ? 'false' : path.isWebhook ? 'false' : 'true'}\"\n schema-hide-write-only = \"${this.schemaHideWriteOnly === 'never' ? 'false' : path.isWebhook ? 'true' : 'false'}\"\n fetch-credentials = \"${this.fetchCredentials}\"\n exportparts = \"wrap-request-btn:wrap-request-btn, btn:btn, btn-fill:btn-fill, btn-outline:btn-outline, btn-try:btn-try, btn-clear:btn-clear, btn-clear-resp:btn-clear-resp,\n file-input:file-input, textbox:textbox, textbox-param:textbox-param, textarea:textarea, textarea-param:textarea-param, \n anchor:anchor, anchor-param-example:anchor-param-example, schema-description:schema-description, schema-multiline-toggle:schema-multiline-toggle\"\n > \n\n ${path.callbacks ? callbackTemplate.call(this, path.callbacks) : ''}\n
\n\n \n
\n
`;\n}\n\nexport default function endpointTemplate(isMini = false, pathsExpanded = false) {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${isMini\n ? ''\n : html`\n
\n onExpandCollapseAll(e, 'expand-all')}\" style=\"color:var(--primary-color); cursor:pointer;\">\n Expand all\n \n  |  \n onExpandCollapseAll(e, 'collapse-all')}\" style=\"color:var(--primary-color); cursor:pointer;\" >\n Collapse all\n \n   sections\n
`\n }\n ${this.resolvedSpec.tags.map((tag) => html`\n ${isMini\n ? html`\n \n `\n : html` \n \n `\n }\n `)\n }`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\n\n/* eslint-disable indent */\nexport default function logoTemplate(style) {\nreturn html`\n
\n \n \n \n \n \n \n \n \n
\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport logoTemplate from '~/templates/logo-template';\n\n/* eslint-disable indent */\nexport default function headerTemplate() {\n return html`\n
\n
\n \n ${logoTemplate('height:36px;width:36px;margin-left:5px')}\n \n \n
${this.headingText}
\n
\n
\n ${(this.allowSpecUrlLoad === 'false')\n ? ''\n : html`\n \n
\n `\n } \n ${(this.allowSpecFileLoad === 'false')\n ? ''\n : html`\n \n \n `\n }\n \n ${(this.allowSearch === 'false' || 'read focused'.includes(this.renderStyle))\n ? ''\n : html` \n \n
\n `\n }\n \n ${(this.allowAdvancedSearch === 'false' || 'read focused'.includes(this.renderStyle))\n ? ''\n : html`\n \n `\n }\n
\n
`;\n }\n/* eslint-enable indent */\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { schemaInObjectNotation, generateExample, standardizeExample } from '~/utils/schema-utils';\nimport FontStyles from '~/styles/font-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport InputStyles from '~/styles/input-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport CustomStyles from '~/styles/custom-styles';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport '~/components/schema-table';\n\nexport default class ApiResponse extends LitElement {\n constructor() {\n super();\n this.selectedStatus = '';\n this.headersForEachRespStatus = {};\n this.mimeResponsesForEachStatus = {};\n this.activeSchemaTab = 'schema';\n }\n\n static get properties() {\n return {\n callback: { type: String },\n webhook: { type: String },\n responses: { type: Object },\n parser: { type: Object },\n schemaStyle: { type: String, attribute: 'schema-style' },\n renderStyle: { type: String, attribute: 'render-style' },\n selectedStatus: { type: String, attribute: 'selected-status' },\n selectedMimeType: { type: String, attribute: 'selected-mime-type' },\n activeSchemaTab: { type: String, attribute: 'active-schema-tab' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n FlexStyles,\n TabStyles,\n TableStyles,\n InputStyles,\n BorderStyles,\n css`\n :where(button, input[type=\"checkbox\"], [tabindex=\"0\"]):focus-visible { box-shadow: var(--focus-shadow); }\n :where(input[type=\"text\"], input[type=\"password\"], select, textarea):focus-visible { border-color: var(--primary-color); }\n .resp-head{\n vertical-align: middle;\n padding:16px 0 8px;\n }\n .resp-head.divider{\n border-top: 1px solid var(--border-color);\n margin-top:10px;\n }\n .resp-status{ \n font-weight:bold;\n font-size:calc(var(--font-size-small) + 1px);\n }\n .resp-descr{\n font-size:calc(var(--font-size-small) + 1px);\n color:var(--light-fg);\n text-align:left;\n }\n .top-gap{margin-top:16px;}\n .example-panel{\n font-size:var(--font-size-small);\n margin:0;\n }\n .focused-mode,\n .read-mode {\n padding-top:24px;\n margin-top:12px;\n border-top: 1px dashed var(--border-color);\n }`,\n CustomStyles,\n ];\n }\n\n render() {\n return html`\n
\n
\n ${this.callback === 'true' ? 'CALLBACK RESPONSE' : 'RESPONSE'}\n
\n
\n ${this.responseTemplate()}\n
\n
\n `;\n }\n\n resetSelection() {\n this.selectedStatus = '';\n this.selectedMimeType = '';\n }\n\n /* eslint-disable indent */\n responseTemplate() {\n if (!this.responses) { return ''; }\n for (const statusCode in this.responses) {\n if (!this.selectedStatus) {\n this.selectedStatus = statusCode;\n }\n const allMimeResp = {};\n for (const mimeResp in this.responses[statusCode]?.content) {\n const mimeRespObj = this.responses[statusCode].content[mimeResp];\n if (!this.selectedMimeType) {\n this.selectedMimeType = mimeResp;\n }\n // Generate Schema\n const schemaTree = schemaInObjectNotation(mimeRespObj.schema, {});\n // Generate Example\n const respExamples = generateExample(\n mimeRespObj.schema,\n mimeResp,\n standardizeExample(mimeRespObj.examples),\n standardizeExample(mimeRespObj.example),\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n mimeResp.includes('json') ? 'json' : 'text',\n );\n allMimeResp[mimeResp] = {\n description: this.responses[statusCode].description,\n examples: respExamples,\n selectedExample: respExamples[0]?.exampleId || '',\n schemaTree,\n };\n }\n // Headers for each response status\n const tempHeaders = [];\n for (const key in this.responses[statusCode]?.headers) {\n tempHeaders.push({ name: key, ...this.responses[statusCode].headers[key] });\n }\n this.headersForEachRespStatus[statusCode] = tempHeaders;\n this.mimeResponsesForEachStatus[statusCode] = allMimeResp;\n }\n return html`\n ${Object.keys(this.responses).length > 1\n ? html`
\n ${Object.keys(this.responses).map((respStatus) => html`\n ${respStatus === '$$ref' // Swagger-Client parser creates '$$ref' object if JSON references are used to create responses - this should be ignored\n ? ''\n : html`\n `\n }`)\n }
`\n : html`${Object.keys(this.responses)[0]}`\n }\n\n ${Object.keys(this.responses).map((status) => html`\n
\n
\n ${unsafeHTML(marked(this.responses[status]?.description || ''))}\n ${(this.headersForEachRespStatus[status] && this.headersForEachRespStatus[status]?.length > 0)\n ? html`${this.responseHeaderListTemplate(this.headersForEachRespStatus[status])}`\n : ''\n }\n
\n ${Object.keys(this.mimeResponsesForEachStatus[status]).length === 0\n ? ''\n : html` \n
\n
{ if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; } }}\" >\n \n \n
\n ${Object.keys(this.mimeResponsesForEachStatus[status]).length === 1\n ? html` ${Object.keys(this.mimeResponsesForEachStatus[status])[0]} `\n : html`${this.mimeTypeDropdownTemplate(Object.keys(this.mimeResponsesForEachStatus[status]))}`\n }\n
\n ${this.activeSchemaTab === 'example'\n ? html`
\n ${this.mimeExampleTemplate(this.mimeResponsesForEachStatus[status][this.selectedMimeType])}\n
`\n : html`
\n ${this.mimeSchemaTemplate(this.mimeResponsesForEachStatus[status][this.selectedMimeType])}\n
`\n }\n
\n `\n }
`)\n }\n `;\n }\n\n responseHeaderListTemplate(respHeaders) {\n return html`\n
RESPONSE HEADERS
\n \n ${respHeaders.map((v) => html`\n \n \n \n \n \n \n `)}\n
\n ${v.name || ''}\n \n ${v.schema?.type || ''}\n \n
${unsafeHTML(marked(v.description || ''))}
\n
\n ${v.schema?.example || ''}\n
`;\n }\n\n mimeTypeDropdownTemplate(mimeTypes) {\n return html`\n `;\n }\n\n onSelectExample(e) {\n const exampleContainerEl = e.target.closest('.example-panel');\n const exampleEls = [...exampleContainerEl.querySelectorAll('.example')];\n\n exampleEls.forEach((v) => {\n v.style.display = v.dataset.example === e.target.value ? 'block' : 'none';\n });\n }\n\n mimeExampleTemplate(mimeRespDetails) {\n if (!mimeRespDetails) {\n return html`\n
 No example provided 
\n `;\n }\n return html`\n ${mimeRespDetails.examples.length === 1\n ? html`\n ${mimeRespDetails.examples[0].exampleFormat === 'json'\n ? html`\n ${mimeRespDetails.examples[0].exampleSummary && mimeRespDetails.examples[0].exampleSummary.length > 80 ? html`
${mimeRespDetails.examples[0].exampleSummary}
` : ''}\n ${mimeRespDetails.examples[0].exampleDescription ? html`
${unsafeHTML(marked(mimeRespDetails.examples[0].exampleDescription || ''))}
` : ''}\n `\n : html`\n ${mimeRespDetails.examples[0].exampleSummary && mimeRespDetails.examples[0].exampleSummary.length > 80 ? html`
${mimeRespDetails.examples[0].exampleSummary}
` : ''}\n ${mimeRespDetails.examples[0].exampleDescription ? html`
${unsafeHTML(marked(mimeRespDetails.examples[0].exampleDescription || ''))}
` : ''}\n
${mimeRespDetails.examples[0].exampleValue}
\n `\n }`\n : html`\n \n \n ${mimeRespDetails.examples.map((v) => html`\n
\n ${v.exampleSummary && v.exampleSummary.length > 80 ? html`
${v.exampleSummary}
` : ''}\n ${v.exampleDescription ? html`
${unsafeHTML(marked(v.exampleDescription || ''))}
` : ''}\n ${v.exampleFormat === 'json'\n ? html`\n `\n : html`
${v.exampleValue}
`\n }\n
\n `)}\n
\n `\n }\n `;\n }\n\n mimeSchemaTemplate(mimeRespDetails) {\n if (!mimeRespDetails) {\n return html`\n
 Schema not found
\n `;\n }\n return html`\n ${this.schemaStyle === 'table'\n ? html`\n `\n : html`\n `\n }`;\n }\n /* eslint-enable indent */\n}\n\n// Register the element with the browser\ncustomElements.define('api-response', ApiResponse);\n","import { html } from 'lit';\nimport '~/components/dialog-box';\n\n/* eslint-disable indent */\nexport default function searchByPropertiesModalTemplate() {\n document.addEventListener('close', () => { this.showAdvancedSearchDialog = false; });\n document.addEventListener('open', this.onOpenSearchDialog);\n\n return html`\n \n \n this.onAdvancedSearch(e, 400)}\"\n >\n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n
\n \n ${this.advancedSearchMatches?.map((path) => html`\n {\n this.searchVal = ''; // clear quick filter if applied\n this.showAdvancedSearchDialog = false; // Hide Search Dialog\n this.requestUpdate();\n this.scrollToEventTarget(e, true);\n }\n }\"\n > \n ${path.method} \n ${path.path}\n ${path.summary}\n \n `)\n }\n
\n `;\n}\n/* eslint-enable indent */\n","import { LitElement, html } from 'lit';\nimport DialogBoxStyles from '~/styles/dialog-box-styles';\n\nexport default class DialogBox extends LitElement {\n static get properties() {\n return {\n heading: { type: String, attribute: 'heading' },\n show: { type: String, attribute: 'show' },\n };\n }\n\n static get styles() {\n return [DialogBoxStyles];\n }\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', (e) => {\n if (e.code === 'Escape') {\n this.onClose();\n }\n });\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal !== newVal) {\n if (name === 'heading') {\n this.heading = newVal;\n }\n if (name === 'show') {\n this.show = newVal;\n if (newVal === 'true') {\n document.dispatchEvent(new CustomEvent('open', {\n bubbles: true,\n composed: true,\n detail: this,\n }));\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n ${this.show === 'true'\n ? html`\n
\n
\n
\n ${this.heading}\n \n
\n
\n \n
\n
\n
`\n : ''\n }`;\n }\n /* eslint-enable indent */\n\n onClose() {\n document.dispatchEvent(new CustomEvent('close', {\n bubbles: true,\n composed: true,\n }));\n }\n}\n\ncustomElements.define('dialog-box', DialogBox);\n","import { html } from 'lit';\nimport ColorUtils from '~/utils/color-utils';\n/* Generates an schema object containing type and constraint info */\nexport default function setTheme(baseTheme, theme = {}) {\n let newTheme = {};\n\n // Common Theme colors\n const primaryColor = theme.primaryColor ? theme.primaryColor : baseTheme === 'dark' ? '#f76b39' : '#ff591e';\n const primaryColorInvert = ColorUtils.color.invert(primaryColor);\n const primaryColorTrans = ColorUtils.color.opacity(primaryColor, '0.4');\n\n // Dark and Light Theme colors\n if (baseTheme === 'dark') {\n const bg1 = theme.bg1 ? theme.bg1 : '#2a2b2c';\n const fg1 = theme.fg1 ? theme.fg1 : '#bbb';\n\n const bg2 = theme.bg2 ? theme.bg2 : ColorUtils.color.brightness(bg1, 5); // or #383838;\n const bg3 = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, 17); // or #444;\n const lightBg = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, 35);\n const fg2 = theme.fg2 ? theme.fg2 : ColorUtils.color.brightness(fg1, -15); // or #ababab\n const fg3 = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, -20); // or #aaa\n const lightFg = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, -65); // or #777\n const inlineCodeFg = theme.inlineCodeFg ? theme.inlineCodeFg : '#aaa';\n const selectionBg = fg2;\n const selectionFg = bg2;\n\n const headerColor = theme.headerColor ? theme.headerColor : ColorUtils.color.brightness(bg1, 10);\n\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, 10);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.opacity(ColorUtils.color.invert(navBgColor), '0.50');\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : ColorUtils.color.brightness(navBgColor, -15);\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : ColorUtils.color.invert(navBgColor);\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : ColorUtils.color.brightness(primaryColor, 25);\n const navAccentTextColor = theme.navAccentTextColor ? theme.navAccenttextColor : ColorUtils.color.invert(navAccentColor);\n\n const overlayBg = 'rgba(80, 80, 80, 0.4)';\n\n newTheme = {\n bg1,\n bg2,\n bg3,\n lightBg,\n fg1,\n fg2,\n fg3,\n lightFg,\n inlineCodeFg,\n primaryColor,\n primaryColorTrans,\n primaryColorInvert,\n selectionBg,\n selectionFg,\n overlayBg,\n navBgColor,\n navTextColor,\n navHoverBgColor,\n navHoverTextColor,\n navAccentColor,\n navAccentTextColor,\n headerColor,\n headerColorInvert: ColorUtils.color.invert(headerColor),\n headerColorDarker: ColorUtils.color.brightness(headerColor, -20),\n headerColorBorder: ColorUtils.color.brightness(headerColor, 10),\n\n borderColor: theme.borderColor || ColorUtils.color.brightness(bg1, 20), // #555\n lightBorderColor: theme.lightBorderColor || ColorUtils.color.brightness(bg1, 15), // #444\n codeBorderColor: theme.codeBorderColor || ColorUtils.color.brightness(bg1, 30),\n\n inputBg: theme.inputBg || ColorUtils.color.brightness(bg1, -5), // #2f2f2f\n placeHolder: theme.placeHolder || ColorUtils.color.opacity(fg1, '0.3'),\n hoverColor: theme.hoverColor || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n red: theme.red ? theme.red : '#F06560',\n lightRed: theme.lightRed ? theme.lightRed : ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n pink: theme.pink ? theme.pink : '#ffb2b2',\n lightPink: theme.lightPink || ColorUtils.color.brightness(bg1, -10),\n\n green: theme.green || '#7ec699',\n lightGreen: theme.lightGreen || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n blue: theme.blue || '#71b7ff',\n lightBlue: theme.lightBlue || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n orange: theme.orange ? theme.orange : '#f08d49',\n lightOrange: theme.lightOrange || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n yellow: theme.yellow || '#827717',\n lightYellow: theme.lightYellow || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n purple: theme.purple || '#786FF1',\n brown: theme.brown || '#D4AC0D',\n\n codeBg: theme.codeBg || ColorUtils.color.opacity(ColorUtils.color.brightness(bg1, -15), 0.7),\n codeFg: theme.codeFg || '#aaa',\n codePropertyColor: theme.codePropertyColor || '#f8c555',\n codeKeywordColor: theme.codeKeywordColor || '#cc99cd',\n codeOperatorColor: theme.codeOperatorColor || '#67cdcc',\n };\n } else {\n const bg1 = (theme.bg1 ? theme.bg1 : '#fafbfc');\n const fg1 = (theme.fg1 ? theme.fg1 : '#444444');\n const bg2 = theme.bg2 ? theme.bg2 : ColorUtils.color.brightness(bg1, -5); // or '#fafafa'\n const bg3 = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, -15); // or '#f6f6f6'\n const lightBg = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, -45);\n const fg2 = theme.fg2 ? theme.fg2 : ColorUtils.color.brightness(fg1, 17); // or '#555'\n const fg3 = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, 30); // or #666\n const lightFg = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, 70); // or #999\n const inlineCodeFg = theme.inlineCodeFg ? theme.inlineCodeFg : 'brown';\n const selectionBg = fg2;\n const selectionFg = bg2;\n const headerColor = theme.headerColor ? theme.headerColor : ColorUtils.color.brightness(bg1, -180);\n\n /*\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, -10);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.brightness(fg1, 5);\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : bg1;\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : primaryColor;\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : primaryColor;\n */\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, -200);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.opacity(ColorUtils.color.invert(navBgColor), '0.65');\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : ColorUtils.color.brightness(navBgColor, -15);\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : ColorUtils.color.invert(navBgColor);\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : ColorUtils.color.brightness(primaryColor, 25);\n const navAccentTextColor = theme.navAccentTextColor ? theme.navAccenttextColor : ColorUtils.color.invert(navAccentColor);\n const overlayBg = 'rgba(0, 0, 0, 0.4)';\n\n newTheme = {\n bg1,\n bg2,\n bg3,\n lightBg,\n fg1,\n fg2,\n fg3,\n lightFg,\n inlineCodeFg,\n primaryColor,\n primaryColorTrans,\n primaryColorInvert,\n selectionBg,\n selectionFg,\n overlayBg,\n navBgColor,\n navTextColor,\n navHoverBgColor,\n navHoverTextColor,\n navAccentColor,\n navAccentTextColor,\n headerColor,\n headerColorInvert: ColorUtils.color.invert(headerColor),\n headerColorDarker: ColorUtils.color.brightness(headerColor, -20),\n headerColorBorder: ColorUtils.color.brightness(headerColor, 10),\n\n borderColor: theme.borderColor || ColorUtils.color.brightness(bg1, -38),\n lightBorderColor: theme.lightBorderColor || ColorUtils.color.brightness(bg1, -23),\n codeBorderColor: theme.codeBorderColor || 'transparent',\n\n inputBg: theme.inputBg || ColorUtils.color.brightness(bg1, 10), // #fff\n placeHolder: theme.placeHolder || ColorUtils.color.brightness(lightFg, 20), // #dedede\n hoverColor: theme.hoverColor || ColorUtils.color.brightness(bg1, -5), // # f1f1f1\n\n red: theme.red || '#F06560',\n lightRed: theme.lightRed || '#fff0f0',\n\n pink: theme.pink ? theme.pink : '#990055',\n lightPink: theme.lightPink ? theme.lightPink : '#ffb2b2',\n\n green: theme.green || '#690',\n lightGreen: theme.lightGreen || '#fbfff0',\n\n blue: theme.blue || '#47AFE8',\n lightBlue: theme.lightBlue || '#eff8fd',\n\n orange: theme.orange || '#FF9900',\n lightOrange: theme.lightOrange || '#fff5e6',\n\n yellow: theme.yellow || '#827717',\n lightYellow: theme.lightYellow || '#fff5cc',\n\n purple: theme.purple || '#786FF1',\n brown: theme.brown || '#D4AC0D',\n\n codeBg: theme.codeBg || ColorUtils.color.opacity(ColorUtils.color.brightness(bg1, -15), 0.7),\n codeFg: theme.codeFg || '#666',\n codePropertyColor: theme.codePropertyColor || '#905',\n codeKeywordColor: theme.codeKeywordColor || '#07a',\n codeOperatorColor: theme.codeOperatorColor || '#9a6e3a',\n };\n }\n return html`\n `;\n}\n","import { html } from 'lit';\n\n// Templates\nimport expandedEndpointTemplate from '~/templates/expanded-endpoint-template';\nimport focusedEndpointTemplate from '~/templates/focused-endpoint-template';\nimport overviewTemplate from '~/templates/overview-template';\nimport endpointTemplate from '~/templates/endpoint-template';\nimport serverTemplate from '~/templates/server-template';\nimport securitySchemeTemplate, { recoverPersistedApiKeys } from '~/templates/security-scheme-template';\nimport headerTemplate from '~/templates/header-template';\nimport navbarTemplate from '~/templates/navbar-template';\nimport advancedSearchTemplate from '~/templates/advance-search-template';\nimport SetTheme from '~/utils/theme';\nimport { isValidHexColor } from '~/utils/color-utils';\n\nexport default function mainBodyTemplate(isMini = false, pathsExpanded = false) {\n if (!this.resolvedSpec) {\n return '';\n }\n if (this.persistAuth === 'true') {\n recoverPersistedApiKeys.call(this);\n }\n const newTheme = {\n bg1: isValidHexColor(this.bgColor) ? this.bgColor : '',\n fg1: isValidHexColor(this.textColor) ? this.textColor : '',\n headerColor: isValidHexColor(this.headerColor) ? this.headerColor : '',\n primaryColor: isValidHexColor(this.primaryColor) ? this.primaryColor : '',\n navBgColor: isValidHexColor(this.navBgColor) ? this.navBgColor : '',\n navTextColor: isValidHexColor(this.navTextColor) ? this.navTextColor : '',\n navHoverBgColor: isValidHexColor(this.navHoverBgColor) ? this.navHoverBgColor : '',\n navHoverTextColor: isValidHexColor(this.navHoverTextColor) ? this.navHoverTextColor : '',\n navAccentColor: isValidHexColor(this.navAccentColor) ? this.navAccentColor : '',\n navAccentTextColor: isValidHexColor(this.navAccentTextColor) ? this.navAccentTextColor : '',\n };\n /* eslint-disable indent */\n if (this.resolvedSpec.specLoadError) {\n if (isMini) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
${this.resolvedSpec.info.description}
\n `;\n }\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n \n ${headerTemplate.call(this)}\n
\n \n
\n

${this.resolvedSpec.info.title}

\n
${this.resolvedSpec.info.description}
\n
\n
\n `;\n }\n if (this.resolvedSpec.isSpecLoading) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
\n \n
\n
\n
\n
\n `;\n }\n\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n\n \n ${this.showHeader === 'false' ? '' : headerTemplate.call(this)}\n \n \n ${this.allowAdvancedSearch === 'false' ? '' : advancedSearchTemplate.call(this)}\n\n
\n \n ${((this.renderStyle === 'read' || this.renderStyle === 'focused')\n && this.showSideNav === 'true'\n && this.resolvedSpec\n ) ? navbarTemplate.call(this) : ''\n }\n\n \n
\n \n
\n ${this.loading === true\n ? html`
`\n : html`\n ${this.loadFailed === true\n ? html`
Unable to load the Spec
`\n : html`\n
\n ${this.renderStyle === 'focused'\n ? html`${focusedEndpointTemplate.call(this)}`\n : html`\n ${this.showInfo === 'true' ? overviewTemplate.call(this) : ''}\n ${this.allowServerSelection === 'true' ? serverTemplate.call(this) : ''}\n ${this.allowAuthentication === 'true' ? securitySchemeTemplate.call(this) : ''}\n
\n \n
\n ${this.renderStyle === 'read'\n ? expandedEndpointTemplate.call(this)\n : endpointTemplate.call(this, isMini, pathsExpanded)\n }\n `\n }\n
\n `\n }`\n }\n
\n \n
\n
\n `;\n}\n/* eslint-enable indent */\n","import { css, LitElement, unsafeCSS } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\nimport CustomStyles from '~/styles/custom-styles';\n// import { expandCollapseNavBarTag } from '@/templates/navbar-template';\nimport { advancedSearch, getMatchedPaths, getMatchedComponents, rapidocApiKey, sleep } from '~/utils/common-utils';\nimport ProcessSpec from '~/utils/spec-parser';\nimport mainBodyTemplate from '~/templates/main-body-template';\nimport { applyApiKey, onClearAllApiKeys } from '~/templates/security-scheme-template';\nimport { setApiServer } from '~/templates/server-template';\n\nexport default class RapiDoc extends LitElement {\n constructor() {\n super();\n const intersectionObserverOptions = {\n root: this.getRootNode().host,\n rootMargin: '-50px 0px -50px 0px', // when the element is visible 100px from bottom\n threshold: 0,\n };\n this.showSummaryWhenCollapsed = true;\n // Will activate intersection observer only after spec load and hash analyze\n // to scroll to the proper element without being reverted by observer behavior\n this.isIntersectionObserverActive = false;\n this.intersectionObserver = new IntersectionObserver((entries) => { this.onIntersect(entries); }, intersectionObserverOptions);\n }\n\n static get properties() {\n return {\n // Heading\n headingText: { type: String, attribute: 'heading-text' },\n gotoPath: { type: String, attribute: 'goto-path' },\n\n // Spec\n updateRoute: { type: String, attribute: 'update-route' },\n routePrefix: { type: String, attribute: 'route-prefix' },\n specUrl: { type: String, attribute: 'spec-url' },\n sortTags: { type: String, attribute: 'sort-tags' },\n sortSchemas: { type: String, attribute: 'sort-schemas' },\n generateMissingTags: { type: String, attribute: 'generate-missing-tags' },\n sortEndpointsBy: { type: String, attribute: 'sort-endpoints-by' },\n specFile: { type: String, attribute: false },\n\n // UI Layouts\n layout: { type: String },\n renderStyle: { type: String, attribute: 'render-style' },\n defaultSchemaTab: { type: String, attribute: 'default-schema-tab' },\n responseAreaHeight: { type: String, attribute: 'response-area-height' },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n persistAuth: { type: String, attribute: 'persist-auth' },\n onNavTagClick: { type: String, attribute: 'on-nav-tag-click' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n\n // API Server\n apiKeyName: { type: String, attribute: 'api-key-name' },\n apiKeyLocation: { type: String, attribute: 'api-key-location' },\n apiKeyValue: { type: String, attribute: 'api-key-value' },\n defaultApiServerUrl: { type: String, attribute: 'default-api-server' },\n serverUrl: { type: String, attribute: 'server-url' },\n oauthReceiver: { type: String, attribute: 'oauth-receiver' },\n\n // Hide/Show Sections & Enable Disable actions\n showHeader: { type: String, attribute: 'show-header' },\n showSideNav: { type: String, attribute: 'show-side-nav' },\n showInfo: { type: String, attribute: 'show-info' },\n allowAuthentication: { type: String, attribute: 'allow-authentication' },\n allowTry: { type: String, attribute: 'allow-try' },\n showCurlBeforeTry: { type: String, attribute: 'show-curl-before-try' },\n allowSpecUrlLoad: { type: String, attribute: 'allow-spec-url-load' },\n allowSpecFileLoad: { type: String, attribute: 'allow-spec-file-load' },\n allowSpecFileDownload: { type: String, attribute: 'allow-spec-file-download' },\n allowSearch: { type: String, attribute: 'allow-search' },\n allowAdvancedSearch: { type: String, attribute: 'allow-advanced-search' },\n allowServerSelection: { type: String, attribute: 'allow-server-selection' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n showComponents: { type: String, attribute: 'show-components' },\n pageDirection: { type: String, attribute: 'page-direction' },\n scrollBehavior: { type: String, attribute: 'scroll-behavior' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n headerColor: { type: String, attribute: 'header-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n cssFile: { type: String, attribute: 'css-file' },\n cssClasses: { type: String, attribute: 'css-classes' },\n\n // Nav Bar Colors\n navBgColor: { type: String, attribute: 'nav-bg-color' },\n navTextColor: { type: String, attribute: 'nav-text-color' },\n navHoverBgColor: { type: String, attribute: 'nav-hover-bg-color' },\n navHoverTextColor: { type: String, attribute: 'nav-hover-text-color' },\n navAccentColor: { type: String, attribute: 'nav-accent-color' },\n navAccentTextColor: { type: String, attribute: 'nav-accent-text-color' },\n navActiveItemMarker: { type: String, attribute: 'nav-active-item-marker' },\n navItemSpacing: { type: String, attribute: 'nav-item-spacing' },\n showMethodInNavBar: { type: String, attribute: 'show-method-in-nav-bar' },\n usePathInNavBar: { type: String, attribute: 'use-path-in-nav-bar' },\n infoDescriptionHeadingsInNavBar: { type: String, attribute: 'info-description-headings-in-navbar' },\n\n // Fetch Options\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // Filters\n matchPaths: { type: String, attribute: 'match-paths' },\n matchType: { type: String, attribute: 'match-type' },\n removeEndpointsWithBadgeLabelAs: { type: String, attribute: 'remove-endpoints-with-badge-label-as' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n focusedElementId: { type: String }, // updating the focusedElementId will automatically render appropriate section in focused mode\n showAdvancedSearchDialog: { type: Boolean },\n advancedSearchMatches: { type: Object },\n searchVal: { type: String },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n container-type: inline-size;\n }\n :where(button, input[type=\"checkbox\"], [tabindex=\"0\"]):focus-visible { box-shadow: var(--focus-shadow); }\n :where(input[type=\"text\"], input[type=\"password\"], select, textarea):focus-visible { border-color: var(--primary-color); }\n .body {\n display:flex;\n height:100%;\n width:100%;\n overflow:hidden;\n }\n .main-content { \n margin:0;\n padding: 0; \n display:block;\n flex:1;\n height:100%;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) transparent;\n }\n\n .main-content-inner--view-mode {\n padding: 0 8px;\n }\n .main-content::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n .main-content::-webkit-scrollbar-track {\n background:transparent;\n }\n .main-content::-webkit-scrollbar-thumb {\n background-color: var(--border-color);\n }\n\n .section-gap.section-tag {\n border-bottom:1px solid var(--border-color);\n }\n .section-gap,\n .section-gap--focused-mode,\n .section-gap--read-mode { \n padding: 0px 4px; \n }\n .section-tag-header {\n position:relative;\n cursor: n-resize;\n padding: 12px 0;\n }\n .collapsed .section-tag-header:hover {\n cursor: s-resize;\n }\n\n .section-tag-header:hover {\n background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-color), rgba(0,0,0,0));\n }\n\n .section-tag-header:hover::after {\n position:absolute;\n margin-left:-24px;\n font-size:20px;\n top: calc(50% - 14px);\n color:var(--primary-color);\n content: '⬆'; \n }\n\n .collapsed .section-tag-header::after {\n position:absolute;\n margin-left:-24px;\n font-size:20px;\n top: calc(50% - 14px);\n color: var(--border-color);\n content: '⬇'; \n }\n .collapsed .section-tag-header:hover::after {\n color:var(--primary-color);\n }\n\n .collapsed .section-tag-body {\n display:none;\n }\n\n .logo {\n height:36px;\n width:36px;\n margin-left:5px; \n }\n .only-large-screen-flex,\n .only-large-screen {\n display:none;\n }\n .tag.title {\n text-transform: uppercase;\n }\n .main-header {\n background-color:var(--header-bg);\n color:var(--header-fg);\n width:100%;\n }\n .header-title {\n font-size:calc(var(--font-size-regular) + 8px); \n padding:0 8px;\n }\n input.header-input{\n background:var(--header-color-darker);\n color:var(--header-fg);\n border:1px solid var(--header-color-border);\n flex:1; \n padding-right:24px;\n border-radius:3px;\n }\n input.header-input::placeholder {\n opacity:0.4;\n }\n .loader {\n margin: 16px auto 16px auto; \n border: 4px solid var(--bg3);\n border-radius: 50%;\n border-top: 4px solid var(--primary-color);\n width: 36px;\n height: 36px;\n animation: spin 2s linear infinite;\n }\n .expanded-endpoint-body { \n position: relative;\n padding: 6px 0px; \n }\n .expanded-endpoint-body .tag-description {\n background: var(--code-bg);\n border-radius: var(--border-radius);\n transition: max-height .2s ease-out;\n }\n .expanded-endpoint-body .tag-icon {\n transition: transform .2s ease-out;\n }\n .expanded-endpoint-body .tag-icon.expanded {\n transform: rotate(180deg);\n }\n .divider { \n border-top: 2px solid var(--border-color);\n margin: 24px 0;\n width:100%;\n }\n\n .tooltip {\n cursor:pointer;\n border: 1px solid var(--border-color);\n border-left-width: 4px;\n margin-left:2px;\n }\n .tooltip a {\n color: var(--fg2);\n text-decoration: none;\n }\n .tooltip-text {\n color: var(--fg2);\n max-width: 400px;\n position: absolute;\n z-index:1;\n background-color: var(--bg2);\n visibility: hidden;\n\n overflow-wrap: break-word;\n }\n .tooltip:hover {\n color: var(--primary-color);\n border-color: var(--primary-color);\n }\n .tooltip:hover a:hover {\n color: var(--primary-color);\n }\n\n .tooltip:hover .tooltip-text {\n visibility: visible;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .nav-method { font-weight: bold; margin-right: 4px; font-size: calc(var(--font-size-small) - 2px); white-space: nowrap; }\n .nav-method.false { display: none; }\n\n .nav-method.as-colored-text.get { color:var(--nav-get-color); }\n .nav-method.as-colored-text.put { color:var(--nav-put-color); }\n .nav-method.as-colored-text.post { color:var(--nav-post-color); }\n .nav-method.as-colored-text.delete { color:var(--nav-delete-color); }\n .nav-method.as-colored-text.head, .nav-method.as-colored-text.patch, .nav-method.as-colored-text.options { color:var(--nav-head-color); }\n \n .nav-method.as-colored-block {\n padding: 1px 4px;\n min-width: 30px;\n border-radius: 4px 0 0 4px;\n color: #000;\n }\n .colored-block .nav-method.as-colored-block {\n outline: 1px solid;\n }\n\n .nav-method.as-colored-block.get { background-color: var(--blue); }\n .nav-method.as-colored-block.put { background-color: var(--orange); }\n .nav-method.as-colored-block.post { background-color: var(--green); }\n .nav-method.as-colored-block.delete { background-color: var(--red); }\n .nav-method.as-colored-block.head, .nav-method.as-colored-block.patch , .nav-method.as-colored-block.options { \n background-color: var(--yellow); \n }\n\n @container (min-width: 768px) {\n .nav-bar {\n width: 260px;\n display:flex;\n }\n .only-large-screen {\n display:block;\n }\n .only-large-screen-flex {\n display:flex;\n }\n .section-gap { \n padding: 0 0 0 24px; \n }\n .section-gap--focused-mode {\n padding: 24px 8px; \n }\n .section-gap--read-mode { \n padding: 24px 8px; \n }\n .endpoint-body {\n position: relative;\n padding:36px 0 48px 0;\n }\n }\n\n @container (min-width: 1024px) {\n .nav-bar {\n width: ${unsafeCSS(this.fontSize === 'default' ? '300px' : this.fontSize === 'large' ? '315px' : '330px')};\n display:flex;\n }\n .section-gap--focused-mode { \n padding: 12px 80px 12px 80px; \n }\n .section-gap--read-mode { \n padding: 24px 80px 12px 80px; \n }\n }`,\n CustomStyles,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n const parent = this.parentElement;\n if (parent) {\n if (parent.offsetWidth === 0 && parent.style.width === '') {\n parent.style.width = '100vw';\n }\n if (parent.offsetHeight === 0 && parent.style.height === '') {\n parent.style.height = '100vh';\n }\n if (parent.tagName === 'BODY') {\n if (!parent.style.marginTop) { parent.style.marginTop = '0'; }\n if (!parent.style.marginRight) { parent.style.marginRight = '0'; }\n if (!parent.style.marginBottom) { parent.style.marginBottom = '0'; }\n if (!parent.style.marginLeft) { parent.style.marginLeft = '0'; }\n }\n }\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n if (!this.layout || !'row, column,'.includes(`${this.layout},`)) { this.layout = 'row'; }\n if (!this.renderStyle || !'read, view, focused,'.includes(`${this.renderStyle},`)) { this.renderStyle = 'focused'; }\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.defaultSchemaTab || !'example, schema, model,'.includes(`${this.defaultSchemaTab},`)) {\n this.defaultSchemaTab = 'example';\n } else if (this.defaultSchemaTab === 'model') {\n this.defaultSchemaTab = 'schema';\n }\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n\n if (!this.schemaHideReadOnly || !'default, never,'.includes(`${this.schemaHideReadOnly},`)) { this.schemaHideReadOnly = 'default'; }\n if (!this.schemaHideWriteOnly || !'default, never,'.includes(`${this.schemaHideWriteOnly},`)) { this.schemaHideWriteOnly = 'default'; }\n\n if (!this.fillRequestFieldsWithExample || !'true, false,'.includes(`${this.fillRequestFieldsWithExample},`)) { this.fillRequestFieldsWithExample = 'true'; }\n if (!this.persistAuth || !'true, false,'.includes(`${this.persistAuth},`)) { this.persistAuth = 'false'; }\n if (!this.responseAreaHeight) {\n this.responseAreaHeight = '400px';\n }\n\n if (!this.allowSearch || !'true, false,'.includes(`${this.allowSearch},`)) { this.allowSearch = 'true'; }\n if (!this.allowAdvancedSearch || !'true, false,'.includes(`${this.allowAdvancedSearch},`)) { this.allowAdvancedSearch = 'true'; }\n\n if (!this.allowTry || !'true, false,'.includes(`${this.allowTry},`)) { this.allowTry = 'true'; }\n if (!this.apiKeyValue) { this.apiKeyValue = '-'; }\n if (!this.apiKeyLocation) { this.apiKeyLocation = 'header'; }\n if (!this.apiKeyName) { this.apiKeyName = ''; }\n\n if (!this.oauthReceiver) { this.oauthReceiver = 'oauth-receiver.html'; }\n if (!this.updateRoute || !'true, false,'.includes(`${this.updateRoute},`)) { this.updateRoute = 'true'; }\n if (!this.routePrefix) { this.routePrefix = '#'; }\n if (!this.sortTags || !'true, false,'.includes(`${this.sortTags},`)) { this.sortTags = 'false'; }\n if (!this.sortSchemas || !'true, false,'.includes(`${this.sortSchemas},`)) { this.sortSchemas = 'false'; }\n if (!this.generateMissingTags || !'true, false,'.includes(`${this.generateMissingTags},`)) { this.generateMissingTags = 'false'; }\n if (!this.sortEndpointsBy || !'method, path, summary, none,'.includes(`${this.sortEndpointsBy},`)) { this.sortEndpointsBy = 'path'; }\n\n if (!this.onNavTagClick || !'expand-collapse, show-description,'.includes(`${this.onNavTagClick},`)) { this.onNavTagClick = 'expand-collapse'; }\n if (!this.navItemSpacing || !'compact, relaxed, default,'.includes(`${this.navItemSpacing},`)) { this.navItemSpacing = 'default'; }\n if (!this.showMethodInNavBar || !'false, as-plain-text, as-colored-text, as-colored-block,'.includes(`${this.showMethodInNavBar},`)) { this.showMethodInNavBar = 'false'; }\n if (!this.usePathInNavBar || !'true, false,'.includes(`${this.usePathInNavBar},`)) { this.usePathInNavBar = 'false'; }\n if (!this.navActiveItemMarker || !'left-bar, colored-block'.includes(`${this.navActiveItemMarker},`)) { this.navActiveItemMarker = 'left-bar'; }\n\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n if (!this.showInfo || !'true, false,'.includes(`${this.showInfo},`)) { this.showInfo = 'true'; }\n if (!this.allowServerSelection || !'true, false,'.includes(`${this.allowServerSelection},`)) { this.allowServerSelection = 'true'; }\n if (!this.allowAuthentication || !'true, false,'.includes(`${this.allowAuthentication},`)) { this.allowAuthentication = 'true'; }\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n\n if (!this.showSideNav || !'true false'.includes(this.showSideNav)) { this.showSideNav = 'true'; }\n if (!this.showComponents || !'true false'.includes(this.showComponents)) { this.showComponents = 'false'; }\n if (!this.infoDescriptionHeadingsInNavBar || !'true, false,'.includes(`${this.infoDescriptionHeadingsInNavBar},`)) { this.infoDescriptionHeadingsInNavBar = 'false'; }\n if (!this.fetchCredentials || !'omit, same-origin, include,'.includes(`${this.fetchCredentials},`)) { this.fetchCredentials = ''; }\n if (!this.scrollBehavior || !'smooth, auto,'.includes(`${this.scrollBehavior},`)) { this.scrollBehavior = 'auto'; }\n\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n if (!this.matchPaths) { this.matchPaths = ''; }\n if (!this.removeEndpointsWithBadgeLabelAs) { this.removeEndpointsWithBadgeLabelAs = ''; }\n if (!this.showAdvancedSearchDialog) { this.showAdvancedSearchDialog = false; }\n\n if (!this.cssFile) { this.cssFile = null; }\n if (!this.cssClasses) { this.cssClasses = ''; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n\n window.addEventListener('hashchange', () => {\n this.scrollToPath(this.getElementIDFromURL());\n }, true);\n }\n\n // Cleanup\n disconnectedCallback() {\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n super.disconnectedCallback();\n }\n\n infoDescriptionHeadingRenderer() {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n }\n\n render() {\n // return render(mainBodyTemplate(this), this.shadowRoot, { eventContext: this });\n const cssLinkEl = document.querySelector(`link[href*=\"${this.cssFile}\"]`);\n // adding custom style for RapiDoc\n if (cssLinkEl) {\n this.shadowRoot.appendChild(cssLinkEl.cloneNode());\n }\n return mainBodyTemplate.call(this);\n }\n\n observeExpandedContent() {\n // Main Container\n const observeOverviewEls = this.shadowRoot.querySelectorAll('.observe-me');\n observeOverviewEls.forEach((targetEl) => {\n this.intersectionObserver.observe(targetEl);\n });\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n // If goto-path is provided and no location-hash is present then try to scroll there\n if (this.gotoPath && !window.location.hash) {\n this.scrollToPath(this.gotoPath);\n }\n }, 0);\n }\n }\n if (name === 'match-paths' || name === 'match-type' || name === 'remove-endpoints-with-badge-label-as') {\n if (oldVal !== newVal) {\n window.setTimeout(async () => {\n await this.loadSpec(this.specUrl);\n }, 0);\n }\n }\n if (name === 'render-style') {\n if (newVal === 'read') {\n window.setTimeout(() => {\n this.observeExpandedContent();\n }, 100);\n } else {\n this.intersectionObserver.disconnect();\n }\n }\n if (name === 'api-key-name' || name === 'api-key-location' || name === 'api-key-value') {\n let updateSelectedApiKey = false;\n let apiKeyName = '';\n let apiKeyLocation = '';\n let apiKeyValue = '';\n\n if (name === 'api-key-name') {\n if (this.getAttribute('api-key-location') && this.getAttribute('api-key-value')) {\n apiKeyName = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-location') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-value')) {\n apiKeyLocation = newVal;\n apiKeyName = this.getAttribute('api-key-name');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-value') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-location')) {\n apiKeyValue = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyName = this.getAttribute('api-key-name');\n updateSelectedApiKey = true;\n }\n }\n\n if (updateSelectedApiKey) {\n if (this.resolvedSpec) {\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => v.securitySchemeId === rapidocApiKey);\n if (!rapiDocApiKey) {\n this.resolvedSpec.securitySchemes.push({\n securitySchemeId: rapidocApiKey,\n description: 'api-key provided in rapidoc element attributes',\n type: 'apiKey',\n name: apiKeyName,\n in: apiKeyLocation,\n value: apiKeyValue,\n finalKeyValue: apiKeyValue,\n });\n } else {\n rapiDocApiKey.name = apiKeyName;\n rapiDocApiKey.in = apiKeyLocation;\n rapiDocApiKey.value = apiKeyValue;\n rapiDocApiKey.finalKeyValue = apiKeyValue;\n }\n this.requestUpdate();\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSpecUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n onSpecFileChange(e) {\n this.setAttribute('spec-file', this.shadowRoot.getElementById('spec-file').value);\n const specFile = e.target.files[0];\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const specObj = JSON.parse(reader.result);\n this.loadSpec(specObj);\n this.shadowRoot.getElementById('spec-url').value = '';\n } catch {\n console.error('RapiDoc: Unable to read or parse json'); // eslint-disable-line no-console\n }\n };\n // Read the Text file\n reader.readAsText(specFile);\n }\n\n onFileLoadClick() {\n this.shadowRoot.getElementById('spec-file').click();\n }\n\n onSearchChange(e) {\n // this.matchPaths = e.target.value;\n this.searchVal = e.target.value;\n this.resolvedSpec.tags.forEach((tag) => tag.paths.filter((path) => {\n if (this.searchVal) {\n if (getMatchedPaths(this.searchVal, path, tag.name)) {\n tag.expanded = true;\n }\n }\n }));\n this.resolvedSpec.components.forEach((component) => component.subComponents.filter((v) => {\n v.expanded = false;\n if (getMatchedComponents(this.searchVal, v)) {\n v.expanded = true;\n }\n }));\n this.requestUpdate();\n }\n\n onClearSearch() {\n const searchEl = this.shadowRoot.getElementById('nav-bar-search');\n searchEl.value = '';\n this.searchVal = '';\n this.resolvedSpec.components.forEach((component) => component.subComponents.filter((v) => {\n v.expanded = true;\n }));\n }\n\n onShowSearchModalClicked() {\n this.showAdvancedSearchDialog = true;\n }\n\n // Event Handler on Dialog-Box is opened\n async onOpenSearchDialog(e) {\n // Set focus to text input\n const inputEl = e.detail.querySelector('input');\n await sleep(0);\n if (inputEl) {\n inputEl.focus();\n }\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n this.searchVal = '';\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.sortSchemas === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('api-key-name'),\n this.getAttribute('api-key-location'),\n this.getAttribute('api-key-value'),\n this.getAttribute('server-url'),\n this.matchPaths,\n this.matchType,\n this.removeEndpointsWithBadgeLabelAs,\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n this.selectedServer = undefined;\n if (this.defaultApiServerUrl) {\n if (this.defaultApiServerUrl === this.serverUrl) {\n this.selectedServer = {\n url: this.serverUrl,\n computedUrl: this.serverUrl,\n };\n } else if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers.find((v) => (v.url === this.defaultApiServerUrl));\n }\n }\n if (!this.selectedServer) {\n if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers[0]; // eslint-disable-line prefer-destructuring\n }\n }\n this.requestUpdate();\n // eslint-disable-next-line no-await-in-loop\n while (!await this.updateComplete);\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n\n // Initiate IntersectionObserver and put it at the end of event loop, to allow loading all the child elements (must for larger specs)\n this.intersectionObserver.disconnect();\n if (this.renderStyle === 'read') {\n await sleep(100);\n this.observeExpandedContent(); // This will auto-highlight the selected nav-item in read-mode\n }\n\n this.isIntersectionObserverActive = true;\n\n // On first time Spec load, try to navigate to location hash if provided\n const elementId = this.getElementIDFromURL();\n\n if (elementId) {\n if (this.renderStyle === 'view') {\n this.expandAndGotoOperation(elementId, true, true);\n } else {\n this.scrollToPath(elementId);\n }\n } else if (this.renderStyle === 'focused') {\n // If goto-path is provided and no location-hash is present then try to scroll to default element\n if (!this.gotoPath) {\n const defaultElementId = this.showInfo ? 'overview' : this.resolvedSpec.tags[0]?.paths[0];\n this.scrollToPath(defaultElementId);\n }\n }\n }\n\n /**\n * Return the URL from where is served the RapiDoc component, removing any hash and route prefix\n */\n getComponentBaseURL() {\n const { href } = window.location;\n\n // Remove end of string # or /\n const cleanRouterPrefix = this.routePrefix.replace(/(#|\\/)$/, '');\n\n if (!cleanRouterPrefix) {\n return href.split('#')[0];\n }\n\n const indexOfRoutePrefix = href.lastIndexOf(cleanRouterPrefix);\n\n if (indexOfRoutePrefix === -1) {\n return href;\n }\n\n return href.slice(0, indexOfRoutePrefix);\n }\n\n /**\n * From the URL return the ID of the element whether it is in the hash or if used a router prefix without a hash\n */\n getElementIDFromURL() {\n const baseURL = this.getComponentBaseURL();\n const elementId = window.location.href.replace(baseURL + this.routePrefix, '');\n return elementId;\n }\n\n replaceHistoryState(hashId) {\n const baseURL = this.getComponentBaseURL();\n window.history.replaceState(null, null, `${baseURL}${this.routePrefix || '#'}${hashId}`);\n }\n\n expandAndGotoOperation(elementId, scrollToElement = true) {\n if (!this.resolvedSpec) {\n return;\n }\n // Expand full operation and tag\n let isExpandingNeeded = true;\n const tmpElementId = elementId.indexOf('#') === -1 ? elementId : elementId.substring(1);\n if (tmpElementId.startsWith('overview') || tmpElementId === 'servers' || tmpElementId === 'auth') {\n isExpandingNeeded = false;\n } else {\n for (let i = 0; i < this.resolvedSpec.tags?.length; i++) {\n const tag = this.resolvedSpec.tags[i];\n const path = tag.paths?.find((p) => p.elementId === elementId);\n if (path) {\n if (path.expanded && tag.expanded) {\n isExpandingNeeded = false;\n } else {\n path.expanded = true;\n tag.expanded = true;\n }\n }\n }\n }\n if (scrollToElement) {\n // requestUpdate() and delay required, else we cant find element\n if (isExpandingNeeded) {\n this.requestUpdate();\n }\n window.setTimeout(() => {\n const gotoEl = this.shadowRoot.getElementById(tmpElementId);\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'start' });\n if (this.updateRoute === 'true') {\n this.replaceHistoryState(tmpElementId);\n }\n }\n }, isExpandingNeeded ? 150 : 0);\n }\n }\n\n isValidTopId(id) {\n return (id.startsWith('overview') || id === 'servers' || id === 'auth');\n }\n\n isValidPathId(id) {\n if (id === 'overview' && this.showInfo) {\n return true;\n }\n if (id === 'servers' && this.allowServerSelection) {\n return true;\n }\n if (id === 'auth' && this.allowAuthentication) {\n return true;\n }\n if (id.startsWith('tag--')) {\n return this.resolvedSpec?.tags?.find((tag) => tag.elementId === id);\n }\n return this.resolvedSpec?.tags?.find((tag) => tag.paths.find((path) => path.elementId === id));\n }\n\n onIntersect(entries) {\n if (this.isIntersectionObserverActive === false) {\n return;\n }\n\n entries.forEach((entry) => {\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\n const oldNavEl = this.shadowRoot.querySelector('.nav-bar-tag.active, .nav-bar-path.active, .nav-bar-info.active, .nav-bar-h1.active, .nav-bar-h2.active, .operations.active');\n const newNavEl = this.shadowRoot.getElementById(`link-${entry.target.id}`);\n\n // Add active class in the new element\n if (newNavEl) {\n if (this.updateRoute === 'true') {\n this.replaceHistoryState(entry.target.id);\n }\n newNavEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'center' });\n newNavEl.classList.add('active');\n newNavEl.part.add('section-navbar-active-item');\n }\n\n // Remove active class from previous element\n // if it is different from the new one (edge case on loading in read render style)\n if (oldNavEl && oldNavEl !== newNavEl) {\n oldNavEl.classList.remove('active');\n oldNavEl.part.remove('section-navbar-active-item');\n }\n }\n });\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'start' });\n }\n }\n }\n }\n\n /**\n * Called by\n * - onClick of Navigation Bar\n * - onClick of Advanced Search items\n *\n * Functionality:\n * 1. First deactivate IntersectionObserver\n * 2. Scroll to the element\n * 3. Activate IntersectionObserver (after little delay)\n *\n */\n async scrollToEventTarget(event, scrollNavItemToView = true) {\n if (!(event.type === 'click' || (event.type === 'keyup' && event.keyCode === 13))) {\n return;\n }\n const navEl = event.target;\n if (!navEl.dataset.contentId) {\n return;\n }\n this.isIntersectionObserverActive = false;\n if (this.renderStyle === 'focused') {\n const requestEl = this.shadowRoot.querySelector('api-request');\n if (requestEl) {\n requestEl.beforeNavigationFocusedMode();\n }\n }\n this.scrollToPath(navEl.dataset.contentId, true, scrollNavItemToView);\n setTimeout(() => {\n this.isIntersectionObserverActive = true;\n }, 300);\n }\n\n // Public Method (scrolls to a given path and highlights the left-nav selection)\n async scrollToPath(elementId, expandPath = true, scrollNavItemToView = true) {\n if (this.renderStyle === 'focused') {\n // for focused mode update this.focusedElementId to update the rendering, else it wont find the needed html elements\n // focusedElementId will get validated in the template\n this.focusedElementId = elementId;\n await sleep(0);\n }\n if (this.renderStyle === 'view') {\n this.expandAndGotoOperation(elementId, expandPath, true);\n } else {\n let isValidElementId = false;\n const contentEl = this.shadowRoot.getElementById(elementId);\n if (contentEl) {\n isValidElementId = true;\n contentEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'start' });\n } else {\n isValidElementId = false;\n }\n if (isValidElementId) {\n // for focused style it is important to reset request-body-selection and response selection which maintains the state for in case of multiple req-body or multiple response mime-type\n if (this.renderStyle === 'focused') {\n const requestEl = this.shadowRoot.querySelector('api-request');\n if (requestEl) {\n requestEl.afterNavigationFocusedMode();\n }\n const responseEl = this.shadowRoot.querySelector('api-response');\n if (responseEl) {\n responseEl.resetSelection();\n }\n }\n\n // Update Location Hash\n if (this.updateRoute === 'true') {\n this.replaceHistoryState(elementId);\n }\n\n // Update NavBar View and Styles\n const newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);\n\n if (newNavEl) {\n if (scrollNavItemToView) {\n newNavEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'center' });\n }\n await sleep(0);\n const oldNavEl = this.shadowRoot.querySelector('.nav-bar-tag.active, .nav-bar-path.active, .nav-bar-info.active, .nav-bar-h1.active, .nav-bar-h2.active, .operations.active');\n if (oldNavEl) {\n oldNavEl.classList.remove('active');\n oldNavEl.part.remove('active');\n oldNavEl.part.remove('section-navbar-active-item');\n }\n newNavEl.classList.add('active'); // must add the class after scrolling\n newNavEl.part.add('section-navbar-active-item');\n // this.requestUpdate();\n }\n }\n }\n }\n\n // Public Method - to update security-scheme of type http\n setHttpUserNameAndPassword(securitySchemeId, username, password) {\n return applyApiKey.call(this, securitySchemeId, username, password);\n }\n\n // Public Method - to update security-scheme of type apiKey or OAuth\n setApiKey(securitySchemeId, apiKeyValue) {\n return applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n\n // Public Method\n removeAllSecurityKeys() {\n return onClearAllApiKeys.call(this);\n }\n\n // Public Method\n setApiServer(apiServerUrl) {\n // return apiServerUrl;\n return setApiServer.call(this, apiServerUrl);\n }\n\n // Event handler for Advanced Search text-inputs and checkboxes\n onAdvancedSearch(ev, delay) {\n const eventTargetEl = ev.target;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => {\n let searchInputEl;\n if (eventTargetEl.type === 'text') {\n searchInputEl = eventTargetEl;\n } else {\n searchInputEl = eventTargetEl.closest('.advanced-search-options').querySelector('input[type=text]');\n }\n const searchOptions = [...eventTargetEl.closest('.advanced-search-options').querySelectorAll('input:checked')].map((v) => v.id);\n this.advancedSearchMatches = advancedSearch(searchInputEl.value, this.resolvedSpec.tags, searchOptions);\n }, delay);\n }\n}\ncustomElements.define('rapi-doc', RapiDoc);\n","import { css, LitElement } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\n\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport { rapidocApiKey } from '~/utils/common-utils';\nimport ProcessSpec from '~/utils/spec-parser';\nimport mainBodyTemplate from '~/templates/main-body-template';\nimport { applyApiKey, onClearAllApiKeys } from '~/templates/security-scheme-template';\nimport { setApiServer } from '~/templates/server-template';\n\nexport default class RapiDocMini extends LitElement {\n constructor() {\n super();\n this.isMini = true;\n this.updateRoute = 'false';\n this.renderStyle = 'view';\n this.showHeader = 'false';\n this.allowAdvancedSearch = 'false';\n }\n\n static get properties() {\n return {\n // Spec\n specUrl: { type: String, attribute: 'spec-url' },\n sortEndpointsBy: { type: String, attribute: 'sort-endpoints-by' },\n\n // UI Layouts\n layout: { type: String },\n pathsExpanded: { type: String, attribute: 'paths-expanded' },\n defaultSchemaTab: { type: String, attribute: 'default-schema-tab' },\n responseAreaHeight: { type: String, attribute: 'response-area-height' },\n showSummaryWhenCollapsed: { type: String, attribute: 'show-summary-when-collapsed' },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n persistAuth: { type: String, attribute: 'persist-auth' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n\n // API Server\n apiKeyName: { type: String, attribute: 'api-key-name' },\n apiKeyLocation: { type: String, attribute: 'api-key-location' },\n apiKeyValue: { type: String, attribute: 'api-key-value' },\n defaultApiServerUrl: { type: String, attribute: 'default-api-server' },\n serverUrl: { type: String, attribute: 'server-url' },\n oauthReceiver: { type: String, attribute: 'oauth-receiver' },\n\n allowTry: { type: String, attribute: 'allow-try' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n\n // Fetch Options\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // Filters\n matchPaths: { type: String, attribute: 'match-paths' },\n matchType: { type: String, attribute: 'match-type' },\n removeEndpointsWithBadgeLabelAs: { type: String, attribute: 'remove-endpoints-with-badge-label-as' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n container-type: inline-size;\n }\n\n @container (min-width: 768px) {\n .only-large-screen {\n display:block;\n }\n .only-large-screen-flex {\n display:flex;\n }\n }`,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n if (!this.showSummaryWhenCollapsed || !'true, false,'.includes(`${this.showSummaryWhenCollapsed},`)) { this.showSummaryWhenCollapsed = 'true'; }\n if (!this.layout || !'row, column,'.includes(`${this.layout},`)) { this.layout = 'row'; }\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.defaultSchemaTab || !'example, schema, model,'.includes(`${this.defaultSchemaTab},`)) {\n this.defaultSchemaTab = 'example';\n } else if (this.defaultSchemaTab === 'model') {\n this.defaultSchemaTab = 'schema';\n }\n this.pathsExpanded = this.pathsExpanded === 'true';\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.fillRequestFieldsWithExample || !'true, false,'.includes(`${this.fillRequestFieldsWithExample},`)) { this.fillRequestFieldsWithExample = 'true'; }\n if (!this.persistAuth || !'true, false,'.includes(`${this.persistAuth},`)) { this.persistAuth = 'false'; }\n if (!this.responseAreaHeight) { this.responseAreaHeight = '300px'; }\n\n if (!this.allowTry || !'true, false,'.includes(`${this.allowTry},`)) { this.allowTry = 'true'; }\n if (!this.apiKeyValue) { this.apiKeyValue = '-'; }\n if (!this.apiKeyLocation) { this.apiKeyLocation = 'header'; }\n if (!this.apiKeyName) { this.apiKeyName = ''; }\n\n if (!this.oauthReceiver) { this.oauthReceiver = 'oauth-receiver.html'; }\n if (!this.sortTags || !'true, false,'.includes(`${this.sortTags},`)) { this.sortTags = 'false'; }\n if (!this.sortEndpointsBy || !'method, path, summary,'.includes(`${this.sortEndpointsBy},`)) { this.sortEndpointsBy = 'path'; }\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n if (!this.matchPaths) { this.matchPaths = ''; }\n if (!this.removeEndpointsWithBadgeLabelAs) { this.removeEndpointsWithBadgeLabelAs = ''; }\n\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n if (!this.fetchCredentials || !'omit, same-origin, include,'.includes(`${this.fetchCredentials},`)) { this.fetchCredentials = ''; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n }\n\n render() {\n return mainBodyTemplate.call(this, true, this.pathsExpanded);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n }, 0);\n }\n }\n if (name === 'match-paths' || name === 'match-type' || name === 'remove-endpoints-with-badge-label-as') {\n if (oldVal !== newVal) {\n window.setTimeout(async () => {\n await this.loadSpec(this.specUrl);\n }, 0);\n }\n }\n if (name === 'api-key-name' || name === 'api-key-location' || name === 'api-key-value') {\n let updateSelectedApiKey = false;\n let apiKeyName = '';\n let apiKeyLocation = '';\n let apiKeyValue = '';\n\n if (name === 'api-key-name') {\n if (this.getAttribute('api-key-location') && this.getAttribute('api-key-value')) {\n apiKeyName = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-location') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-value')) {\n apiKeyLocation = newVal;\n apiKeyName = this.getAttribute('api-key-name');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-value') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-location')) {\n apiKeyValue = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyName = this.getAttribute('api-key-name');\n updateSelectedApiKey = true;\n }\n }\n\n if (updateSelectedApiKey) {\n if (this.resolvedSpec) {\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => v.securitySchemeId === rapidocApiKey);\n if (!rapiDocApiKey) {\n this.resolvedSpec.securitySchemes.push({\n apiKeyId: rapidocApiKey,\n description: 'api-key provided in rapidoc element attributes',\n type: 'apiKey',\n name: apiKeyName,\n in: apiKeyLocation,\n value: apiKeyValue,\n finalKeyValue: apiKeyValue,\n });\n } else {\n rapiDocApiKey.name = apiKeyName;\n rapiDocApiKey.in = apiKeyLocation;\n rapiDocApiKey.value = apiKeyValue;\n rapiDocApiKey.finalKeyValue = apiKeyValue;\n }\n this.requestUpdate();\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSpecUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n this.requestUpdate();\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.sortSchemas === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('api-key-name'),\n this.getAttribute('api-key-location'),\n this.getAttribute('api-key-value'),\n this.getAttribute('server-url'),\n this.matchPaths,\n this.matchType,\n this.removeEndpointsWithBadgeLabelAs,\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n // Public Method - to update security-scheme of type http\n setHttpUserNameAndPassword(securitySchemeId, username, password) {\n return applyApiKey.call(this, securitySchemeId, username, password);\n }\n\n // Public Method - to update security-scheme of type apiKey or OAuth\n setApiKey(securitySchemeId, apiKeyValue) {\n return applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n\n // Public Method\n removeAllSecurityKeys() {\n return onClearAllApiKeys.call(this);\n }\n\n // Public Method\n setApiServer(apiServerUrl) {\n // return apiServerUrl;\n return setApiServer.call(this, apiServerUrl);\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n this.selectedServer = undefined;\n if (this.defaultApiServerUrl) {\n if (this.defaultApiServerUrl === this.serverUrl) {\n this.selectedServer = {\n url: this.serverUrl,\n computedUrl: this.serverUrl,\n };\n } else if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers.find((v) => (v.url === this.defaultApiServerUrl));\n }\n }\n if (!this.selectedServer) {\n if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers[0]; // eslint-disable-line prefer-destructuring\n }\n }\n this.requestUpdate();\n // eslint-disable-next-line no-await-in-loop\n while (!await this.updateComplete);\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n }\n }\n}\ncustomElements.define('rapi-doc-mini', RapiDocMini);\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\n// Templates\nimport overviewTemplate from '~/templates/overview-template';\nimport headerTemplate from '~/templates/header-template';\nimport { schemaInObjectNotation, generateExample, standardizeExample } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport SetTheme from '~/utils/theme';\nimport { isValidHexColor } from '~/utils/color-utils';\n\n/* eslint-disable indent */\n// Json Schema Nav Template\nfunction jsonSchemaNavTemplate() {\n return html`\n \n `;\n}\n\n// Json Schema Body Template\nfunction jsonSchemaBodyTemplate() {\n return html`\n ${this.showInfo === 'true' ? overviewTemplate.call(this) : ''}\n
\n ${this.resolvedSpec.schemaAndExamples.map((jSchemaBody) => {\n const examplesObj = generateExample(jSchemaBody.schema, 'json', standardizeExample(jSchemaBody.examples), standardizeExample(jSchemaBody.example), true, false, 'json', true);\n jSchemaBody.selectedExample = examplesObj[0]?.exampleId;\n return html`\n
\n
\n
${jSchemaBody.name}
\n ${unsafeHTML(marked(jSchemaBody.description || ''))}\n
\n
\n
\n \n
\n
\n ${examplesObj.length > 1\n ? html``\n : html`
${examplesObj[0].exampleSummary}
`\n }\n ${examplesObj.map((v) => html`\n `)\n }\n
\n
\n
`;\n })\n }\n
\n `;\n}\n/* eslint-enable indent */\n\n// Json Schema Root Template\nexport default function jsonSchemaViewerTemplate(isMini = false) {\n// export default function jsonSchemaViewerTemplate(isMini = false, pathsExpanded = false) {\n if (!this.resolvedSpec) {\n return '';\n }\n const newTheme = {\n bg1: isValidHexColor(this.bgColor) ? this.bgColor : '',\n fg1: isValidHexColor(this.textColor) ? this.textColor : '',\n headerColor: isValidHexColor(this.headerColor) ? this.headerColor : '',\n primaryColor: isValidHexColor(this.primaryColor) ? this.primaryColor : '',\n navBgColor: isValidHexColor(this.navBgColor) ? this.navBgColor : '',\n navTextColor: isValidHexColor(this.navTextColor) ? this.navTextColor : '',\n navHoverBgColor: isValidHexColor(this.navHoverBgColor) ? this.navHoverBgColor : '',\n navHoverTextColor: isValidHexColor(this.navHoverTextColor) ? this.navHoverTextColor : '',\n navAccentColor: isValidHexColor(this.navAccentColor) ? this.navAccentColor : '',\n navAccenttextColor: isValidHexColor(this.navAccentTextColor) ? this.navAccentTextColor : '',\n };\n /* eslint-disable indent */\n if (this.resolvedSpec.specLoadError) {\n if (isMini) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
${this.resolvedSpec.info.description}
\n `;\n }\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n \n ${headerTemplate.call(this)}\n

Header

\n
\n \n
\n

${this.resolvedSpec.info.title}

\n
${this.resolvedSpec.info.description}
\n
\n
\n `;\n }\n if (this.resolvedSpec.isSpecLoading) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
\n \n
\n
\n
\n
\n `;\n }\n\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n\n \n ${this.showHeader === 'false' ? '' : headerTemplate.call(this)}\n \n
\n\n \n ${jsonSchemaNavTemplate.call(this)}\n\n \n
\n \n
\n ${this.loading === true\n ? html`
`\n : html`\n ${this.loadFailed === true\n ? html`
Unable to load the Spec
`\n : html`\n
{ this.handleHref(e); }}\">\n ${jsonSchemaBodyTemplate.call(this)}\n
\n `\n }`\n }\n
\n \n
\n
\n `;\n}\n/* eslint-enable indent */\n","import { css, LitElement } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\n\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport ProcessSpec from '~/utils/spec-parser';\nimport jsonSchemaViewerTemplate from '~/templates/json-schema-viewer-template';\n\nexport default class JsonSchemaViewer extends LitElement {\n constructor() {\n super();\n this.isMini = false;\n this.updateRoute = 'false';\n this.renderStyle = 'focused';\n this.showHeader = 'true';\n this.allowAdvancedSearch = 'false';\n this.selectedExampleForEachSchema = {};\n }\n\n static get properties() {\n return {\n // Spec\n specUrl: { type: String, attribute: 'spec-url' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n\n // Hide/show Sections\n showHeader: { type: String, attribute: 'show-header' },\n showSideNav: { type: String, attribute: 'show-side-nav' },\n showInfo: { type: String, attribute: 'show-info' },\n\n // Allow or restrict features\n allowSpecUrlLoad: { type: String, attribute: 'allow-spec-url-load' },\n allowSpecFileLoad: { type: String, attribute: 'allow-spec-file-load' },\n allowSpecFileDownload: { type: String, attribute: 'allow-spec-file-download' },\n allowSearch: { type: String, attribute: 'allow-search' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n container-type: inline-size;\n }\n .body {\n display:flex;\n height:100%;\n width:100%;\n overflow:hidden;\n }\n .nav-bar {\n width: 230px;\n display:flex;\n }\n\n .main-content { \n margin:0;\n padding: 16px; \n display:block;\n flex:1;\n height:100%;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) transparent;\n }\n .main-content-inner--view-mode {\n padding: 0 8px;\n }\n .main-content::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n .main-content::-webkit-scrollbar-track {\n background:transparent;\n }\n .main-content::-webkit-scrollbar-thumb {\n background-color: var(--border-color);\n }\n .main-header {\n background-color:var(--header-bg);\n color:var(--header-fg);\n width:100%;\n }\n .header-title {\n font-size:calc(var(--font-size-regular) + 8px); \n padding:0 8px;\n }\n input.header-input{\n background:var(--header-color-darker);\n color:var(--header-fg);\n border:1px solid var(--header-color-border);\n flex:1; \n padding-right:24px;\n border-radius:3px;\n }\n input.header-input::placeholder {\n opacity:0.4;\n }\n .loader {\n margin: 16px auto 16px auto; \n border: 4px solid var(--bg3);\n border-radius: 50%;\n border-top: 4px solid var(--primary-color);\n width: 36px;\n height: 36px;\n animation: spin 2s linear infinite;\n }\n @container (min-width: 768px) {\n .only-large-screen{\n display:block;\n }\n .only-large-screen-flex {\n display:flex;\n }\n }`,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n const parent = this.parentElement;\n if (parent) {\n if (parent.offsetWidth === 0 && parent.style.width === '') {\n parent.style.width = '100vw';\n }\n if (parent.offsetHeight === 0 && parent.style.height === '') {\n parent.style.height = '100vh';\n }\n if (parent.tagName === 'BODY') {\n if (!parent.style.marginTop) { parent.style.marginTop = '0'; }\n if (!parent.style.marginRight) { parent.style.marginRight = '0'; }\n if (!parent.style.marginBottom) { parent.style.marginBottom = '0'; }\n if (!parent.style.marginLeft) { parent.style.marginLeft = '0'; }\n }\n }\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n this.renderStyle = 'focused';\n this.pathsExpanded = this.pathsExpanded === 'true';\n\n if (!this.showInfo || !'true, false,'.includes(`${this.showInfo},`)) { this.showInfo = 'true'; }\n if (!this.showSideNav || !'true false'.includes(this.showSideNav)) { this.showSideNav = 'true'; }\n if (!this.showHeader || !'true, false,'.includes(`${this.showHeader},`)) { this.showHeader = 'true'; }\n\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.allowSearch || !'true, false,'.includes(`${this.allowSearch},`)) { this.allowSearch = 'true'; }\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n }\n\n render() {\n return jsonSchemaViewerTemplate.call(this, true, false, false, this.pathsExpanded);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n }, 0);\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSpecUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n onSearchChange(e) {\n // Todo: Filter Search\n this.matchPaths = e.target.value;\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n this.requestUpdate();\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.sortSchemas === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('match-paths'),\n this.getAttribute('match-type'),\n this.getAttribute('remove-endpoints-with-badge-label-as'),\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n }\n }\n\n // Example Dropdown @change Handler\n onSelectExample(e) {\n const exampleContainerEl = e.target.closest('.json-schema-example-panel');\n const exampleEls = [...exampleContainerEl.querySelectorAll('.example')];\n exampleEls.forEach((v) => {\n v.style.display = v.dataset.example === e.target.value ? 'flex' : 'none';\n });\n }\n\n async scrollToEventTarget(event) {\n const navEl = event.currentTarget;\n if (!navEl.dataset.contentId) {\n return;\n }\n const contentEl = this.shadowRoot.getElementById(navEl.dataset.contentId);\n if (contentEl) {\n contentEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n}\ncustomElements.define('json-schema-viewer', JsonSchemaViewer);\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"rapidoc-min.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDA;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;ACKA;;ACKA;ACoRA;AACA;AACA;AAGA;AAIA;AAIA;AAGA;;;AAIA;;AAEA;AACA;AACA;AACA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","sources":["webpack://rapidoc/./src/styles/input-styles.js","webpack://rapidoc/./src/styles/flex-styles.js","webpack://rapidoc/./src/styles/table-styles.js","webpack://rapidoc/./src/styles/endpoint-styles.js","webpack://rapidoc/./src/styles/prism-styles.js","webpack://rapidoc/./src/styles/tab-styles.js","webpack://rapidoc/./src/styles/nav-styles.js","webpack://rapidoc/./src/styles/info-styles.js","webpack://rapidoc/./src/styles/custom-styles.js","webpack://rapidoc/./src/utils/common-utils.js","webpack://rapidoc/./src/templates/security-scheme-template.js","webpack://rapidoc/./src/templates/code-samples-template.js","webpack://rapidoc/./src/templates/callback-template.js","webpack://rapidoc/./src/components/json-tree.js","webpack://rapidoc/./src/components/schema-tree.js","webpack://rapidoc/./src/components/tag-input.js","webpack://rapidoc/./src/components/api-request.js","webpack://rapidoc/./src/utils/schema-utils.js","webpack://rapidoc/./src/components/schema-table.js","webpack://rapidoc/./src/templates/expanded-endpoint-template.js","webpack://rapidoc/./src/templates/components-template.js","webpack://rapidoc/./src/templates/overview-template.js","webpack://rapidoc/./src/templates/server-template.js","webpack://rapidoc/./src/templates/navbar-template.js","webpack://rapidoc/./src/templates/focused-endpoint-template.js","webpack://rapidoc/./src/templates/endpoint-template.js","webpack://rapidoc/./src/templates/logo-template.js","webpack://rapidoc/./src/templates/header-template.js","webpack://rapidoc/./src/components/api-response.js","webpack://rapidoc/./src/templates/advance-search-template.js","webpack://rapidoc/./src/components/dialog-box.js","webpack://rapidoc/./src/utils/theme.js","webpack://rapidoc/./src/templates/main-body-template.js","webpack://rapidoc/./src/rapidoc.js","webpack://rapidoc/./src/rapidoc-mini.js","webpack://rapidoc/./src/templates/json-schema-viewer-template.js","webpack://rapidoc/./src/json-schema-viewer.js"],"sourcesContent":["import { css } from 'lit';\n\n/* eslint-disable max-len */\nexport default css`\n/* Button */\n.m-btn {\n border-radius: var(--border-radius);\n font-weight: 600;\n display: inline-block;\n padding: 6px 16px;\n font-size: var(--font-size-small);\n outline: 0;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n border: 2px solid var(--primary-color);\n background-color:transparent;\n user-select: none;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);\n transition-duration: 0.75s;\n}\n.m-btn.primary {\n background-color: var(--primary-color);\n color: var(--primary-color-invert);\n}\n.m-btn.thin-border { border-width: 1px; }\n.m-btn.large { padding:8px 14px; }\n.m-btn.small { padding:5px 12px; }\n.m-btn.tiny { padding:5px 6px; }\n.m-btn.circle { border-radius: 50%; }\n.m-btn:hover { \n background-color: var(--primary-color);\n color: var(--primary-color-invert);\n}\n.m-btn.nav { border: 2px solid var(--nav-accent-color); }\n.m-btn.nav:hover { \n background-color: var(--nav-accent-color);\n}\n.m-btn:disabled { \n background-color: var(--bg3);\n color: var(--fg3);\n border-color: var(--fg3);\n cursor: not-allowed;\n opacity: 0.4;\n}\n.m-btn:active {\n filter: brightness(75%);\n transform: scale(0.95);\n transition:scale 0s;\n}\n.toolbar-btn {\n cursor: pointer;\n padding: 4px;\n margin:0 2px;\n font-size: var(--font-size-small);\n min-width: 50px;\n color: var(--primary-color-invert);\n border-radius: 2px;\n border: none;\n background-color: var(--primary-color);\n}\n\ninput, textarea, select, button, pre {\n color:var(--fg);\n outline: none;\n background-color: var(--input-bg);\n border: 1px solid var(--border-color);\n border-radius: var(--border-radius);\n}\nbutton {\n font-family: var(--font-regular);\n}\n\n/* Form Inputs */\npre,\nselect,\ntextarea,\ninput[type=\"file\"],\ninput[type=\"text\"],\ninput[type=\"password\"] {\n font-family: var(--font-mono);\n font-weight: 400;\n font-size: var(--font-size-small);\n transition: border .2s;\n padding: 6px 5px;\n}\n\nselect {\n font-family: var(--font-regular);\n padding: 5px 30px 5px 5px;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%3E%3Cpath%20d%3D%22M10.3%203.3L6%207.6%201.7%203.3A1%201%200%2000.3%204.7l5%205a1%201%200%20001.4%200l5-5a1%201%200%2010-1.4-1.4z%22%20fill%3D%22%23777777%22%2F%3E%3C%2Fsvg%3E\"); \n background-position: calc(100% - 5px) center;\n background-repeat: no-repeat; \n background-size: 10px;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n cursor: pointer;\n}\n\nselect:hover {\n border-color: var(--primary-color);\n}\n\ntextarea::placeholder,\ninput[type=\"text\"]::placeholder,\ninput[type=\"password\"]::placeholder {\n color: var(--placeholder-color);\n opacity:1;\n}\n\n\ninput[type=\"file\"]{\n font-family: var(--font-regular);\n padding:2px;\n cursor:pointer;\n border: 1px solid var(--primary-color);\n min-height: calc(var(--font-size-small) + 18px);\n}\n\ninput[type=\"file\"]::-webkit-file-upload-button {\n font-family: var(--font-regular);\n font-size: var(--font-size-small);\n outline: none;\n cursor:pointer;\n padding: 3px 8px;\n border: 1px solid var(--primary-color);\n background-color: var(--primary-color);\n color: var(--primary-color-invert);\n border-radius: var(--border-radius);;\n -webkit-appearance: none;\n}\n\npre,\ntextarea {\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) var(--input-bg);\n}\n\npre::-webkit-scrollbar,\ntextarea::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\npre::-webkit-scrollbar-track,\ntextarea::-webkit-scrollbar-track {\n background:var(--input-bg);\n}\n \npre::-webkit-scrollbar-thumb,\ntextarea::-webkit-scrollbar-thumb {\n border-radius: 2px;\n background-color: var(--border-color);\n}\n\n.link {\n font-size:var(--font-size-small);\n text-decoration: underline;\n color:var(--blue);\n font-family:var(--font-mono);\n margin-bottom:2px;\n}\n\n/* Toggle Body */\ninput[type=\"checkbox\"] {\n appearance: none;\n display: inline-block;\n background-color: var(--light-bg);\n border: 1px solid var(--light-bg);\n border-radius: 9px;\n cursor: pointer;\n height: 18px;\n position: relative;\n transition: border .25s .15s, box-shadow .25s .3s, padding .25s;\n min-width: 36px;\n width: 36px;\n vertical-align: top;\n}\n/* Toggle Thumb */\ninput[type=\"checkbox\"]:after {\n position: absolute;\n background-color: var(--bg);\n border: 1px solid var(--light-bg);\n border-radius: 8px;\n content: '';\n top: 0px;\n left: 0px;\n right: 16px;\n display: block;\n height: 16px;\n transition: border .25s .15s, left .25s .1s, right .15s .175s;\n}\n\n/* Toggle Body - Checked */\ninput[type=\"checkbox\"]:checked {\n background-color: var(--green);\n border-color: var(--green);\n}\n/* Toggle Thumb - Checked*/\ninput[type=\"checkbox\"]:checked:after {\n border: 1px solid var(--green);\n left: 16px;\n right: 1px;\n transition: border .25s, left .15s .25s, right .25s .175s;\n}`;\n","import { css } from 'lit';\n\nexport default css`\n.row, .col {\n display:flex;\n} \n.row {\n align-items:center;\n flex-direction: row;\n}\n.col {\n align-items:stretch;\n flex-direction: column;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.m-table {\n border-spacing: 0; \n border-collapse: separate;\n border: 1px solid var(--light-border-color);\n border-radius: var(--border-radius);\n margin: 0;\n max-width: 100%;\n direction: ltr;\n}\n.m-table tr:first-child td,\n.m-table tr:first-child th {\n border-top: 0 none;\n}\n.m-table td, \n.m-table th {\n font-size: var(--font-size-small);\n line-height: calc(var(--font-size-small) + 4px);\n padding: 4px 5px 4px;\n vertical-align: top;\n}\n\n.m-table.padded-12 td, \n.m-table.padded-12 th {\n padding: 12px;\n}\n\n.m-table td:not([align]), \n.m-table th:not([align]) {\n text-align: left;\n}\n\n.m-table th {\n color: var(--fg2);\n font-size: var(--font-size-small);\n line-height: calc(var(--font-size-small) + 18px);\n font-weight: 600;\n letter-spacing: normal;\n background-color: var(--bg2);\n vertical-align: bottom;\n border-bottom: 1px solid var(--light-border-color);\n}\n\n.m-table > tbody > tr > td,\n.m-table > tr > td {\n border-top: 1px solid var(--light-border-color);\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.table-title {\n font-size:var(--font-size-small);\n font-weight:bold;\n vertical-align: middle;\n margin: 12px 0 4px 0;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n:host {\n container-type: inline-size;\n}\n.only-large-screen { display:none; }\n.endpoint-head .path {\n display: flex;\n font-family:var(--font-mono);\n font-size: var(--font-size-small);\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-all;\n}\n\n.endpoint-head .descr {\n font-size: var(--font-size-small);\n color:var(--light-fg);\n font-weight:400;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-all;\n display:none;\n}\n\n.m-endpoint.expanded { margin-bottom:16px; }\n.m-endpoint > .endpoint-head{\n border-width:1px 1px 1px 5px;\n border-style:solid;\n border-color:transparent;\n border-top-color:var(--light-border-color);\n display:flex;\n padding:6px 16px;\n align-items: center;\n cursor: pointer;\n}\n.m-endpoint > .endpoint-head.put:hover,\n.m-endpoint > .endpoint-head.put.expanded {\n border-color:var(--orange); \n background-color:var(--light-orange); \n}\n.m-endpoint > .endpoint-head.post:hover,\n.m-endpoint > .endpoint-head.post.expanded {\n border-color:var(--green); \n background-color:var(--light-green); \n}\n.m-endpoint > .endpoint-head.get:hover,\n.m-endpoint > .endpoint-head.get.expanded {\n border-color:var(--blue); \n background-color:var(--light-blue); \n}\n.m-endpoint > .endpoint-head.delete:hover,\n.m-endpoint > .endpoint-head.delete.expanded {\n border-color:var(--red); \n background-color:var(--light-red); \n}\n\n.m-endpoint > .endpoint-head.head:hover,\n.m-endpoint > .endpoint-head.head.expanded,\n.m-endpoint > .endpoint-head.patch:hover,\n.m-endpoint > .endpoint-head.patch.expanded,\n.m-endpoint > .endpoint-head.options:hover,\n.m-endpoint > .endpoint-head.options.expanded {\n border-color:var(--yellow); \n background-color:var(--light-yellow); \n}\n\n.m-endpoint > .endpoint-head.deprecated:hover,\n.m-endpoint > .endpoint-head.deprecated.expanded {\n border-color:var(--border-color); \n filter:opacity(0.6);\n}\n\n.m-endpoint .endpoint-body {\n flex-wrap:wrap;\n padding:16px 0px 0 0px;\n border-width:0px 1px 1px 5px;\n border-style:solid;\n box-shadow: 0px 4px 3px -3px rgba(0, 0, 0, 0.15);\n}\n.m-endpoint .endpoint-body.delete{ border-color:var(--red); }\n.m-endpoint .endpoint-body.put{ border-color:var(--orange); }\n.m-endpoint .endpoint-body.post { border-color:var(--green); }\n.m-endpoint .endpoint-body.get { border-color:var(--blue); }\n.m-endpoint .endpoint-body.head,\n.m-endpoint .endpoint-body.patch,\n.m-endpoint .endpoint-body.options { \n border-color:var(--yellow); \n}\n\n.m-endpoint .endpoint-body.deprecated { \n border-color:var(--border-color);\n filter:opacity(0.6);\n}\n\n.endpoint-head .deprecated {\n color: var(--light-fg);\n filter:opacity(0.6);\n}\n\n.summary{\n padding:8px 8px;\n}\n.summary .title {\n font-size:calc(var(--font-size-regular) + 2px);\n margin-bottom: 6px;\n word-break: break-all;\n}\n\n.endpoint-head .method {\n padding:2px 5px;\n vertical-align: middle;\n font-size:var(--font-size-small);\n height: calc(var(--font-size-small) + 16px);\n line-height: calc(var(--font-size-small) + 8px);\n width: 60px;\n border-radius: 2px;\n display:inline-block;\n text-align: center;\n font-weight: bold;\n text-transform:uppercase;\n margin-right:5px;\n}\n.endpoint-head .method.delete{ border: 2px solid var(--red);}\n.endpoint-head .method.put{ border: 2px solid var(--orange); }\n.endpoint-head .method.post{ border: 2px solid var(--green); }\n.endpoint-head .method.get{ border: 2px solid var(--blue); }\n.endpoint-head .method.get.deprecated{ border: 2px solid var(--border-color); }\n.endpoint-head .method.head,\n.endpoint-head .method.patch,\n.endpoint-head .method.options { \n border: 2px solid var(--yellow); \n}\n\n.req-resp-container {\n display: flex;\n margin-top:16px;\n align-items: stretch;\n flex-wrap: wrap;\n flex-direction: column;\n border-top:1px solid var(--light-border-color);\n}\n\n.view-mode-request,\napi-response.view-mode {\n flex:1; \n min-height:100px;\n padding:16px 8px;\n overflow:hidden;\n}\n.view-mode-request {\n border-width:0 0 1px 0;\n border-style:dashed;\n}\n\n.head .view-mode-request,\n.patch .view-mode-request,\n.options .view-mode-request { \n border-color:var(--yellow); \n}\n.put .view-mode-request { \n border-color:var(--orange); \n}\n.post .view-mode-request { \n border-color:var(--green); \n}\n.get .view-mode-request { \n border-color:var(--blue); \n}\n.delete .view-mode-request { \n border-color:var(--red); \n}\n\n@container (min-width: 1024px) {\n .only-large-screen { display:block; }\n .endpoint-head .path{\n font-size: var(--font-size-regular);\n }\n .endpoint-head .descr{\n display: flex;\n }\n .endpoint-head .m-markdown-small,\n .descr .m-markdown-small{\n display:block;\n }\n .req-resp-container{\n flex-direction: var(--layout, row);\n flex-wrap: nowrap;\n }\n api-response.view-mode {\n padding:16px;\n }\n .view-mode-request.row-layout {\n border-width:0 1px 0 0;\n padding:16px;\n }\n .summary{\n padding:8px 16px;\n }\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n text-align: left;\n white-space: pre;\n word-spacing: normal;\n word-break: normal;\n word-wrap: normal;\n line-height: 1.5;\n tab-size: 2;\n\n -webkit-hyphens: none;\n -moz-hyphens: none;\n -ms-hyphens: none;\n hyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n padding: 1em;\n margin: .5em 0;\n overflow: auto;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n white-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n color: var(--light-fg)\n}\n\n.token.punctuation {\n color: var(--fg);\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n color:var(--pink);\n}\n\n.token.function-name {\n color: var(--blue);\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n color: var(--red);\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n color: var(--code-property-color);\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n color: var(--code-keyword-color);\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable { \n color: var(--green);\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n color: var(--code-operator-color);\n}\n\n.token.important,\n.token.bold {\n font-weight: bold;\n}\n.token.italic {\n font-style: italic;\n}\n\n.token.entity {\n cursor: help;\n}\n\n.token.inserted {\n color: green;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.tab-panel {\n border: none;\n}\n.tab-buttons {\n height:30px;\n padding: 4px 4px 0 4px;\n border-bottom: 1px solid var(--light-border-color) ;\n align-items: stretch;\n overflow-y: hidden;\n overflow-x: auto;\n scrollbar-width: thin;\n}\n.tab-buttons::-webkit-scrollbar {\n height: 1px;\n background-color: var(--border-color);\n}\n.tab-btn {\n border: none;\n border-bottom: 3px solid transparent; \n color: var(--light-fg);\n background-color: transparent;\n white-space: nowrap;\n cursor:pointer;\n outline:none;\n font-family:var(--font-regular); \n font-size:var(--font-size-small);\n margin-right:16px;\n padding:1px;\n}\n.tab-btn.active {\n border-bottom: 3px solid var(--primary-color); \n font-weight:bold;\n color:var(--primary-color);\n}\n\n.tab-btn:hover {\n color:var(--primary-color);\n}\n.tab-content {\n margin:-1px 0 0 0;\n position:relative;\n min-height: 50px;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.nav-bar-info:focus-visible,\n.nav-bar-tag:focus-visible,\n.nav-bar-path:focus-visible {\n outline: 1px solid;\n box-shadow: none;\n outline-offset: -4px;\n}\n.nav-bar-expand-all:focus-visible,\n.nav-bar-collapse-all:focus-visible,\n.nav-bar-tag-icon:focus-visible {\n outline: 1px solid;\n box-shadow: none;\n outline-offset: 2px;\n}\n.nav-bar {\n width:0;\n height:100%;\n overflow: hidden;\n color:var(--nav-text-color);\n background-color: var(--nav-bg-color);\n background-blend-mode: multiply;\n line-height: calc(var(--font-size-small) + 4px);\n display:none;\n position:relative;\n flex-direction:column;\n flex-wrap:nowrap;\n word-break:break-word;\n}\n::slotted([slot=nav-logo]) {\n padding:16px 16px 0 16px;\n}\n.nav-scroll {\n overflow-x: hidden;\n overflow-y: auto;\n overflow-y: overlay;\n scrollbar-width: thin;\n scrollbar-color: var(--nav-hover-bg-color) transparent;\n}\n\n.nav-bar-tag {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-direction: row;\n}\n.nav-bar.read .nav-bar-tag-icon {\n display:none;\n}\n.nav-bar-paths-under-tag {\n overflow:hidden;\n transition: max-height .2s ease-out, visibility .3s;\n}\n.collapsed .nav-bar-paths-under-tag {\n visibility: hidden;\n}\n\n.nav-bar-expand-all {\n transform: rotate(90deg); \n cursor:pointer; \n margin-right:10px;\n}\n.nav-bar-collapse-all {\n transform: rotate(270deg); \n cursor:pointer;\n}\n.nav-bar-expand-all:hover, .nav-bar-collapse-all:hover {\n color: var(--primary-color);\n}\n\n.nav-bar-tag-icon {\n color: var(--nav-text-color);\n font-size: 20px; \n}\n.nav-bar-tag-icon:hover {\n color:var(--nav-hover-text-color);\n}\n.nav-bar.focused .nav-bar-tag-and-paths.collapsed .nav-bar-tag-icon::after {\n content: '⌵';\n width:16px;\n height:16px;\n text-align: center;\n display: inline-block;\n transform: rotate(-90deg);\n transition: transform 0.2s ease-out 0s;\n}\n.nav-bar.focused .nav-bar-tag-and-paths.expanded .nav-bar-tag-icon::after {\n content: '⌵';\n width:16px;\n height:16px;\n text-align: center;\n display: inline-block;\n transition: transform 0.2s ease-out 0s;\n}\n.nav-scroll::-webkit-scrollbar {\n width: var(--scroll-bar-width, 8px);\n}\n.nav-scroll::-webkit-scrollbar-track {\n background:transparent;\n}\n.nav-scroll::-webkit-scrollbar-thumb {\n background-color: var(--nav-hover-bg-color);\n}\n\n.nav-bar-tag {\n font-size: var(--font-size-regular);\n color: var(--nav-accent-color);\n border-left:4px solid transparent;\n font-weight:bold;\n padding: 15px 15px 15px 10px;\n text-transform: capitalize;\n}\n\n.nav-bar-components,\n.nav-bar-h1,\n.nav-bar-h2,\n.nav-bar-info,\n.nav-bar-tag,\n.nav-bar-path {\n display:flex;\n cursor: pointer;\n width: 100%;\n border: none;\n border-radius:4px; \n color: var(--nav-text-color);\n background: transparent;\n border-left:4px solid transparent;\n}\n\n.nav-bar-h1,\n.nav-bar-h2,\n.nav-bar-path {\n font-size: calc(var(--font-size-small) + 1px);\n padding: var(--nav-item-padding);\n}\n.nav-bar-path.small-font {\n font-size: var(--font-size-small);\n}\n\n.nav-bar-info {\n font-size: var(--font-size-regular);\n padding: 16px 10px;\n font-weight:bold;\n}\n.nav-bar-section {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n font-size: var(--font-size-small);\n color: var(--nav-text-color);\n padding: var(--nav-item-padding);\n font-weight:bold;\n}\n.nav-bar-section.operations {\n cursor:pointer;\n}\n.nav-bar-section.operations:hover {\n color:var(--nav-hover-text-color);\n background-color:var(--nav-hover-bg-color);\n}\n\n.nav-bar-section:first-child {\n display: none;\n}\n.nav-bar-h2 {margin-left:12px;}\n\n.nav-bar-h1.left-bar.active,\n.nav-bar-h2.left-bar.active,\n.nav-bar-info.left-bar.active,\n.nav-bar-tag.left-bar.active,\n.nav-bar-path.left-bar.active,\n.nav-bar-section.left-bar.operations.active {\n border-left:4px solid var(--nav-accent-color);\n color:var(--nav-hover-text-color);\n}\n\n.nav-bar-h1.colored-block.active,\n.nav-bar-h2.colored-block.active,\n.nav-bar-info.colored-block.active,\n.nav-bar-tag.colored-block.active,\n.nav-bar-path.colored-block.active,\n.nav-bar-section.colored-block.operations.active {\n background-color: var(--nav-accent-color);\n color: var(--nav-accent-text-color);\n border-radius: 0;\n}\n\n.nav-bar-h1:hover,\n.nav-bar-h2:hover,\n.nav-bar-info:hover,\n.nav-bar-tag:hover,\n.nav-bar-path:hover {\n color:var(--nav-hover-text-color);\n background-color:var(--nav-hover-bg-color);\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n#api-info {\n font-size: calc(var(--font-size-regular) - 1px);\n margin-top: 8px;\n margin-left: -15px;\n}\n\n#api-info span:before {\n content: \"|\";\n display: inline-block;\n opacity: 0.5;\n width: 15px;\n text-align: center;\n}\n#api-info span:first-child:before {\n content: \"\";\n width: 0px;\n}\n`;\n","import { css } from 'lit';\n\n/*\nThis file is reserved for any custom css that developers want to add to\ncustomize their theme. Simply add your css to this file and yarn build.\n*/\n\nexport default css`\n\n`;\n","/* For Delayed Event Handler Execution */\nexport function debounce(fn, delay) {\n let timeoutID = null;\n return (...args) => {\n clearTimeout(timeoutID);\n const that = this;\n timeoutID = setTimeout(() => {\n fn.apply(that, args);\n }, delay);\n };\n}\n\nexport const invalidCharsRegEx = /[\\s#:?&={}]/g; // used for generating valid html element ids by replacing the invalid chars with hyphen (-)\nexport const rapidocApiKey = '_rapidoc_api_key';\n\nexport function sleep(ms) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function copyToClipboard(data, e) {\n const btnEl = e.target;\n const textArea = document.createElement('textarea');\n textArea.value = data;\n textArea.style.position = 'fixed'; // avoid scrolling to bottom\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n try {\n document.execCommand('copy');\n btnEl.innerText = 'Copied';\n setTimeout(() => {\n btnEl.innerText = 'Copy';\n }, 5000);\n } catch (err) {\n console.error('Unable to copy', err); // eslint-disable-line no-console\n }\n document.body.removeChild(textArea);\n}\n\nexport function getBaseUrlFromUrl(url) {\n const pathArray = url.split('/');\n return `${pathArray[0]}//${pathArray[2]}`;\n}\n\nexport async function wait(ms) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport function getMatchedComponents(searchVal, component) {\n return component.name.toLowerCase().includes(searchVal.toLowerCase());\n}\n\nexport function getMatchedPaths(searchVal, path, tagName = '') {\n const stringToSearch = `${path.method} ${path.path} ${path.summary || ''} ${path.description || ''} ${path.operationId || ''} ${tagName}`.toLowerCase();\n return stringToSearch.includes(searchVal.toLowerCase());\n}\n\nexport function schemaKeys(schemaProps, result = new Set()) {\n if (!schemaProps) {\n return result;\n }\n Object.keys(schemaProps).forEach((key) => {\n result.add(key);\n if (schemaProps[key].properties) {\n schemaKeys(schemaProps[key].properties, result);\n } else if (schemaProps[key].items?.properties) {\n schemaKeys(schemaProps[key].items?.properties, result);\n }\n });\n return result;\n}\n\nexport function advancedSearch(searchVal, allSpecTags, searchOptions = []) {\n if (!searchVal.trim() || searchOptions.length === 0) {\n return;\n }\n\n const pathsMatched = [];\n allSpecTags.forEach((tag) => {\n tag.paths.forEach((path) => {\n let stringToSearch = '';\n if (searchOptions.includes('search-api-path')) {\n stringToSearch = path.path;\n }\n if (searchOptions.includes('search-api-descr')) {\n stringToSearch = `${stringToSearch} ${(path.summary || '') + (path.description || '')}`;\n }\n if (searchOptions.includes('search-api-params')) {\n stringToSearch = `${stringToSearch} ${path.parameters?.map((v) => v.name).join(' ') || ''}`;\n }\n\n if (searchOptions.includes('search-api-request-body') && path.requestBody) {\n let schemaKeySet = new Set();\n for (const contentType in path.requestBody?.content) {\n if (path.requestBody.content[contentType].schema?.properties) {\n schemaKeySet = schemaKeys(path.requestBody.content[contentType].schema?.properties);\n }\n stringToSearch = `${stringToSearch} ${[...schemaKeySet].join(' ')}`;\n }\n }\n\n if (searchOptions.includes('search-api-resp-descr')) {\n stringToSearch = `${stringToSearch} ${Object.values(path.responses).map((v) => v.description || '').join(' ')}`;\n }\n\n if (stringToSearch.toLowerCase().includes(searchVal.trim().toLowerCase())) {\n pathsMatched.push({\n elementId: path.elementId,\n method: path.method,\n path: path.path,\n summary: path.summary || path.description || '',\n deprecated: path.deprecated,\n });\n }\n });\n });\n return pathsMatched;\n}\n\n/*\nexport function prettyXml(sourceXmlString) {\n const xmlDoc = new DOMParser().parseFromString(sourceXmlString, 'text/xml');\n const xsltDoc = new DOMParser().parseFromString([\n // describes how we want to modify the XML - indent everything\n `\n \n \n \n \n \n \n \n \n `,\n ].join('\\n'), 'application/xml');\n const xsltProcessor = new XSLTProcessor();\n xsltProcessor.importStylesheet(xsltDoc);\n const resultDoc = xsltProcessor.transformToDocument(xmlDoc);\n return new XMLSerializer().serializeToString(resultDoc);\n}\n*/\n\nexport function downloadResource(url, fileName) {\n if (url) {\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.download = fileName;\n a.click();\n a.remove();\n }\n}\n\nexport function viewResource(url) {\n if (url) {\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.target = '_blank';\n a.click();\n a.remove();\n }\n}\n","/* eslint-disable arrow-body-style */\nimport { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\nconst codeVerifier = '731DB1C3F7EA533B85E29492D26AA-1234567890-1234567890';\nconst codeChallenge = '4FatVDBJKPAo4JgLLaaQFMUcQPn5CrPRvLlaob9PTYc'; // Base64 encoded SHA-256\n\nconst localStorageKey = 'rapidoc';\n\nexport function applyApiKey(securitySchemeId, username = '', password = '', providedApikeyVal = '') {\n const securityObj = this.resolvedSpec.securitySchemes?.find((v) => (v.securitySchemeId === securitySchemeId));\n if (!securityObj) {\n return false;\n }\n let finalApiKeyValue = '';\n if (securityObj.scheme?.toLowerCase() === 'basic') {\n if (username) {\n finalApiKeyValue = `Basic ${Buffer.from(`${username}:${password}`, 'utf8').toString('base64')}`;\n }\n } else if (providedApikeyVal) {\n securityObj.value = providedApikeyVal;\n finalApiKeyValue = `${securityObj.scheme?.toLowerCase() === 'bearer' ? 'Bearer ' : ''}${providedApikeyVal}`;\n }\n if (finalApiKeyValue) {\n securityObj.finalKeyValue = finalApiKeyValue;\n this.requestUpdate();\n return true;\n }\n return false;\n}\n\nexport function onClearAllApiKeys() {\n this.resolvedSpec.securitySchemes?.forEach((v) => {\n v.user = '';\n v.password = '';\n v.value = '';\n v.finalKeyValue = '';\n });\n this.requestUpdate();\n}\n\nfunction getPersistedApiKeys() {\n return JSON.parse(localStorage.getItem(localStorageKey)) || {};\n}\n\nfunction setPersistedApiKeys(obj) {\n localStorage.setItem(localStorageKey, JSON.stringify(obj));\n}\n\nexport function recoverPersistedApiKeys() {\n const rapidocLs = getPersistedApiKeys.call(this);\n Object.values(rapidocLs).forEach((p) => {\n applyApiKey.call(this, p.securitySchemeId, p.username, p.password, p.value);\n });\n}\n\nfunction onApiKeyChange(securitySchemeId) {\n let apiKeyValue = '';\n const securityObj = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === securitySchemeId));\n if (securityObj) {\n const trEl = this.shadowRoot.getElementById(`security-scheme-${securitySchemeId}`);\n if (trEl) {\n if (securityObj.type && securityObj.scheme && securityObj.type === 'http' && securityObj.scheme.toLowerCase() === 'basic') {\n const userVal = trEl.querySelector('.api-key-user').value.trim();\n const passwordVal = trEl.querySelector('.api-key-password').value.trim();\n applyApiKey.call(this, securitySchemeId, userVal, passwordVal);\n } else {\n apiKeyValue = trEl.querySelector('.api-key-input').value.trim();\n applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n if (this.persistAuth === 'true') {\n const rapidocLs = getPersistedApiKeys.call(this);\n rapidocLs[securitySchemeId] = securityObj;\n setPersistedApiKeys.call(this, rapidocLs);\n }\n }\n }\n}\n\n// Updates the OAuth Access Token (API key), so it reflects in UI and gets used in TRY calls\nfunction updateOAuthKey(securitySchemeId, accessToken, tokenType = 'Bearer') {\n const securityObj = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === securitySchemeId));\n securityObj.finalKeyValue = `${(tokenType.toLowerCase() === 'bearer' ? 'Bearer' : (tokenType.toLowerCase() === 'mac' ? 'MAC' : tokenType))} ${accessToken}`;\n this.requestUpdate();\n}\n\n/* eslint-disable no-console */\n// Gets Access-Token in exchange of Authorization Code\nasync function fetchAccessToken(tokenUrl, clientId, clientSecret, redirectUrl, grantType, authCode, securitySchemeId, authFlowDivEl, sendClientSecretIn = 'header', scopes = null, username = null, password = null) {\n const respDisplayEl = authFlowDivEl ? authFlowDivEl.querySelector('.oauth-resp-display') : undefined;\n const urlFormParams = new URLSearchParams();\n const headers = new Headers();\n urlFormParams.append('grant_type', grantType);\n if (grantType === 'authorization_code') {\n urlFormParams.append('client_id', clientId);\n urlFormParams.append('client_secret', clientSecret);\n }\n if (grantType !== 'client_credentials' && grantType !== 'password') {\n urlFormParams.append('redirect_uri', redirectUrl);\n }\n if (authCode) {\n urlFormParams.append('code', authCode);\n urlFormParams.append('code_verifier', codeVerifier); // for PKCE\n }\n if (sendClientSecretIn === 'header') {\n headers.set('Authorization', `Basic ${Buffer.from(`${clientId}:${clientSecret}`, 'utf8').toString('base64')}`);\n } else if (grantType !== 'authorization_code') {\n urlFormParams.append('client_id', clientId);\n urlFormParams.append('client_secret', clientSecret);\n }\n if (grantType === 'password') {\n urlFormParams.append('username', username);\n urlFormParams.append('password', password);\n }\n if (scopes) {\n urlFormParams.append('scope', scopes);\n }\n\n try {\n const resp = await fetch(tokenUrl, { method: 'POST', headers, body: urlFormParams });\n const tokenResp = await resp.json();\n if (resp.ok) {\n if (tokenResp.token_type && tokenResp.access_token) {\n updateOAuthKey.call(this, securitySchemeId, tokenResp.access_token, tokenResp.token_type);\n if (respDisplayEl) {\n respDisplayEl.innerHTML = 'Access Token Received';\n }\n return true;\n }\n } else {\n if (respDisplayEl) {\n respDisplayEl.innerHTML = `${tokenResp.error_description || tokenResp.error_description || 'Unable to get access token'}`;\n }\n return false;\n }\n } catch {\n if (respDisplayEl) {\n respDisplayEl.innerHTML = 'Failed to get access token';\n }\n return false;\n }\n}\n\n// Gets invoked when it receives the Authorization Code from the other window via message-event\nasync function onWindowMessageEvent(msgEvent, winObj, tokenUrl, clientId, clientSecret, redirectUrl, grantType, sendClientSecretIn, securitySchemeId, authFlowDivEl) {\n sessionStorage.removeItem('winMessageEventActive');\n winObj.close();\n if (msgEvent.data.fake) {\n return;\n }\n if (!msgEvent.data) {\n console.warn('RapiDoc: Received no data with authorization message');\n }\n if (msgEvent.data.error) {\n console.warn('RapiDoc: Error while receiving data');\n }\n if (msgEvent.data) {\n if (msgEvent.data.responseType === 'code') {\n // Authorization Code flow\n fetchAccessToken.call(this, tokenUrl, clientId, clientSecret, redirectUrl, grantType, msgEvent.data.code, securitySchemeId, authFlowDivEl, sendClientSecretIn);\n } else if (msgEvent.data.responseType === 'token') {\n // Implicit flow\n updateOAuthKey.call(this, securitySchemeId, msgEvent.data.access_token, msgEvent.data.token_type);\n }\n }\n}\n\n// code_challenge generator for PKCE flow\n// TODO: Implement dynamic generation of code-challenge based on code-verifier\n/*\nasync function generateCodeChallenge() {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const sha256Hash = await window.crypto.subtle.digest('SHA-256', data); // returns Unit8Array\n // const utf8Decoder = new TextDecoder();\n // const b64EncodedSha256 = btoa(utf8Decoder.decode(sha256Hash));\n const b64EncodedSha256 = base64encode(sha256Hash);\n return b64EncodedSha256;\n}\n*/\n\nasync function onInvokeOAuthFlow(securitySchemeId, flowType, authUrl, tokenUrl, e) {\n const authFlowDivEl = e.target.closest('.oauth-flow');\n const clientId = authFlowDivEl.querySelector('.oauth-client-id') ? authFlowDivEl.querySelector('.oauth-client-id').value.trim() : '';\n const clientSecret = authFlowDivEl.querySelector('.oauth-client-secret') ? authFlowDivEl.querySelector('.oauth-client-secret').value.trim() : '';\n const username = authFlowDivEl.querySelector('.api-key-user') ? authFlowDivEl.querySelector('.api-key-user').value.trim() : '';\n const password = authFlowDivEl.querySelector('.api-key-password') ? authFlowDivEl.querySelector('.api-key-password').value.trim() : '';\n const sendClientSecretIn = authFlowDivEl.querySelector('.oauth-send-client-secret-in') ? authFlowDivEl.querySelector('.oauth-send-client-secret-in').value.trim() : 'header';\n const checkedScopeEls = [...authFlowDivEl.querySelectorAll('.scope-checkbox:checked')];\n const pkceCheckboxEl = authFlowDivEl.querySelector(`#${securitySchemeId}-pkce`);\n const state = (`${Math.random().toString(36).slice(2, 9)}random${Math.random().toString(36).slice(2, 9)}`);\n const nonce = (`${Math.random().toString(36).slice(2, 9)}random${Math.random().toString(36).slice(2, 9)}`);\n // const codeChallenge = await generateCodeChallenge(codeVerifier);\n const redirectUrlObj = new URL(`${window.location.origin}${window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'))}/${this.oauthReceiver}`);\n let grantType = '';\n let responseType = '';\n let newWindow;\n\n // clear previous error messages\n const errEls = [...authFlowDivEl.parentNode.querySelectorAll('.oauth-resp-display')];\n errEls.forEach((v) => { v.innerHTML = ''; });\n\n if (flowType === 'authorizationCode' || flowType === 'implicit') {\n const authUrlObj = new URL(authUrl);\n if (flowType === 'authorizationCode') {\n grantType = 'authorization_code';\n responseType = 'code';\n } else if (flowType === 'implicit') {\n responseType = 'token';\n }\n const authCodeParams = new URLSearchParams(authUrlObj.search);\n const selectedScopes = checkedScopeEls.map((v) => v.value).join(' ');\n if (selectedScopes) {\n authCodeParams.set('scope', selectedScopes);\n }\n authCodeParams.set('client_id', clientId);\n authCodeParams.set('redirect_uri', redirectUrlObj.toString());\n authCodeParams.set('response_type', responseType);\n authCodeParams.set('state', state);\n authCodeParams.set('nonce', nonce);\n if (pkceCheckboxEl && pkceCheckboxEl.checked) {\n authCodeParams.set('code_challenge', codeChallenge);\n authCodeParams.set('code_challenge_method', 'S256');\n }\n authCodeParams.set('show_dialog', true);\n authUrlObj.search = authCodeParams.toString();\n // If any older message-event-listener is active then fire a fake message to remove it (these are single time listeners)\n if (sessionStorage.getItem('winMessageEventActive') === 'true') {\n window.postMessage({ fake: true }, this);\n }\n setTimeout(() => {\n newWindow = window.open(authUrlObj.toString());\n if (!newWindow) {\n console.error(`RapiDoc: Unable to open ${authUrlObj.toString()} in a new window`);\n } else {\n sessionStorage.setItem('winMessageEventActive', 'true');\n window.addEventListener(\n 'message',\n (msgEvent) => onWindowMessageEvent.call(this, msgEvent, newWindow, tokenUrl, clientId, clientSecret, redirectUrlObj.toString(), grantType, sendClientSecretIn, securitySchemeId, authFlowDivEl),\n { once: true },\n );\n }\n }, 10);\n } else if (flowType === 'clientCredentials') {\n grantType = 'client_credentials';\n const selectedScopes = checkedScopeEls.map((v) => v.value).join(' ');\n fetchAccessToken.call(this, tokenUrl, clientId, clientSecret, redirectUrlObj.toString(), grantType, '', securitySchemeId, authFlowDivEl, sendClientSecretIn, selectedScopes);\n } else if (flowType === 'password') {\n grantType = 'password';\n const selectedScopes = checkedScopeEls.map((v) => v.value).join(' ');\n fetchAccessToken.call(this, tokenUrl, clientId, clientSecret, redirectUrlObj.toString(), grantType, '', securitySchemeId, authFlowDivEl, sendClientSecretIn, selectedScopes, username, password);\n }\n}\n/* eslint-enable no-console */\n\n/* eslint-disable indent */\n\nfunction oAuthFlowTemplate(flowName, clientId, clientSecret, securitySchemeId, authFlow, defaultScopes = [], receiveTokenIn = 'header', receiveTokenInOptions = undefined) {\n let { authorizationUrl, tokenUrl, refreshUrl } = authFlow;\n const pkceOnly = authFlow['x-pkce-only'] || false;\n const isUrlAbsolute = (url) => (url.indexOf('://') > 0 || url.indexOf('//') === 0);\n // Calculcate base URL\n const url = new URL(this.selectedServer?.computedUrl);\n const baseUrl = url.origin;\n\n if (refreshUrl && !isUrlAbsolute(refreshUrl)) {\n refreshUrl = `${baseUrl}/${refreshUrl.replace(/^\\//, '')}`;\n }\n if (tokenUrl && !isUrlAbsolute(tokenUrl)) {\n tokenUrl = `${baseUrl}/${tokenUrl.replace(/^\\//, '')}`;\n }\n if (authorizationUrl && !isUrlAbsolute(authorizationUrl)) {\n authorizationUrl = `${baseUrl}/${authorizationUrl.replace(/^\\//, '')}`;\n }\n let flowNameDisplay;\n if (flowName === 'authorizationCode') {\n flowNameDisplay = 'Authorization Code Flow';\n } else if (flowName === 'clientCredentials') {\n flowNameDisplay = 'Client Credentials Flow';\n } else if (flowName === 'implicit') {\n flowNameDisplay = 'Implicit Flow';\n } else if (flowName === 'password') {\n flowNameDisplay = 'Password Flow';\n } else {\n flowNameDisplay = flowName;\n }\n return html`\n
\n
${flowNameDisplay}
\n ${authorizationUrl\n ? html`
Auth URL ${authorizationUrl}
`\n : ''\n }\n ${tokenUrl\n ? html`
Token URL ${tokenUrl}
`\n : ''\n }\n ${refreshUrl\n ? html`
Refresh URL ${refreshUrl}
`\n : ''\n }\n ${flowName === 'authorizationCode' || flowName === 'clientCredentials' || flowName === 'implicit' || flowName === 'password'\n ? html`\n ${authFlow.scopes\n ? html`\n Scopes \n
\n ${Object.entries(authFlow.scopes).map((scopeAndDescr, index) => html`\n
\n \n \n
\n `)}\n
\n `\n : ''\n }\n ${flowName === 'password'\n ? html`\n
\n \n \n
`\n : ''\n }\n
\n ${flowName === 'authorizationCode'\n ? html`\n
\n \n \n
\n `\n : ''\n }\n \n ${flowName === 'authorizationCode' || flowName === 'clientCredentials' || flowName === 'password'\n ? html`\n \n `\n : ''\n }\n ${flowName === 'authorizationCode' || flowName === 'clientCredentials' || flowName === 'implicit' || flowName === 'password'\n ? html`\n `\n : ''\n }\n
\n
\n `\n : ''\n }\n
\n `;\n}\n\nfunction removeApiKey(securitySchemeId) {\n const securityObj = this.resolvedSpec.securitySchemes?.find((v) => (v.securitySchemeId === securitySchemeId));\n securityObj.user = '';\n securityObj.password = '';\n securityObj.value = '';\n securityObj.finalKeyValue = '';\n if (this.persistAuth === 'true') {\n const rapidocLs = getPersistedApiKeys.call(this);\n delete rapidocLs[securityObj.securitySchemeId];\n setPersistedApiKeys.call(this, rapidocLs);\n }\n this.requestUpdate();\n}\n\nexport default function securitySchemeTemplate() {\n if (!this.resolvedSpec) { return ''; }\n const providedApiKeys = this.resolvedSpec.securitySchemes?.filter((v) => (v.finalKeyValue));\n if (!providedApiKeys) {\n return;\n }\n return html`\n
\n
AUTHENTICATION
\n\n
\n ${providedApiKeys.length > 0\n ? html`\n
${providedApiKeys.length} API key applied
\n
\n `\n : html`
No API key applied
`\n }\n
\n ${this.resolvedSpec.securitySchemes && this.resolvedSpec.securitySchemes.length > 0\n ? html`\n \n ${this.resolvedSpec.securitySchemes\n .filter((v) => v.scheme && v.type)\n .map((v) => html`\n \n \n \n ${v.type.toLowerCase() === 'oauth2'\n ? html`\n \n \n \n `\n : ''\n }\n `)}\n
\n
\n ${v.typeDisplay}\n ${v.finalKeyValue\n ? html`\n ${v.finalKeyValue ? 'Key Applied' : ''} \n \n `\n : ''\n }\n
\n ${v.description\n ? html`\n
\n ${unsafeHTML(marked(v.description || ''))}\n
`\n : ''\n }\n\n ${(v.type.toLowerCase() === 'apikey') || (v.type.toLowerCase() === 'http' && v.scheme.toLowerCase() === 'bearer')\n ? html`\n
\n ${v.type.toLowerCase() === 'apikey'\n ? html`Send ${v.name} in ${v.in}`\n : html`Send Authorization in header containing the word Bearer followed by a space and a Token String.`\n }\n
\n
\n ${v.in !== 'cookie'\n ? html`\n \n `\n : html` cookies cannot be set from here`\n }\n
`\n : ''\n }\n ${v.type.toLowerCase() === 'http' && v.scheme.toLowerCase() === 'basic'\n ? html`\n
\n Send Authorization in header containing the word Basic followed by a space and a base64 encoded string of username:password.\n
\n
\n \n \n \n
`\n : ''\n }\n
\n ${Object.keys(v.flows).map((f) => oAuthFlowTemplate\n .call(\n this,\n f,\n (v.flows[f]['x-client-id'] || v['x-client-id'] || ''),\n (v.flows[f]['x-client-secret'] || v['x-client-secret'] || ''),\n v.securitySchemeId,\n v.flows[f],\n (v.flows[f]['x-default-scopes'] || v['x-default-scopes']),\n (v.flows[f]['x-receive-token-in'] || v['x-receive-token-in']),\n (v.flows[f]['x-receive-token-in-options'] || v['x-receive-token-in-options']),\n ))}\n
`\n : ''\n }\n \n
\n`;\n}\n\nexport function pathSecurityTemplate(pathSecurity) {\n if (this.resolvedSpec.securitySchemes && pathSecurity) {\n const orSecurityKeys1 = [];\n if (Array.isArray(pathSecurity)) {\n if (pathSecurity.length === 0) {\n return '';\n }\n } else {\n return '';\n }\n pathSecurity.forEach((pSecurity) => {\n const andSecurityKeys1 = [];\n const andKeyTypes = [];\n if (Object.keys(pSecurity).length === 0) {\n orSecurityKeys1.push({\n securityTypes: 'None',\n securityDefs: [],\n });\n } else {\n Object.keys(pSecurity).forEach((pathSecurityKey) => {\n let pathScopes = '';\n const s = this.resolvedSpec.securitySchemes.find((ss) => ss.securitySchemeId === pathSecurityKey);\n if (pSecurity[pathSecurityKey] && Array.isArray(pSecurity[pathSecurityKey])) {\n pathScopes = pSecurity[pathSecurityKey].join(', ');\n }\n if (s) {\n andKeyTypes.push(s.typeDisplay);\n andSecurityKeys1.push({ ...s, ...({ scopes: pathScopes }) });\n }\n });\n orSecurityKeys1.push({\n securityTypes: andKeyTypes.length > 1 ? `${andKeyTypes[0]} + ${andKeyTypes.length - 1} more` : andKeyTypes[0],\n securityDefs: andSecurityKeys1,\n });\n }\n });\n return html`
\n
\n \n ${orSecurityKeys1.map((orSecurityItem1, i) => html`\n ${orSecurityItem1.securityTypes\n ? html`\n ${i !== 0 ? html`
OR
` : ''}\n
\n
\n ${this.updateRoute === 'true' && this.allowAuthentication === 'true'\n ? html` ${orSecurityItem1.securityTypes} `\n : html`${orSecurityItem1.securityTypes}`\n }\n
\n
\n ${orSecurityItem1.securityDefs.length > 1 ? html`
Requires all of the following
` : ''}\n
\n ${orSecurityItem1.securityDefs.map((andSecurityItem, j) => {\n const scopeHtml = html`${andSecurityItem.scopes !== ''\n ? html`\n
\n Required scopes:\n
\n
\n ${andSecurityItem.scopes.split(',').map((scope, cnt) => html`${cnt === 0 ? '' : '┃'}${scope}`)}\n
\n
`\n : ''\n }`;\n\n return html`\n ${andSecurityItem.type === 'oauth2'\n ? html`\n
\n ${orSecurityItem1.securityDefs.length > 1\n ? html`${j + 1}.  `\n : 'Needs'\n }\n OAuth Token ${andSecurityItem.securitySchemeId} in Authorization header\n ${scopeHtml}\n
`\n : andSecurityItem.type === 'http'\n ? html`\n
\n ${orSecurityItem1.securityDefs.length > 1 ? html`${j + 1}.  ` : html`Requires`}\n ${andSecurityItem.scheme === 'basic' ? 'Base 64 encoded username:password' : 'Bearer Token'} in Authorization header\n ${scopeHtml}\n
`\n : html`\n
\n ${orSecurityItem1.securityDefs.length > 1 ? html`${j + 1}.  ` : html`Requires`}\n Token in ${andSecurityItem.name} ${andSecurityItem.in}\n ${scopeHtml}\n
`\n }`;\n })}\n
\n
\n
\n `\n : ''\n }\n `)\n }\n
\n
\n `;\n }\n return '';\n}\n\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport Prism from 'prismjs';\nimport { copyToClipboard } from '~/utils/common-utils';\n\n/* eslint-disable indent */\nexport default function codeSamplesTemplate(xCodeSamples) {\n return html`\n
CODE SAMPLES\n
{\n if (!e.target.classList.contains('tab-btn')) { return; }\n const clickedTab = e.target.dataset.tab;\n\n const tabButtons = [...e.currentTarget.querySelectorAll('.tab-btn')];\n const tabContents = [...e.currentTarget.querySelectorAll('.tab-content')];\n tabButtons.forEach((tabBtnEl) => tabBtnEl.classList[tabBtnEl.dataset.tab === clickedTab ? 'add' : 'remove']('active'));\n tabContents.forEach((tabBodyEl) => { tabBodyEl.style.display = (tabBodyEl.dataset.tab === clickedTab ? 'block' : 'none'); });\n }\n }\">\n
\n ${xCodeSamples.map((v, i) => html``)}\n
\n ${xCodeSamples.map((v, i) => html`\n
\n \n
${Prism.languages[v.lang?.toLowerCase()] ? unsafeHTML(Prism.highlight(v.source, Prism.languages[v.lang?.toLowerCase()], v.lang?.toLowerCase())) : v.source}
\n
`)\n }\n
\n
`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\n\n/* eslint-disable indent */\nexport default function callbackTemplate(callbacks) {\n return html`\n
CALLBACKS
\n ${Object.entries(callbacks).map((kv) => html`\n
\n ${kv[0]}\n ${Object.entries(kv[1]).map((pathObj) => html`\n
\n
\n ${Object.entries(pathObj[1]).map((method) => html`\n
\n
\n
\n \n ${method[0]} \n
\n ${pathObj[0]} \n
\n
\n \n\n \n
\n
\n `)}\n
\n
\n `)}\n
\n `)}\n `;\n}\n/* eslint-enable indent */\n","import { LitElement, html, css } from 'lit';\nimport { copyToClipboard } from '~/utils/common-utils';\nimport FontStyles from '~/styles/font-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport InputStyles from '~/styles/input-styles';\nimport CustomStyles from '~/styles/custom-styles';\n\nexport default class JsonTree extends LitElement {\n static get properties() {\n return {\n data: { type: Object },\n renderStyle: { type: String, attribute: 'render-style' },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n BorderStyles,\n InputStyles,\n css`\n :host{\n display:flex;\n }\n :where(button, input[type=\"checkbox\"], [tabindex=\"0\"]):focus-visible { box-shadow: var(--focus-shadow); }\n :where(input[type=\"text\"], input[type=\"password\"], select, textarea):focus-visible { border-color: var(--primary-color); }\n .json-tree {\n position: relative;\n font-family: var(--font-mono);\n font-size: var(--font-size-small);\n display:inline-block;\n overflow:hidden;\n word-break: break-all;\n flex:1;\n line-height: calc(var(--font-size-small) + 6px);\n min-height: 40px;\n direction: ltr; \n text-align: left;\n }\n\n .open-bracket {\n display:inline-block;\n padding: 0 20px 0 0;\n cursor:pointer;\n border: 1px solid transparent;\n border-radius:3px;\n }\n .close-bracket {\n border: 1px solid transparent;\n border-radius:3px;\n display:inline-block;\n }\n .open-bracket:hover {\n color:var(--primary-color);\n background-color:var(--hover-color);\n border: 1px solid var(--border-color);\n }\n .open-bracket.expanded:hover ~ .inside-bracket {\n border-left: 1px solid var(--fg3);\n }\n .open-bracket.expanded:hover ~ .close-bracket {\n color:var(--primary-color);\n }\n .inside-bracket {\n padding-left:12px;\n overflow: hidden;\n border-left:1px dotted var(--border-color);\n }\n .open-bracket.collapsed + .inside-bracket,\n .open-bracket.collapsed + .inside-bracket + .close-bracket {\n display:none;\n }\n\n .string{color:var(--green);}\n .number{color:var(--blue);}\n .null{color:var(--red);}\n .boolean{color:var(--purple);}\n .object{color:var(--fg)}\n .toolbar {\n position: absolute;\n top:5px;\n right:6px;\n display:flex;\n padding:2px;\n align-items: center;\n }`,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
\n
\n \n
\n ${this.generateTree(this.data, true)}\n
\n `;\n }\n\n generateTree(data, isLast = false) {\n if (data === null) {\n return html`null${isLast ? '' : ','}`;\n }\n if (typeof data === 'object' && (data instanceof Date === false)) {\n const detailType = Array.isArray(data) ? 'array' : 'pure_object';\n if (Object.keys(data).length === 0) {\n return html`${(Array.isArray(data) ? '[ ],' : '{ },')}`;\n }\n return html`\n
${detailType === 'array' ? '[' : '{'}
\n
\n ${Object.keys(data).map((key, i, a) => html`\n
\n ${detailType === 'pure_object' ? html`\"${key}\":` : ''}\n ${this.generateTree(data[key], i === (a.length - 1))}\n
`)\n }\n
\n
${detailType === 'array' ? ']' : '}'}${isLast ? '' : ','}
\n `;\n }\n return (typeof data === 'string' || data instanceof Date)\n ? html`\"${data}\"${isLast ? '' : ','}`\n : html`${data}${isLast ? '' : ','}`;\n }\n /* eslint-enable indent */\n\n toggleExpand(e) {\n const openBracketEl = e.target;\n if (e.target.classList.contains('open-bracket')) {\n if (openBracketEl.classList.contains('expanded')) {\n openBracketEl.classList.replace('expanded', 'collapsed');\n e.target.innerHTML = e.target.classList.contains('array') ? '[...]' : '{...}';\n } else {\n openBracketEl.classList.replace('collapsed', 'expanded');\n e.target.innerHTML = e.target.classList.contains('array') ? '[' : '{';\n }\n }\n }\n}\n// Register the element with the browser\ncustomElements.define('json-tree', JsonTree);\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport FontStyles from '~/styles/font-styles';\nimport SchemaStyles from '~/styles/schema-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport CustomStyles from '~/styles/custom-styles';\n\nexport default class SchemaTree extends LitElement {\n static get properties() {\n return {\n data: { type: Object },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true false'.includes(this.schemaDescriptionExpanded)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.schemaHideReadOnly || !'true false'.includes(this.schemaHideReadOnly)) { this.schemaHideReadOnly = 'true'; }\n if (!this.schemaHideWriteOnly || !'true false'.includes(this.schemaHideWriteOnly)) { this.schemaHideWriteOnly = 'true'; }\n }\n\n static get styles() {\n return [\n FontStyles,\n SchemaStyles,\n BorderStyles,\n css`\n .tree {\n font-size:var(--font-size-small);\n text-align: left;\n direction: ltr;\n line-height:calc(var(--font-size-small) + 6px);\n }\n .tree .tr:hover{\n background-color:var(--hover-color);\n }\n .collapsed-all-descr .tr:not(.expanded-descr) {\n overflow: hidden;\n max-height:calc(var(--font-size-small) + 8px);\n }\n .tree .key {\n max-width: 300px;\n }\n .tr.expanded:hover > .td.key > .open-bracket {\n color: var(--primary-color);\n }\n .tr.expanded:hover + .inside-bracket {\n border-left: 1px solid var(--fg3);\n }\n .tr.expanded:hover + .inside-bracket + .close-bracket {\n color: var(--primary-color);\n }\n .inside-bracket.xxx-of-option {\n border-left: 1px solid transparent;\n }\n .open-bracket{\n display:inline-block;\n padding: 0 20px 0 0;\n cursor:pointer;\n border: 1px solid transparent;\n border-radius:3px;\n }\n .open-bracket:hover {\n color:var(--primary-color);\n background-color:var(--hover-color);\n border: 1px solid var(--border-color);\n }\n .close-bracket{\n display:inline-block;\n font-family: var(--font-mono);\n }\n .tr.collapsed + .inside-bracket,\n .tr.collapsed + .inside-bracket + .close-bracket{\n overflow: hidden;\n display:none;\n }\n .inside-bracket.object,\n .inside-bracket.array {\n border-left: 1px dotted var(--border-color);\n }`,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
this.handleAllEvents(e)}\">\n
\n
${this.data?.['::type'] || ''}
\n ${this.allowSchemaDescriptionExpandToggle === 'true'\n ? html`\n
\n
\n ${this.schemaDescriptionExpanded === 'true' ? 'Single line description' : 'Multiline description'}\n
`\n : ''\n }\n
\n ${unsafeHTML(marked(this.data?.['::description'] || ''))}\n ${this.data\n ? html`\n ${this.generateTree(\n this.data['::type'] === 'array' ? this.data['::props'] : this.data,\n this.data['::type'],\n this.data['::array-type'] || '',\n )}`\n : html` Schema not found `\n }\n
\n `;\n }\n\n generateTree(data, dataType = 'object', arrayType = '', key = '', description = '', schemaLevel = 0, indentLevel = 0, readOrWrite = '', isDeprecated = false) {\n if (this.schemaHideReadOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'readonly') {\n return;\n }\n }\n if (data?.['::readwrite'] === 'readonly') {\n return;\n }\n }\n if (this.schemaHideWriteOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'writeonly') {\n return;\n }\n }\n if (data?.['::readwrite'] === 'writeonly') {\n return;\n }\n }\n\n if (!data) {\n return html`
\n ${key.replace('::OPTION~', '')}\n ${\n dataType === 'array'\n ? html` [ ] `\n : dataType === 'object'\n ? html` { } `\n : html` schema undefined `\n }\n
`;\n }\n if (Object.keys(data).length === 0) {\n return html`${key}:{ }`;\n }\n let keyLabel = '';\n let keyDescr = '';\n if (key.startsWith('::ONE~OF') || key.startsWith('::ANY~OF')) {\n keyLabel = key.replace('::', '').replace('~', ' ');\n } else if (key.startsWith('::OPTION')) {\n const parts = key.split('~');\n [, keyLabel, keyDescr] = parts;\n } else {\n keyLabel = key;\n }\n\n const leftPadding = 12;\n const minFieldColWidth = 400 - (indentLevel * leftPadding);\n let openBracket = '';\n let closeBracket = '';\n const newSchemaLevel = data['::type']?.startsWith('xxx-of') ? schemaLevel : (schemaLevel + 1);\n // const newIndentLevel = dataType === 'xxx-of-option' || data['::type'] === 'xxx-of-option' ? indentLevel : (indentLevel + 1);\n const newIndentLevel = dataType === 'xxx-of-option' || data['::type'] === 'xxx-of-option' || key.startsWith('::OPTION') ? indentLevel : (indentLevel + 1);\n if (data['::type'] === 'object') {\n if (dataType === 'array') {\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`[{`;\n } else {\n openBracket = html`[{...}]`;\n }\n closeBracket = '}]';\n } else {\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`${data['::nullable'] ? 'null┃' : ''}{`;\n } else {\n openBracket = html`${data['::nullable'] ? 'null┃' : ''}{...}`;\n }\n closeBracket = '}';\n }\n } else if (data['::type'] === 'array') {\n if (dataType === 'array') {\n const arrType = arrayType !== 'object' ? arrayType : '';\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`[[ ${arrType} `;\n } else {\n openBracket = html`[[...]]`;\n }\n closeBracket = ']]';\n } else {\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`[`;\n } else {\n openBracket = html`[...]`;\n }\n closeBracket = ']';\n }\n }\n if (typeof data === 'object') {\n return html`\n
\n
\n ${data['::type'] === 'xxx-of-option' || data['::type'] === 'xxx-of-array' || key.startsWith('::OPTION')\n ? html` ${keyLabel}${keyDescr}`\n : keyLabel === '::props' || keyLabel === '::ARRAY~OF'\n ? ''\n : schemaLevel > 0\n ? html`\n ${(isDeprecated || data['::deprecated'])\n ? html``\n : ''\n }\n ${keyLabel.replace(/\\*$/, '')}${keyLabel.endsWith('*') ? html`*` : ''}${readOrWrite === 'readonly' ? html` 🆁` : readOrWrite === 'writeonly' ? html` 🆆` : readOrWrite}:\n `\n : ''\n }\n ${openBracket}\n
\n
${unsafeHTML(marked(description || ''))}
\n
\n
\n ${Array.isArray(data) && data[0]\n ? html`${this.generateTree(data[0], 'xxx-of-option', '', '::ARRAY~OF', '', newSchemaLevel, newIndentLevel, data[0]['::readwrite'], (isDeprecated || data[0]['::deprecated']))}`\n : html`\n ${Object.keys(data).map((dataKey) => html`\n ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite', '::dataTypeLabel', '::nullable'].includes(dataKey)\n ? data[dataKey]['::type'] === 'array' || data[dataKey]['::type'] === 'object'\n ? html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]['::description'],\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n (isDeprecated || data[dataKey]['::deprecated']),\n )}`\n : ''\n : html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]?.['::description'] || '',\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n (isDeprecated || data[dataKey]['::deprecated']),\n )}`\n }\n `)}\n `\n }\n
\n ${data['::type'] && data['::type'].includes('xxx-of')\n ? ''\n : html`
${closeBracket}
`\n }\n `;\n }\n\n // For Primitive types and array of Primitives\n // eslint-disable-next-line no-unused-vars\n const [type, primitiveReadOrWrite, constraint, defaultValue, allowedValues, pattern, schemaDescription, schemaTitle, deprecated] = data.split('~|~');\n if (primitiveReadOrWrite === '🆁' && this.schemaHideReadOnly === 'true') {\n return;\n }\n if (primitiveReadOrWrite === '🆆' && this.schemaHideWriteOnly === 'true') {\n return;\n }\n const dataTypeCss = type.replace(/┃.*/g, '').replace(/[^a-zA-Z0-9+]/g, '').substring(0, 4).toLowerCase();\n const descrExpander = `${constraint || defaultValue || allowedValues || pattern ? `` : ''}`;\n let finalReadWriteText = '';\n let finalReadWriteTip = '';\n if (dataType === 'array') {\n if (readOrWrite === 'readonly') {\n finalReadWriteText = '🆁';\n finalReadWriteTip = 'Read-Only';\n } else if (readOrWrite === 'writeonly') {\n finalReadWriteText = '🆆';\n finalReadWriteTip = 'Write-Only';\n }\n } else if (primitiveReadOrWrite === '🆁') {\n finalReadWriteText = '🆁';\n finalReadWriteTip = 'Read-Only';\n } else if (primitiveReadOrWrite === '🆆') {\n finalReadWriteText = '🆆';\n finalReadWriteTip = 'Write-Only';\n }\n\n return html`\n
\n
\n ${isDeprecated || deprecated\n ? html``\n : ''\n }\n ${keyLabel.endsWith('*')\n ? html`${keyLabel.substring(0, keyLabel.length - 1)}*:`\n : key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : html`${keyLabel}:`\n }\n \n ${dataType === 'array' ? `[${type}]` : `${type}`}\n ${finalReadWriteText}\n \n
\n
\n ${description || schemaTitle || schemaDescription\n ? html`${html`\n ${unsafeHTML(marked(dataType === 'array'\n ? `${descrExpander} ${description}`\n : schemaTitle\n ? `${descrExpander} ${schemaTitle}: ${schemaDescription}`\n : `${descrExpander} ${schemaDescription}`))}\n `\n }`\n : ''\n } \n ${constraint ? html`
Constraints: ${constraint}
` : ''}\n ${defaultValue ? html`
Default: ${defaultValue}
` : ''}\n ${allowedValues ? html`
${type === 'const' ? 'Value' : 'Allowed'}: ${allowedValues}
` : ''}\n ${pattern ? html`
Pattern: ${pattern}
` : ''}\n
\n
\n `;\n }\n /* eslint-enable indent */\n\n handleAllEvents(e) {\n if (e.target.classList.contains('open-bracket')) {\n this.toggleObjectExpand(e);\n } else if (e.target.classList.contains('schema-multiline-toggle')) {\n this.schemaDescriptionExpanded = (this.schemaDescriptionExpanded === 'true' ? 'false' : 'true');\n } else if (e.target.classList.contains('descr-expand-toggle')) {\n const trEl = e.target.closest('.tr');\n if (trEl) {\n trEl.classList.toggle('expanded-descr');\n trEl.style.maxHeight = trEl.scrollHeight;\n }\n }\n }\n\n toggleObjectExpand(e) {\n const rowEl = e.target.closest('.tr');\n const nullable = rowEl.classList.contains('nullable');\n if (rowEl.classList.contains('expanded')) {\n rowEl.classList.replace('expanded', 'collapsed');\n e.target.innerHTML = e.target.classList.contains('array-of-object')\n ? '[{...}]'\n : e.target.classList.contains('array-of-array')\n ? '[[...]]'\n : e.target.classList.contains('array')\n ? '[...]'\n : `${nullable ? 'null┃' : ''}{...}`;\n } else {\n rowEl.classList.replace('collapsed', 'expanded');\n e.target.innerHTML = e.target.classList.contains('array-of-object')\n ? '[{'\n : e.target.classList.contains('array-of-array')\n ? `[[ ${e.target.dataset.arrayType}`\n : e.target.classList.contains('object')\n ? `${nullable ? 'null┃' : ''}{`\n : '[';\n }\n }\n}\ncustomElements.define('schema-tree', SchemaTree);\n","import { LitElement, html, css } from 'lit';\n\nexport default class TagInput extends LitElement {\n /* eslint-disable indent */\n render() {\n let tagItemTmpl = '';\n if (Array.isArray(this.value)) {\n tagItemTmpl = html`${this.value\n .filter((v) => typeof v === 'string' && v.trim() !== '')\n .map((v) => html`${v}`)\n }`;\n }\n return html`\n
\n ${tagItemTmpl}\n this.afterPaste(e)}\" @keydown=\"${this.afterKeyDown}\" @blur=\"${this.onBlur}\" placeholder=\"${this.placeholder || ''}\">\n
\n `;\n }\n /* eslint-enable indent */\n\n static get properties() {\n return {\n placeholder: { type: String },\n value: { type: Array, attribute: 'value' },\n };\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'value') {\n if (newVal && oldVal !== newVal) {\n this.value = newVal.split(',').filter((v) => v.trim() !== '');\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n afterPaste(e) {\n const clipboardData = e.clipboardData || window.clipboardData;\n const pastedData = clipboardData.getData('Text');\n const pastedArray = pastedData ? pastedData.split(',').filter((v) => v.trim() !== '') : '';\n if (pastedArray) {\n if (Array.isArray(this.value)) {\n this.value = [...this.value, ...pastedArray];\n } else {\n this.value = pastedArray;\n }\n }\n e.preventDefault();\n }\n\n afterKeyDown(e) {\n if (e.keyCode === 13) {\n e.stopPropagation();\n e.preventDefault();\n if (e.target.value) {\n if (Array.isArray(this.value)) {\n this.value = [...this.value, e.target.value];\n } else {\n this.value = [e.target.value];\n }\n e.target.value = '';\n }\n } else if (e.keyCode === 8) {\n if (e.target.value.length === 0) {\n if (Array.isArray(this.value) && this.value.length > 0) {\n this.value.splice(-1);\n this.value = [...this.value];\n }\n }\n }\n }\n\n onBlur(e) {\n if (e.target.value) {\n if (Array.isArray(this.value)) {\n this.value = [...this.value, e.target.value];\n } else {\n this.value = [e.target.value];\n }\n e.target.value = '';\n }\n }\n\n static get styles() {\n return [css`\n .tags {\n display:flex;\n flex-wrap: wrap;\n outline: none;\n padding:0;\n border-radius:var(--border-radius);\n border:1px solid var(--border-color);\n cursor:text;\n overflow:hidden;\n background:var(--input-bg);\n }\n .tag, .editor {\n padding:3px;\n margin:2px;\n }\n .tag{\n border:1px solid var(--border-color);\n background-color:var(--bg3);\n color:var(--fg3);\n border-radius:var(--border-radius);\n word-break: break-all;\n font-size: var(--font-size-small);\n }\n .tag:hover ~ #cursor {\n display: block;\n }\n .editor {\n flex:1;\n border:1px solid transparent;\n color:var(--fg);\n min-width:60px;\n outline: none;\n line-height: inherit;\n font-family:inherit;\n background:transparent;\n font-size: calc(var(--font-size-small) + 1px);\n }\n .editor:focus-visible {\n outline: 1px solid;\n }\n .editor::placeholder {\n color: var(--placeholder-color);\n opacity:1;\n }\n `];\n }\n}\n// Register the element with the browser\ncustomElements.define('tag-input', TagInput);\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { guard } from 'lit/directives/guard.js'; // eslint-disable-line import/extensions\nimport { live } from 'lit/directives/live.js'; // eslint-disable-line import/extensions\nimport { ifDefined } from 'lit/directives/if-defined.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport formatXml from 'xml-but-prettier';\nimport Prism from 'prismjs';\nimport TableStyles from '~/styles/table-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FontStyles from '~/styles/font-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport CustomStyles from '~/styles/custom-styles';\nimport { copyToClipboard, downloadResource, viewResource } from '~/utils/common-utils';\nimport { schemaInObjectNotation,\n getTypeInfo,\n generateExample,\n normalizeExamples,\n getSchemaFromParam,\n json2xml,\n standardizeExample,\n anyExampleWithSummaryOrDescription } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport '~/components/tag-input';\n\nexport default class ApiRequest extends LitElement {\n constructor() {\n super();\n this.responseMessage = '';\n this.responseStatus = 'success';\n this.responseHeaders = '';\n this.responseText = '';\n this.responseUrl = '';\n this.curlSyntax = '';\n this.activeResponseTab = 'response'; // allowed values: response, headers, curl\n this.selectedRequestBodyType = '';\n this.selectedRequestBodyExample = '';\n this.activeParameterSchemaTabs = {};\n }\n\n static get properties() {\n return {\n serverUrl: { type: String, attribute: 'server-url' },\n servers: { type: Array },\n method: { type: String },\n path: { type: String },\n security: { type: Array },\n parameters: { type: Array },\n request_body: { type: Object },\n api_keys: { type: Array },\n parser: { type: Object },\n accept: { type: String },\n callback: { type: String },\n webhook: { type: String },\n responseMessage: { type: String, attribute: false },\n responseText: { type: String, attribute: false },\n responseHeaders: { type: String, attribute: false },\n responseStatus: { type: String, attribute: false },\n responseUrl: { type: String, attribute: false },\n curlSyntax: { type: String, attribute: false },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n allowTry: { type: String, attribute: 'allow-try' },\n showCurlBeforeTry: { type: String, attribute: 'show-curl-before-try' },\n renderStyle: { type: String, attribute: 'render-style' },\n schemaStyle: { type: String, attribute: 'schema-style' },\n activeSchemaTab: { type: String, attribute: 'active-schema-tab' },\n activeParameterSchemaTabs: {\n type: Object,\n converter: {\n fromAttribute: (attr) => JSON.parse(attr),\n toAttribute: (prop) => JSON.stringify(prop),\n },\n attribute: 'active-parameter-schema-tabs',\n },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // properties for internal tracking\n activeResponseTab: { type: String }, // internal tracking of response-tab not exposed as a attribute\n selectedRequestBodyType: { type: String, attribute: 'selected-request-body-type' }, // internal tracking of selected request-body type\n selectedRequestBodyExample: { type: String, attribute: 'selected-request-body-example' }, // internal tracking of selected request-body example\n };\n }\n\n static get styles() {\n return [\n TableStyles,\n InputStyles,\n FontStyles,\n FlexStyles,\n BorderStyles,\n TabStyles,\n PrismStyles,\n css`\n :host {\n container-type: inline-size;\n }\n *, *:before, *:after { box-sizing: border-box; }\n :where(button, input[type=\"checkbox\"], [tabindex=\"0\"]):focus-visible { box-shadow: var(--focus-shadow); }\n :where(input[type=\"text\"], input[type=\"password\"], select, textarea):focus-visible { border-color: var(--primary-color); }\n tag-input:focus-within { outline: 1px solid;}\n .read-mode {\n margin-top: 24px;\n }\n .param-name,\n .param-type {\n margin: 1px 0;\n text-align: right;\n line-height: var(--font-size-small);\n }\n .param-name {\n color: var(--fg); \n font-family: var(--font-mono);\n }\n .param-name.deprecated { \n color: var(--red);\n }\n .param-type{\n color: var(--light-fg); \n font-family: var(--font-regular);\n }\n .param-constraint{\n min-width:100px;\n }\n .param-constraint:empty{\n display:none;\n }\n .top-gap{margin-top:24px;}\n\n .textarea {\n min-height:220px; \n padding:5px;\n resize:vertical;\n direction: ltr;\n }\n .example:first-child {\n margin-top: -9px;\n }\n\n .response-message{\n font-weight:bold;\n text-overflow: ellipsis;\n }\n .response-message.error {\n color:var(--red);\n }\n .response-message.success {\n color:var(--blue);\n }\n\n .file-input-container {\n align-items:flex-end;\n }\n .file-input-container .input-set:first-child .file-input-remove-btn{\n visibility:hidden;\n }\n\n .file-input-remove-btn{\n font-size:16px;\n color:var(--red);\n outline: none;\n border: none;\n background:none;\n cursor:pointer;\n }\n\n .v-tab-btn {\n font-size: var(--smal-font-size);\n height:24px; \n border:none; \n background:none; \n opacity: 0.3;\n cursor: pointer;\n padding: 4px 8px;\n }\n .v-tab-btn.active {\n font-weight: bold;\n background: var(--bg);\n opacity: 1;\n }\n\n @container (min-width: 768px) {\n .textarea {\n padding:8px;\n }\n }\n\n @container (max-width: 470px) {\n .hide-in-small-screen {\n display:none;\n }\n }\n `,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
\n
\n ${this.callback === 'true' ? 'CALLBACK REQUEST' : 'REQUEST'}\n
\n
\n ${guard([this.method, this.path, this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('path'))}\n ${guard([this.method, this.path, this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('query'))}\n ${this.requestBodyTemplate()}\n ${guard([this.method, this.path, this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('header'))}\n ${guard([this.method, this.path, this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('cookie'))}\n ${this.allowTry === 'false' ? '' : html`${this.apiCallTemplate()}`}\n
\n
\n `;\n }\n\n async updated() {\n if (this.showCurlBeforeTry === 'true') {\n this.applyCURLSyntax(this.shadowRoot);\n }\n\n // In focused mode after rendering the request component, update the text-areas(which contains examples) using\n // the original values from hidden textareas\n // This is done coz, user may update the dom by editing the textarea's and once the DOM is updated externally change detection wont happen, therefore update the values manually\n\n // if (this.renderStyle === 'focused') {\n // if (changedProperties.size === 1 && changedProperties.has('activeSchemaTab')) {\n // // dont update example as only tabs is switched\n // } else {\n // this.requestUpdate();\n // }\n // }\n\n if (this.webhook === 'true') {\n this.allowTry = 'false';\n }\n }\n\n async saveExampleState() {\n if (this.renderStyle === 'focused') {\n const reqBodyTextAreaEls = [...this.shadowRoot.querySelectorAll('textarea.request-body-param-user-input')];\n reqBodyTextAreaEls.forEach((el) => {\n el.dataset.user_example = el.value;\n });\n const exampleTextAreaEls = [...this.shadowRoot.querySelectorAll('textarea[data-ptype=\"form-data\"]')];\n exampleTextAreaEls.forEach((el) => {\n el.dataset.user_example = el.value;\n });\n this.requestUpdate();\n }\n }\n\n async updateExamplesFromDataAttr() {\n // In focused mode after rendering the request component, update the text-areas(which contains examples) using\n // the original values from hidden textareas\n // This is done coz, user may update the dom by editing the textarea's and once the DOM is updated externally change detection wont happen, therefore update the values manually\n if (this.renderStyle === 'focused') {\n const reqBodyTextAreaEls = [...this.shadowRoot.querySelectorAll('textarea.request-body-param-user-input')];\n reqBodyTextAreaEls.forEach((el) => {\n el.value = el.dataset.user_example || el.dataset.example;\n });\n const exampleTextAreaEls = [...this.shadowRoot.querySelectorAll('textarea[data-ptype=\"form-data\"]')];\n exampleTextAreaEls.forEach((el) => {\n el.value = el.dataset.user_example || el.dataset.example;\n });\n this.requestUpdate();\n }\n }\n\n renderExample(example, paramType, paramName) {\n return html`\n ${paramType === 'array' ? '[' : ''}\n {\n const inputEl = e.target.closest('table').querySelector(`[data-pname=\"${paramName}\"]`);\n if (inputEl) {\n inputEl.value = e.target.dataset.exampleType === 'array' ? e.target.dataset.example.split('~|~') : e.target.dataset.example;\n }\n }}\"\n > ${example.printableValue || example.value} \n ${paramType === 'array' ? '] ' : ''}\n `;\n }\n\n renderShortFormatExamples(examples, paramType, paramName) {\n return html`${examples.map((x, i) => html`\n ${i === 0 ? '' : '┃'}\n ${this.renderExample(x, paramType, paramName)}`)}`;\n }\n\n renderLongFormatExamples(exampleList, paramType, paramName) {\n return html`
    \n ${exampleList.map((v) => html`\n
  • \n ${this.renderExample(v, paramType, paramName)}\n ${v.summary?.length > 0 ? html`(${v.summary})` : ''}\n ${v.description?.length > 0 ? html`

    ${unsafeHTML(marked(v.description))}

    ` : ''}\n
  • \n `)}\n
`;\n }\n\n exampleListTemplate(paramName, paramType, exampleList = []) {\n return html` ${\n exampleList.length > 0\n ? html`Examples: \n ${anyExampleWithSummaryOrDescription(exampleList)\n ? this.renderLongFormatExamples(exampleList, paramType, paramName)\n : this.renderShortFormatExamples(exampleList, paramType, paramName)}`\n : ''\n }`;\n }\n\n inputParametersTemplate(paramType) {\n const filteredParams = this.parameters ? this.parameters.filter((param) => param.in === paramType) : [];\n if (filteredParams.length === 0) {\n return '';\n }\n let title = '';\n if (paramType === 'path') {\n title = 'PATH PARAMETERS';\n } else if (paramType === 'query') {\n title = 'QUERY-STRING PARAMETERS';\n } else if (paramType === 'header') {\n title = 'REQUEST HEADERS';\n } else if (paramType === 'cookie') {\n title = 'COOKIES';\n }\n\n const tableRows = [];\n for (const param of filteredParams) {\n const [declaredParamSchema, serializeStyle, mimeTypeElem] = getSchemaFromParam(param);\n if (!declaredParamSchema) {\n continue;\n }\n const paramSchema = getTypeInfo(declaredParamSchema);\n if (!paramSchema) {\n continue; // eslint-disable-line no-continue\n }\n const schemaAsObj = schemaInObjectNotation(declaredParamSchema, {});\n // let exampleVal = '';\n // let exampleList = [];\n let paramStyle = 'form';\n let paramExplode = true;\n let paramAllowReserved = false;\n if (paramType === 'query' || paramType === 'header' || paramType === 'path') {\n if (param.style && 'form spaceDelimited pipeDelimited'.includes(param.style)) {\n paramStyle = param.style;\n } else if (serializeStyle) {\n paramStyle = serializeStyle;\n }\n if (typeof param.explode === 'boolean') {\n paramExplode = param.explode;\n }\n if (typeof param.allowReserved === 'boolean') {\n paramAllowReserved = param.allowReserved;\n }\n }\n // openapi 3.1.0 spec based examples (which must be Object(string : { value:any, summary?: string, description?: string})\n const example = normalizeExamples(\n (standardizeExample(param.examples)\n || standardizeExample(param.example)\n || standardizeExample(mimeTypeElem?.example)\n || standardizeExample(mimeTypeElem?.examples)\n || standardizeExample(paramSchema.examples)\n || standardizeExample(paramSchema.example)\n ),\n paramSchema.type,\n );\n if (!example.exampleVal && paramSchema.type === 'object') {\n example.exampleVal = generateExample(\n declaredParamSchema,\n serializeStyle || 'json',\n {},\n {},\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n true,\n 'text',\n false,\n )[0].exampleValue;\n }\n const labelColWidth = 'read focused'.includes(this.renderStyle) ? '200px' : '160px';\n tableRows.push(html`\n \n \n
\n ${param.deprecated\n ? html``\n : ''\n }\n ${param.required ? html`*` : ''}\n ${param.name}\n
\n
\n ${paramSchema.type === 'array'\n ? `${paramSchema.arrayType}`\n : `${paramSchema.format ? paramSchema.format : paramSchema.type}`\n }\n
\n \n ${this.allowTry === 'true'\n ? html`\n \n ${paramSchema.type === 'array'\n ? html`\n \n `\n : paramSchema.type === 'object'\n ? html`\n
\n
{\n if (e.target.tagName.toLowerCase() === 'button') {\n const newState = { ...this.activeParameterSchemaTabs };\n newState[param.name] = e.target.dataset.tab;\n this.activeParameterSchemaTabs = newState;\n }\n }}\">\n \n \n
\n\n ${html`
\n \n
`\n }\n ${html`
\n \n
`\n }\n
`\n : html`\n {\n const requestPanelEl = this.getRequestPanel(e);\n this.liveCURLSyntaxUpdate(requestPanelEl);\n }}\n />`\n }\n `\n : ''\n }\n ${paramSchema.default || paramSchema.constrain || paramSchema.allowedValues || paramSchema.pattern\n ? html`\n \n
\n ${paramSchema.default ? html`Default: ${paramSchema.default}
` : ''}\n ${paramSchema.pattern ? html`Pattern: ${paramSchema.pattern}
` : ''}\n ${paramSchema.constrain ? html`${paramSchema.constrain}
` : ''}\n ${paramSchema.allowedValues && paramSchema.allowedValues.split('┃').map((v, i) => html`\n ${i > 0 ? '┃' : html`Allowed: `}\n ${html`\n {\n const inputEl = e.target.closest('table').querySelector(`[data-pname=\"${param.name}\"]`);\n if (inputEl) {\n if (e.target.dataset.type === 'array') {\n inputEl.value = [e.target.dataset.enum];\n } else {\n inputEl.value = e.target.dataset.enum;\n }\n }\n }}\"\n >${v}`\n }`)}\n
\n `\n : html``\n }\n \n \n ${this.allowTry === 'true' ? html` ` : ''}\n \n ${unsafeHTML(marked(param.description || ''))}\n ${this.exampleListTemplate.call(this, param.name, paramSchema.type, example.exampleList)}\n \n \n `);\n }\n\n return html`\n
${title}
\n
\n \n ${tableRows}\n
\n
`;\n }\n\n // This method is called before navigation change in focused mode\n async beforeNavigationFocusedMode() {\n // this.saveExampleState();\n }\n\n // This method is called after navigation change in focused mode\n async afterNavigationFocusedMode() {\n this.selectedRequestBodyType = '';\n this.selectedRequestBodyExample = '';\n this.updateExamplesFromDataAttr();\n this.clearResponseData();\n }\n\n // Request-Body Event Handlers\n onSelectExample(e) {\n this.selectedRequestBodyExample = e.target.value;\n const exampleDropdownEl = e.target;\n window.setTimeout((selectEl) => {\n const readOnlyExampleEl = selectEl.closest('.example-panel').querySelector('.request-body-param');\n const userInputExampleTextareaEl = selectEl.closest('.example-panel').querySelector('.request-body-param-user-input');\n userInputExampleTextareaEl.value = readOnlyExampleEl.innerText;\n\n const requestPanelEl = this.getRequestPanel({ target: selectEl });\n this.liveCURLSyntaxUpdate(requestPanelEl);\n }, 0, exampleDropdownEl);\n }\n\n onMimeTypeChange(e) {\n this.selectedRequestBodyType = e.target.value;\n const mimeDropdownEl = e.target;\n this.selectedRequestBodyExample = '';\n window.setTimeout((selectEl) => {\n const readOnlyExampleEl = selectEl.closest('.request-body-container').querySelector('.request-body-param');\n if (readOnlyExampleEl) {\n const userInputExampleTextareaEl = selectEl.closest('.request-body-container').querySelector('.request-body-param-user-input');\n userInputExampleTextareaEl.value = readOnlyExampleEl.innerText;\n }\n }, 0, mimeDropdownEl);\n }\n\n requestBodyTemplate() {\n if (!this.request_body) {\n return '';\n }\n if (Object.keys(this.request_body).length === 0) {\n return '';\n }\n\n // Variable to store partial HTMLs\n let reqBodyTypeSelectorHtml = '';\n let reqBodyFileInputHtml = '';\n let reqBodyFormHtml = '';\n let reqBodySchemaHtml = '';\n let reqBodyExampleHtml = '';\n\n const requestBodyTypes = [];\n const { content } = this.request_body;\n for (const mimeType in content) {\n requestBodyTypes.push({\n mimeType,\n schema: content[mimeType].schema,\n example: content[mimeType].example,\n examples: content[mimeType].examples,\n });\n if (!this.selectedRequestBodyType) {\n this.selectedRequestBodyType = mimeType;\n }\n }\n // MIME Type selector\n reqBodyTypeSelectorHtml = requestBodyTypes.length === 1\n ? ''\n : html`\n \n `;\n\n // For Loop - Main\n requestBodyTypes.forEach((reqBody) => {\n let schemaAsObj;\n let reqBodyExamples = [];\n\n if (this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text') || this.selectedRequestBodyType.includes('jose')) {\n // Generate Example\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n reqBodyExamples = generateExample(\n reqBody.schema,\n reqBody.mimeType,\n standardizeExample(reqBody.examples),\n standardizeExample(reqBody.example),\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n 'text',\n false,\n );\n if (!this.selectedRequestBodyExample) {\n this.selectedRequestBodyExample = (reqBodyExamples.length > 0 ? reqBodyExamples[0].exampleId : '');\n }\n reqBodyExampleHtml = html`\n ${reqBodyExampleHtml}\n
\n ${reqBodyExamples.length === 1\n ? ''\n : html`\n \n `\n }\n ${reqBodyExamples\n .filter((v) => v.exampleId === this.selectedRequestBodyExample)\n .map((v) => html`\n
\n ${v.exampleSummary && v.exampleSummary.length > 80 ? html`
${v.exampleSummary}
` : ''}\n ${v.exampleDescription ? html`
${unsafeHTML(marked(v.exampleDescription || ''))}
` : ''}\n \n
${(v.exampleFormat === 'text' ? v.exampleValue : JSON.stringify(v.exampleValue, null, 2))}
\n\n \n \n
\n `)}\n\n
\n `;\n }\n } else if (this.selectedRequestBodyType.includes('form-urlencoded') || this.selectedRequestBodyType.includes('form-data')) {\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n const ex = generateExample(\n reqBody.schema,\n reqBody.mimeType,\n reqBody.examples,\n reqBody.example,\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n 'text',\n false,\n );\n if (reqBody.schema) {\n reqBodyFormHtml = this.formDataTemplate(reqBody.schema, reqBody.mimeType, (ex[0] ? ex[0].exampleValue : ''));\n }\n }\n } else if ((/^audio\\/|^image\\/|^video\\/|^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$/.test(this.selectedRequestBodyType))) {\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n reqBodyFileInputHtml = html`\n
\n \n
\n `;\n }\n }\n\n // Generate Schema\n if (reqBody.mimeType.includes('json') || reqBody.mimeType.includes('xml') || reqBody.mimeType.includes('text') || this.selectedRequestBodyType.includes('jose')) {\n schemaAsObj = schemaInObjectNotation(reqBody.schema, {});\n if (this.schemaStyle === 'table') {\n reqBodySchemaHtml = html`\n ${reqBodySchemaHtml}\n \n `;\n } else if (this.schemaStyle === 'tree') {\n reqBodySchemaHtml = html`\n ${reqBodySchemaHtml}\n \n `;\n }\n }\n });\n\n return html`\n
\n
\n REQUEST BODY ${this.request_body.required ? html`*` : ''} \n ${this.selectedRequestBodyType}\n \n ${reqBodyTypeSelectorHtml}\n
\n ${this.request_body.description ? html`
${unsafeHTML(marked(this.request_body.description))}
` : ''}\n \n ${(this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text') || this.selectedRequestBodyType.includes('jose'))\n ? html`\n
\n
{ if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; } }}\">\n \n \n
\n ${html`
${reqBodyExampleHtml}
`}\n ${html`
${reqBodySchemaHtml}
`}\n
`\n : html` \n ${reqBodyFileInputHtml}\n ${reqBodyFormHtml}`\n }\n
\n `;\n }\n\n formDataParamAsObjectTemplate(fieldName, fieldSchema, mimeType) {\n // This template is used when form-data param should be send as a object (application/json, application/xml)\n const formdataPartSchema = schemaInObjectNotation(fieldSchema, {});\n const formdataPartExample = generateExample(\n fieldSchema,\n 'json',\n standardizeExample(fieldSchema.examples),\n standardizeExample(fieldSchema.example),\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n 'text',\n false,\n );\n\n return html`\n
\n
\n
{\n if (e.target.classList.contains('v-tab-btn')) {\n const { tab } = e.target.dataset;\n if (tab) {\n const tabPanelEl = e.target.closest('.tab-panel');\n const selectedTabBtnEl = tabPanelEl.querySelector(`.v-tab-btn[data-tab=\"${tab}\"]`);\n const otherTabBtnEl = [...tabPanelEl.querySelectorAll(`.v-tab-btn:not([data-tab=\"${tab}\"])`)];\n const selectedTabContentEl = tabPanelEl.querySelector(`.tab-content[data-tab=\"${tab}\"]`);\n const otherTabContentEl = [...tabPanelEl.querySelectorAll(`.tab-content:not([data-tab=\"${tab}\"])`)];\n selectedTabBtnEl.classList.add('active');\n selectedTabContentEl.style.display = 'block';\n otherTabBtnEl.forEach((el) => { el.classList.remove('active'); });\n otherTabContentEl.forEach((el) => { el.style.display = 'none'; });\n }\n }\n if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; }\n }}\">\n \n \n
\n
\n ${html`\n
\n \n
`\n }\n ${html`\n
\n \n
`\n }\n
\n `;\n }\n\n formDataTemplate(schema, mimeType, exampleValue = '') {\n const formDataTableRows = [];\n if (schema.properties) {\n for (const fieldName in schema.properties) {\n const fieldSchema = schema.properties[fieldName];\n if (fieldSchema.readOnly) {\n continue;\n }\n const fieldExamples = fieldSchema.examples || fieldSchema.example || '';\n const fieldType = fieldSchema.type;\n const paramSchema = getTypeInfo(fieldSchema);\n const labelColWidth = 'read focused'.includes(this.renderStyle) ? '200px' : '160px';\n const example = normalizeExamples((paramSchema.examples || paramSchema.example), paramSchema.type);\n formDataTableRows.push(html`\n \n \n
\n ${fieldName}${(schema.required?.includes(fieldName) || fieldSchema.required) ? html`*` : ''}\n
\n
${paramSchema.type}
\n \n \n ${fieldType === 'array'\n ? fieldSchema.items?.format === 'binary'\n ? html`\n
this.onAddRemoveFileInput(e, fieldName, mimeType)}\">\n
\n \n \n
\n \n
\n `\n : html`\n \n \n `\n : html`\n ${fieldType === 'object'\n ? this.formDataParamAsObjectTemplate.call(this, fieldName, fieldSchema, mimeType)\n : html`\n ${this.allowTry === 'true'\n ? html``\n : ''\n }\n `\n }`\n }\n \n ${fieldType === 'object'\n ? ''\n : html`\n \n ${paramSchema.default || paramSchema.constrain || paramSchema.allowedValues || paramSchema.pattern\n ? html`\n
\n ${paramSchema.default ? html`Default: ${paramSchema.default}
` : ''}\n ${paramSchema.pattern ? html`Pattern: ${paramSchema.pattern}
` : ''}\n ${paramSchema.constrain ? html`${paramSchema.constrain}
` : ''}\n ${paramSchema.allowedValues && paramSchema.allowedValues.split('┃').map((v, i) => html`\n ${i > 0 ? '┃' : html`Allowed: `}\n ${html`\n {\n const inputEl = e.target.closest('table').querySelector(`[data-pname=\"${fieldName}\"]`);\n if (inputEl) {\n if (e.target.dataset.type === 'array') {\n inputEl.value = [e.target.dataset.enum];\n } else {\n inputEl.value = e.target.dataset.enum;\n }\n }\n }}\"\n > \n ${v} \n `\n }`)\n }\n
`\n : ''\n }\n `\n }\n \n ${fieldType === 'object'\n ? ''\n : html`\n \n \n \n ${unsafeHTML(marked(fieldSchema.description || ''))}\n ${this.exampleListTemplate.call(this, fieldName, paramSchema.type, example.exampleList)}\n \n \n `\n }`);\n }\n return html`\n \n ${formDataTableRows}\n
\n `;\n }\n\n return html`\n \n ${schema.description ? html`${unsafeHTML(marked(schema.description))}` : ''}\n `;\n }\n\n curlSyntaxTemplate(display = 'flex') {\n return html`\n
\n \n
${unsafeHTML(Prism.highlight(this.curlSyntax.trim().replace(/\\\\$/, ''), Prism.languages.shell, 'shell'))}
\n
\n `;\n }\n\n apiResponseTabTemplate() {\n let responseFormat = '';\n let responseContent = '';\n if (!this.responseIsBlob) {\n if (this.responseHeaders.includes('application/x-ndjson')) {\n responseFormat = 'json';\n const prismLines = this.responseText.split('\\n').map((q) => Prism.highlight(q, Prism.languages[responseFormat], responseFormat)).join('\\n');\n responseContent = html`${unsafeHTML(prismLines)}`;\n } else if (this.responseHeaders.includes('json')) {\n responseFormat = 'json';\n responseContent = html`${unsafeHTML(Prism.highlight(this.responseText, Prism.languages[responseFormat], responseFormat))}`;\n } else if (this.responseHeaders.includes('html') || this.responseHeaders.includes('xml')) {\n responseFormat = 'html';\n responseContent = html`${unsafeHTML(Prism.highlight(this.responseText, Prism.languages[responseFormat], responseFormat))}`;\n } else {\n responseFormat = 'text';\n responseContent = html`${this.responseText}`;\n }\n }\n return html`\n
\n
Response Status: ${this.responseMessage}
\n
\n \n
\n
\n
{\n if (e.target.classList.contains('tab-btn') === false) { return; }\n this.activeResponseTab = e.target.dataset.tab;\n }}\">\n \n \n ${this.showCurlBeforeTry === 'true'\n ? ''\n : html``}\n
\n ${this.responseIsBlob\n ? html`\n
\n ${this.responseBlobType === 'image'\n ? html``\n : ''\n } \n \n ${this.responseBlobType === 'view' || this.responseBlobType === 'image'\n ? html``\n : ''\n }\n
`\n : html`\n
\n \n
${responseContent}
\n
`\n }\n
\n \n
${unsafeHTML(Prism.highlight(this.responseHeaders, Prism.languages.css, 'css'))}
\n
\n ${this.showCurlBeforeTry === 'true' ? '' : this.curlSyntaxTemplate(this.activeResponseTab === 'curl' ? 'flex' : 'none')}\n
`;\n }\n\n apiCallTemplate() {\n const selectedServerHtml = html`\n
\n ${this.serverUrl\n ? html`\n
\n
API Server
\n ${this.serverUrl} \n
\n `\n : ''\n }\n
\n `;\n\n return html`\n
\n
\n
\n ${selectedServerHtml}\n
\n
\n
Authentication
\n ${this.security?.length > 0\n ? html`\n ${this.api_keys.length > 0\n ? html`
\n ${this.api_keys.length === 1\n ? `${this.api_keys[0]?.typeDisplay} in ${this.api_keys[0].in}`\n : `${this.api_keys.length} API keys applied`\n } \n
`\n : html`
Required (None Applied)
`\n }`\n : html` Not Required `\n }\n
\n
\n ${\n this.parameters.length > 0 || this.request_body\n ? html`\n \n `\n : ''\n }\n \n
\n
\n ${this.showCurlBeforeTry === 'true' ? this.curlSyntaxTemplate() : ''}\n
\n ${this.responseMessage === '' ? '' : this.apiResponseTabTemplate()}\n `;\n }\n /* eslint-enable indent */\n\n async onFillRequestData(e) {\n const requestPanelEl = e.target.closest('.request-panel');\n const requestPanelInputEls = [...requestPanelEl.querySelectorAll('input, tag-input, textarea:not(.is-hidden)')];\n requestPanelInputEls.forEach((el) => {\n if (el.dataset.example) {\n if (el.tagName.toUpperCase() === 'TAG-INPUT') {\n el.value = el.dataset.example.split('~|~');\n } else {\n el.value = el.dataset.example;\n }\n }\n });\n }\n\n async onClearRequestData(e) {\n const requestPanelEl = e.target.closest('.request-panel');\n const requestPanelInputEls = [...requestPanelEl.querySelectorAll('input, tag-input, textarea:not(.is-hidden)')];\n requestPanelInputEls.forEach((el) => { el.value = ''; });\n }\n\n buildFetchURL(requestPanelEl) {\n let fetchUrl;\n const pathParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='path']\")];\n const queryParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='query']\")];\n const queryParamObjTypeEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='query-object']\")];\n fetchUrl = this.path;\n // Generate URL using Path Params\n pathParamEls.map((el) => {\n fetchUrl = fetchUrl.replace(`{${el.dataset.pname}}`, encodeURIComponent(el.value));\n });\n\n // Query Params\n const urlQueryParamsMap = new Map();\n const queryParamsWithReservedCharsAllowed = [];\n if (queryParamEls.length > 0) {\n queryParamEls.forEach((el) => {\n const queryParam = new URLSearchParams();\n if (el.dataset.paramAllowReserved === 'true') {\n queryParamsWithReservedCharsAllowed.push(el.dataset.pname);\n }\n if (el.dataset.array === 'false') {\n if (el.value !== '') {\n queryParam.append(el.dataset.pname, el.value);\n }\n } else {\n const { paramSerializeStyle, paramSerializeExplode } = el.dataset;\n let vals = ((el.value && Array.isArray(el.value)) ? el.value : []);\n vals = Array.isArray(vals) ? vals.filter((v) => v !== '') : [];\n if (vals.length > 0) {\n if (paramSerializeStyle === 'spaceDelimited') {\n queryParam.append(el.dataset.pname, vals.join(' ').replace(/^\\s|\\s$/g, ''));\n } else if (paramSerializeStyle === 'pipeDelimited') {\n queryParam.append(el.dataset.pname, vals.join('|').replace(/^\\||\\|$/g, ''));\n } else {\n if (paramSerializeExplode === 'true') { // eslint-disable-line no-lonely-if\n vals.forEach((v) => { queryParam.append(el.dataset.pname, v); });\n } else {\n queryParam.append(el.dataset.pname, vals.join(',').replace(/^,|,$/g, ''));\n }\n }\n }\n }\n if (queryParam.toString()) {\n urlQueryParamsMap.set(el.dataset.pname, queryParam);\n }\n });\n }\n\n // Query Params (Dynamic - create from JSON)\n if (queryParamObjTypeEls.length > 0) {\n queryParamObjTypeEls.map((el) => {\n const queryParam = new URLSearchParams();\n try {\n let queryParamObj = {};\n const { paramSerializeStyle, paramSerializeExplode, pname } = el.dataset;\n queryParamObj = Object.assign(queryParamObj, JSON.parse(el.value.replace(/\\s+/g, ' ')));\n if (el.dataset.paramAllowReserved === 'true') {\n queryParamsWithReservedCharsAllowed.push(el.dataset.pname);\n }\n if ('json xml'.includes(paramSerializeStyle)) {\n if (paramSerializeStyle === 'json') {\n queryParam.append(el.dataset.pname, JSON.stringify(queryParamObj));\n } else if (paramSerializeStyle === 'xml') {\n queryParam.append(el.dataset.pname, json2xml(queryParamObj));\n }\n } else {\n for (const key in queryParamObj) {\n const pKey = `${pname}[${key}]`;\n if (typeof queryParamObj[key] === 'object') {\n if (Array.isArray(queryParamObj[key])) {\n if (paramSerializeStyle === 'spaceDelimited') {\n queryParam.append(pKey, queryParamObj[key].join(' '));\n } else if (paramSerializeStyle === 'pipeDelimited') {\n queryParam.append(pKey, queryParamObj[key].join('|'));\n } else {\n if (paramSerializeExplode === 'true') { // eslint-disable-line no-lonely-if\n queryParamObj[key].forEach((v) => {\n queryParam.append(pKey, v);\n });\n } else {\n queryParam.append(pKey, queryParamObj[key]);\n }\n }\n }\n } else {\n queryParam.append(pKey, queryParamObj[key]);\n }\n }\n }\n } catch {\n console.error('RapiDoc: unable to parse %s into object', el.value); // eslint-disable-line no-console\n }\n if (queryParam.toString()) {\n urlQueryParamsMap.set(el.dataset.pname, queryParam);\n }\n });\n }\n let urlQueryParamString = '';\n if (urlQueryParamsMap.size) {\n urlQueryParamsMap.forEach((val, pname) => {\n if (queryParamsWithReservedCharsAllowed.includes(pname)) {\n urlQueryParamString += `${pname}=`;\n urlQueryParamString += val.getAll(pname).join(`&${pname}=`);\n urlQueryParamString += '&';\n } else {\n urlQueryParamString += `${val.toString()}&`;\n }\n });\n urlQueryParamString = urlQueryParamString.slice(0, -1);\n }\n if (urlQueryParamString.length !== 0) {\n fetchUrl = `${fetchUrl}${fetchUrl.includes('?') ? '&' : '?'}${urlQueryParamString}`;\n }\n\n // Add authentication Query-Param if provided\n this.api_keys\n .filter((v) => (v.in === 'query'))\n .forEach((v) => {\n fetchUrl = `${fetchUrl}${fetchUrl.includes('?') ? '&' : '?'}${v.name}=${encodeURIComponent(v.finalKeyValue)}`;\n });\n\n fetchUrl = `${this.serverUrl.replace(/\\/$/, '')}${fetchUrl}`;\n return fetchUrl;\n }\n\n buildFetchHeaders(requestPanelEl) {\n const respEl = this.closest('.expanded-req-resp-container, .req-resp-container')?.getElementsByTagName('api-response')[0];\n const headerParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='header'], [data-ptype='header-object']\")];\n const requestBodyContainerEl = requestPanelEl.querySelector('.request-body-container');\n const acceptHeader = respEl?.selectedMimeType;\n const reqHeaders = new Headers();\n if (acceptHeader) {\n // Uses the acceptHeader from Response panel\n reqHeaders.append('Accept', acceptHeader);\n } else if (this.accept) {\n reqHeaders.append('Accept', this.accept);\n }\n\n // Add Authentication Header if provided\n this.api_keys\n .filter((v) => (v.in === 'header'))\n .forEach((v) => {\n reqHeaders.append(v.name, v.finalKeyValue);\n });\n\n // Add Header Params\n headerParamEls.map((el) => {\n if (el.value) {\n if (el.dataset.ptype === 'header-object') {\n /* CONVERT\n a header value from below object style\n {\n \"key1\": \"val1\",\n \"key2\": {\n \"key2_1\": \"val2_1\",\n \"key2_2\": {\n \"key2_2_1\": \"val2_2_1\"\n }\n },\n \"key3\": \"val3\"\n };\n\n TO >>>\n key1=val1, key2={\"key2_1\":\"val2_1\",\"key2_2\":{\"key2_2_1\":\"val2_2_1\"}}, key3=val3\n */\n const headerObjVal = JSON.parse(el.value.replace(/\\n/g, '').trim());\n const firstLevelKeySeparator = el.dataset.paramSerializeExplode === 'true' ? '=' : ',';\n const headerStrVal = Object.keys(headerObjVal)\n .map((key) => {\n const value = headerObjVal[key];\n if (typeof value === 'object') {\n return `${key}${firstLevelKeySeparator}${JSON.stringify(value)}`;\n }\n return `${key}${firstLevelKeySeparator}${value}`;\n })\n .join(',');\n reqHeaders.append(el.dataset.pname, headerStrVal);\n } else {\n reqHeaders.append(el.dataset.pname, el.value);\n }\n }\n });\n\n if (requestBodyContainerEl) {\n const requestBodyType = requestBodyContainerEl.dataset.selectedRequestBodyType;\n // Common for all request-body\n if (!requestBodyType.includes('form-data')) {\n // For multipart/form-data dont set the content-type to allow creation of browser generated part boundaries\n reqHeaders.append('Content-Type', requestBodyType);\n }\n }\n return reqHeaders;\n }\n\n buildFetchBodyOptions(requestPanelEl) {\n const requestBodyContainerEl = requestPanelEl.querySelector('.request-body-container');\n const fetchOptions = {\n method: this.method.toUpperCase(),\n };\n if (requestBodyContainerEl) {\n const requestBodyType = requestBodyContainerEl.dataset.selectedRequestBodyType;\n if (requestBodyType.includes('form-urlencoded')) {\n // url-encoded Form Params (dynamic) - Parse JSON and generate Params\n const formUrlDynamicTextAreaEl = requestPanelEl.querySelector(\"[data-ptype='dynamic-form']\");\n if (formUrlDynamicTextAreaEl) {\n const val = formUrlDynamicTextAreaEl.value;\n const formUrlDynParams = new URLSearchParams();\n let proceed = true;\n let tmpObj;\n if (val) {\n try {\n tmpObj = JSON.parse(val);\n } catch (err) {\n proceed = false;\n console.warn('RapiDoc: Invalid JSON provided', err); // eslint-disable-line no-console\n }\n } else {\n proceed = false;\n }\n if (proceed) {\n for (const prop in tmpObj) {\n formUrlDynParams.append(prop, JSON.stringify(tmpObj[prop]));\n }\n fetchOptions.body = formUrlDynParams;\n }\n } else {\n // url-encoded Form Params (regular)\n const formUrlEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='form-urlencode']\")];\n const formUrlParams = new URLSearchParams();\n formUrlEls\n .filter((v) => (v.type !== 'file'))\n .forEach((el) => {\n if (el.dataset.array === 'false') {\n if (el.value) {\n formUrlParams.append(el.dataset.pname, el.value);\n }\n } else {\n const vals = (el.value && Array.isArray(el.value)) ? el.value.join(',') : '';\n formUrlParams.append(el.dataset.pname, vals);\n }\n });\n fetchOptions.body = formUrlParams;\n }\n } else if (requestBodyType.includes('form-data')) {\n const formDataParams = new FormData();\n const formDataEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='form-data']\")];\n formDataEls.forEach((el) => {\n if (el.dataset.array === 'false') {\n if (el.type === 'file' && el.files[0]) {\n formDataParams.append(el.dataset.pname, el.files[0], el.files[0].name);\n } else if (el.value) {\n formDataParams.append(el.dataset.pname, el.value);\n }\n } else if (el.value && Array.isArray(el.value)) {\n formDataParams.append(el.dataset.pname, el.value.join(','));\n }\n });\n fetchOptions.body = formDataParams;\n } else if (/^audio\\/|^image\\/|^video\\/|^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$/.test(requestBodyType)) {\n const bodyParamFileEl = requestPanelEl.querySelector('.request-body-param-file');\n if (bodyParamFileEl?.files[0]) {\n fetchOptions.body = bodyParamFileEl.files[0]; // eslint-disable-line prefer-destructuring\n }\n } else if (requestBodyType.includes('json') || requestBodyType.includes('xml') || requestBodyType.includes('text')) {\n const exampleTextAreaEl = requestPanelEl.querySelector('.request-body-param-user-input');\n if (exampleTextAreaEl?.value) {\n fetchOptions.body = exampleTextAreaEl.value;\n }\n }\n }\n\n return fetchOptions;\n }\n\n async onTryClick(e) {\n const tryBtnEl = e.target;\n const requestPanelEl = tryBtnEl.closest('.request-panel');\n const fetchUrl = this.buildFetchURL(requestPanelEl);\n const fetchOptions = this.buildFetchBodyOptions(requestPanelEl);\n const reqHeaders = this.buildFetchHeaders(requestPanelEl);\n this.responseUrl = '';\n this.responseHeaders = [];\n this.curlSyntax = this.generateCURLSyntax(fetchUrl, reqHeaders, fetchOptions, requestPanelEl);\n this.responseStatus = 'success';\n this.responseIsBlob = false;\n\n this.respContentDisposition = '';\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n if (this.fetchCredentials) {\n fetchOptions.credentials = this.fetchCredentials;\n }\n const controller = new AbortController();\n const { signal } = controller;\n fetchOptions.headers = reqHeaders;\n const tempRequest = { url: fetchUrl, ...fetchOptions };\n this.dispatchEvent(new CustomEvent('before-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: tempRequest,\n controller,\n },\n }));\n const updatedFetchOptions = {\n method: tempRequest.method,\n headers: tempRequest.headers,\n credentials: tempRequest.credentials,\n body: tempRequest.body,\n };\n const fetchRequest = new Request(tempRequest.url, updatedFetchOptions);\n\n let fetchResponse;\n let responseClone;\n try {\n let respBlob;\n let respJson;\n let respText;\n tryBtnEl.disabled = true;\n this.responseText = '⌛';\n this.responseMessage = '';\n this.requestUpdate();\n const startTime = performance.now();\n fetchResponse = await fetch(fetchRequest, { signal });\n const endTime = performance.now();\n // Allow to modify response\n /*\n let resolveModifiedResponse; // Create a promise that will be resolved from the event listener\n const modifiedResponsePromise = new Promise((resolve) => {\n resolveModifiedResponse = resolve;\n });\n this.dispatchEvent(new CustomEvent('fetched-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: fetchRequest,\n response: fetchResponse,\n resolveModifiedResponse, // pass the resolver function\n },\n }));\n fetchResponse = await modifiedResponsePromise; // Wait for the modified response\n */\n responseClone = fetchResponse.clone(); // create a response clone to allow reading response body again (response.json, response.text etc)\n tryBtnEl.disabled = false;\n this.responseMessage = html`${fetchResponse.statusText ? `${fetchResponse.statusText}:${fetchResponse.status}` : fetchResponse.status}
Took ${Math.round(endTime - startTime)} milliseconds
`;\n this.responseUrl = fetchResponse.url;\n const respHeadersObj = {};\n fetchResponse.headers.forEach((hdrVal, hdr) => {\n respHeadersObj[hdr] = hdrVal;\n this.responseHeaders = `${this.responseHeaders}${hdr}: ${hdrVal}\\n`;\n });\n let contentType = fetchResponse.headers.get('content-type');\n const respEmpty = (await fetchResponse.clone().text()).length === 0;\n if (respEmpty) {\n this.responseText = '';\n } else if (contentType) {\n contentType = contentType.split(';')[0].trim();\n if (contentType === 'application/x-ndjson') {\n this.responseText = await fetchResponse.text();\n } else if (contentType.includes('json')) {\n if ((/charset=[^\"']+/).test(contentType)) {\n const encoding = contentType.split('charset=')[1];\n const buffer = await fetchResponse.arrayBuffer();\n try {\n respText = new TextDecoder(encoding).decode(buffer);\n } catch {\n respText = new TextDecoder('utf-8').decode(buffer);\n }\n try {\n respJson = JSON.parse(respText);\n this.responseText = JSON.stringify(respJson, null, 2);\n } catch {\n this.responseText = respText;\n }\n } else {\n respJson = await fetchResponse.json();\n this.responseText = JSON.stringify(respJson, null, 2);\n }\n // eslint-disable-next-line no-useless-escape\n } else if (/^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$|^application\\/vnd\\./.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'download';\n } else if (/^image/.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'image';\n } else if (/^audio|^image|^video/.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'view';\n } else {\n respText = await fetchResponse.text();\n if (contentType.includes('xml')) {\n this.responseText = formatXml(respText, { textNodesOnSameLine: true, indentor: ' ' });\n } else {\n this.responseText = respText;\n }\n }\n if (this.responseIsBlob) {\n const contentDisposition = fetchResponse.headers.get('content-disposition');\n let filenameFromContentDeposition = 'filename';\n const filenameStarRegexMatch = contentDisposition.match(/filename\\*=\\s*UTF-8''([^;]+)/); // Support Headers like >>> Content-Disposition: attachment; filename*=UTF-8''example%20file.pdf\n if (filenameStarRegexMatch) {\n filenameFromContentDeposition = decodeURIComponent(filenameStarRegexMatch[1]); // the filename* format in the Content-Disposition header follows RFC 5987, which allows encoding non-ASCII characters using percent encoding. so example%20file.pdf becomes example file.pdf\n } else {\n // Fallback to the regular filename format\n const filenameMatch = contentDisposition.match(/filename=\"?([^\"]+)\"?/); // Content-Disposition: attachment; filename=example.pdf\n if (filenameMatch) {\n filenameFromContentDeposition = filenameMatch[1];\n }\n }\n this.respContentDisposition = filenameFromContentDeposition;\n respBlob = await fetchResponse.blob();\n this.responseBlobUrl = URL.createObjectURL(respBlob);\n }\n } else {\n respText = await fetchResponse.text();\n this.responseText = respText;\n }\n this.dispatchEvent(new CustomEvent('after-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: fetchRequest,\n response: responseClone,\n responseHeaders: respHeadersObj,\n responseBody: respJson || respText || respBlob,\n responseStatus: responseClone.ok,\n },\n }));\n } catch (err) {\n tryBtnEl.disabled = false;\n if (err.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('request-aborted', {\n bubbles: true,\n composed: true,\n detail: {\n err,\n request: fetchRequest,\n },\n }));\n this.responseMessage = 'Request Aborted';\n this.responseText = 'Request Aborted';\n } else {\n this.dispatchEvent(new CustomEvent('after-try', {\n bubbles: true,\n composed: true,\n detail: {\n err,\n request: fetchRequest,\n },\n }));\n this.responseMessage = `${err.message} (CORS or Network Issue)`;\n }\n }\n this.requestUpdate();\n }\n\n liveCURLSyntaxUpdate(requestPanelEl) {\n this.applyCURLSyntax(requestPanelEl);\n this.requestUpdate();\n }\n\n onGenerateCURLClick(e) {\n const requestPanelEl = this.getRequestPanel(e);\n this.applyCURLSyntax(requestPanelEl);\n }\n\n getRequestPanel(e) {\n return e.target.closest('.request-panel');\n }\n\n applyCURLSyntax(requestPanelEl) {\n const fetchUrl = this.buildFetchURL(requestPanelEl);\n const fetchOptions = this.buildFetchBodyOptions(requestPanelEl);\n const fetchHeaders = this.buildFetchHeaders(requestPanelEl);\n\n this.curlSyntax = this.generateCURLSyntax(fetchUrl, fetchHeaders, fetchOptions, requestPanelEl);\n }\n\n generateCURLSyntax(fetchUrl, fetchHeaders, fetchOptions, requestPanelEl) {\n let curlUrl;\n let curl = '';\n let curlHeaders = '';\n let curlData = '';\n let curlForm = '';\n const requestBodyContainerEl = requestPanelEl.querySelector('.request-body-container');\n\n if (fetchUrl.startsWith('http') === false) {\n const url = new URL(fetchUrl, window.location.href);\n curlUrl = url.href;\n } else {\n curlUrl = fetchUrl;\n }\n\n curl = `curl -X ${this.method.toUpperCase()} \"${curlUrl}\" \\\\\\n`;\n\n fetchHeaders.forEach((value, key) => {\n let tempHeaderArray = value.split(',');\n tempHeaderArray = tempHeaderArray.map((el) => el.trim()).filter((string, index) => tempHeaderArray.indexOf(string) === index);\n fetchHeaders.set(key, tempHeaderArray.join(', '));\n });\n\n curlHeaders = Array.from(fetchHeaders).map(([key, value]) => ` -H '${key}: ${value}'`).join('\\\\\\n');\n if (curlHeaders) {\n curlHeaders = `${curlHeaders} \\\\\\n`;\n }\n if (fetchOptions.body instanceof URLSearchParams) {\n curlData = ` -d ${fetchOptions.body.toString()} \\\\\\n`;\n } else if (fetchOptions.body instanceof File) {\n curlData = ` --data-binary @${fetchOptions.body.name} \\\\\\n`;\n } else if (fetchOptions.body instanceof FormData) {\n curlForm = Array.from(fetchOptions.body).reduce((aggregator, [key, value]) => {\n if (value instanceof File) {\n return [...aggregator, ` -F \"${key}=@${value.name}\"`];\n }\n\n const multiple = value.match(/([^,],)/gm);\n\n if (multiple) {\n const multipleResults = multiple.map((one) => `-F \"${key}[]=${one}\"`);\n\n return [...aggregator, ...multipleResults];\n }\n\n return [...aggregator, ` -F \"${key}=${value}\"`];\n }, []).join('\\\\\\n');\n } else if (requestBodyContainerEl && requestBodyContainerEl.dataset.selectedRequestBodyType) {\n const requestBodyType = requestBodyContainerEl.dataset.selectedRequestBodyType;\n const exampleTextAreaEl = requestPanelEl.querySelector('.request-body-param-user-input');\n if (exampleTextAreaEl?.value) {\n fetchOptions.body = exampleTextAreaEl.value;\n if (requestBodyType.includes('json')) {\n try {\n curlData = ` -d '${JSON.stringify(JSON.parse(exampleTextAreaEl.value))}' \\\\\\n`;\n } catch {\n // Ignore.\n }\n }\n if (!curlData) {\n curlData = ` -d '${exampleTextAreaEl.value.replace(/'/g, '\\'\"\\'\"\\'')}' \\\\\\n`;\n }\n }\n }\n\n return `${curl}${curlHeaders}${curlData}${curlForm}`;\n }\n\n onAddRemoveFileInput(e, pname, ptype) {\n if (e.target.tagName.toLowerCase() !== 'button') {\n return;\n }\n\n if (e.target.classList.contains('file-input-remove-btn')) {\n // Remove File Input Set\n const el = e.target.closest('.input-set');\n el.remove();\n return;\n }\n const el = e.target.closest('.file-input-container');\n\n // Add File Input Set\n\n // Container\n const newInputContainerEl = document.createElement('div');\n newInputContainerEl.setAttribute('class', 'input-set row');\n\n // File Input\n const newInputEl = document.createElement('input');\n newInputEl.type = 'file';\n newInputEl.style = 'width:200px; margin-top:2px;';\n newInputEl.setAttribute('data-pname', pname);\n newInputEl.setAttribute('data-ptype', ptype.includes('form-urlencode') ? 'form-urlencode' : 'form-data');\n newInputEl.setAttribute('data-array', 'false');\n newInputEl.setAttribute('data-file-array', 'true');\n\n // Remover Button\n const newRemoveBtnEl = document.createElement('button');\n newRemoveBtnEl.setAttribute('class', 'file-input-remove-btn');\n newRemoveBtnEl.innerHTML = '✕';\n\n newInputContainerEl.appendChild(newInputEl);\n newInputContainerEl.appendChild(newRemoveBtnEl);\n el.insertBefore(newInputContainerEl, e.target);\n // el.appendChild(newInputContainerEl);\n }\n\n clearResponseData() {\n this.responseUrl = '';\n this.responseHeaders = '';\n this.responseText = '';\n this.responseStatus = 'success';\n this.responseMessage = '';\n this.responseIsBlob = false;\n this.responseBlobType = '';\n this.respContentDisposition = '';\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n }\n\n disconnectedCallback() {\n this.curlSyntax = '';\n // Cleanup ObjectURL for the blob data if this component created one\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n super.disconnectedCallback();\n }\n}\n\n// Register the element with the browser\ncustomElements.define('api-request', ApiRequest);\n","import RandExp from 'randexp';\n\n// Make RandExp determinist\nRandExp.prototype.randInt = (from) => from;\n\n// Takes a value as input and provides a printable string to replresent null values, spaces, blankstring etc\nexport function getPrintableVal(val) {\n if (val === undefined) {\n return '';\n }\n if (val === null) {\n return 'null';\n }\n if (val === '') {\n return '∅';\n }\n if (typeof val === 'boolean' || typeof val === 'number') {\n return `${val}`;\n }\n if (Array.isArray(val)) {\n return val.map((v) => (v === null ? 'null' : v === '' ? '∅' : v.toString().replace(/^ +| +$/g, (m) => '●'.repeat(m.length)) || '')).join(', ');\n }\n if (typeof val === 'object') {\n const keys = Object.keys(val);\n return `{ ${keys[0]}:${val[keys[0]]}${keys.length > 1 ? ',' : ''} ... }`;\n }\n return val.toString().replace(/^ +| +$/g, (m) => '●'.repeat(m.length)) || '';\n}\n\n/* Generates an schema object containing type and constraint info */\nexport function getTypeInfo(schema) {\n if (!schema) {\n return;\n }\n let dataType = '';\n let constrain = '';\n // let examples;\n\n if (schema.$ref) {\n const n = schema.$ref.lastIndexOf('/');\n const schemaNode = schema.$ref.substring(n + 1);\n dataType = `{recursive: ${schemaNode}} `;\n } else if (schema.type) {\n dataType = Array.isArray(schema.type) ? schema.type.join(schema.length === 2 ? ' or ' : '┃') : schema.type;\n if (schema.format || schema.enum || schema.const) {\n dataType = dataType.replace('string', schema.enum ? 'enum' : schema.const ? 'const' : schema.format);\n }\n if (schema.nullable) {\n dataType += '┃null';\n }\n } else if (schema.const) {\n dataType = 'const';\n } else if (Object.keys(schema).length === 0) {\n dataType = 'any';\n } else {\n dataType = '{missing-type-info}';\n }\n\n const info = {\n type: dataType,\n format: schema.format || '',\n pattern: (schema.pattern && !schema.enum) ? schema.pattern : '',\n readOrWriteOnly: (schema.readOnly ? '🆁' : schema.writeOnly ? '🆆' : ''),\n deprecated: schema.deprecated ? '❌' : '',\n examples: schema.examples || schema.example,\n default: getPrintableVal(schema.default),\n description: schema.description || '',\n constrain: '',\n allowedValues: '',\n arrayType: '',\n html: '',\n };\n\n if (info.type === '{recursive}') {\n info.description = schema.$ref.substring(schema.$ref.lastIndexOf('/') + 1);\n } else if (info.type === '{missing-type-info}' || info.type === 'any') {\n info.description = info.description || '';\n }\n // Set Allowed Values\n info.allowedValues = schema.const\n ? schema.const\n : Array.isArray(schema.enum)\n ? schema.enum.map((v) => (getPrintableVal(v))).join('┃')\n : '';\n\n if (dataType === 'array' && schema.items) {\n const arrayItemType = schema.items?.type;\n const arrayItemDefault = getPrintableVal(schema.items.default);\n\n info.arrayType = `${schema.type} of ${Array.isArray(arrayItemType) ? arrayItemType.join('') : arrayItemType}`;\n info.default = arrayItemDefault;\n info.allowedValues = schema.items.const\n ? schema.const\n : Array.isArray(schema.items?.enum)\n ? schema.items.enum.map((v) => (getPrintableVal(v))).join('┃')\n : '';\n }\n if (dataType.match(/integer|number/g)) {\n if (schema.minimum !== undefined || schema.exclusiveMinimum !== undefined) {\n constrain += schema.minimum !== undefined ? `Min ${schema.minimum}` : `More than ${schema.exclusiveMinimum}`;\n }\n if (schema.maximum !== undefined || schema.exclusiveMaximum !== undefined) {\n constrain += schema.maximum !== undefined ? `${constrain ? '┃' : ''}Max ${schema.maximum}` : `${constrain ? '┃' : ''}Less than ${schema.exclusiveMaximum}`;\n }\n if (schema.multipleOf !== undefined) {\n constrain += `${constrain ? '┃' : ''} multiple of ${schema.multipleOf}`;\n }\n }\n if (dataType.match(/string/g)) {\n if (schema.minLength !== undefined && schema.maxLength !== undefined) {\n constrain += `${constrain ? '┃' : ''}${schema.minLength} to ${schema.maxLength} chars`;\n } else if (schema.minLength !== undefined) {\n constrain += `${constrain ? '┃' : ''}Min ${schema.minLength} chars`;\n } else if (schema.maxLength !== undefined) {\n constrain += `Max ${constrain ? '┃' : ''}${schema.maxLength} chars`;\n }\n }\n info.constrain = constrain;\n info.html = `${info.type}~|~${info.readOrWriteOnly}~|~${info.constrain}~|~${info.default}~|~${info.allowedValues}~|~${info.pattern}~|~${info.description}~|~${schema.title || ''}~|~${info.deprecated ? 'deprecated' : ''}`;\n return info;\n}\n\n/**\n *\n * @param {*} ex if the value\n * - Is an Object with 'value' property like\n * { 'value': 'example_val1', 'description': 'some description' }\n * Returns >>>\n * {\n * 'Example': { 'value' : 'example_val1', 'description': 'some description' },\n * }\n * - Is an object where each key represents a valid example object (i,e has a value property)\n * {\n * 'example1': { 'value' : 'example_val1', 'description': 'some description' },\n * 'example2': { 'value' : 'example_val2', 'description': 'some other description' },\n * 'invalid': { 'description': 'invalid example object without any value property' }\n * }\n * Returns >>>\n * {\n * 'example1': { 'value' : 'example_val1', 'description': 'some description' },\n * 'example2': { 'value' : 'example_val2', 'description': 'some other description' }\n * }\n * if none of the keys represents an object with 'value' property then return undefined\n * - Is an array of premitive values\n * ['example_val1', 'example_val2']\n * Returns >>>\n * {\n * 'Example1': {value:'value1'}\n * 'Example2': {value:'value2'}\n * }\n * - Is a premitive value\n * 'example_val1'\n * Returns >>>\n * {\n * 'Example': { 'value': 'example_val1' }\n * }\n * - Is undefined\n * returns undefined\n * @returns\n */\n\nexport function standardizeExample(ex) {\n if (typeof ex === 'object' && !Array.isArray(ex)) {\n if (ex.value !== undefined) {\n // Case 1: Single object with 'value' property\n return { Example: { ...ex } };\n }\n // Case 2: Object where each key is an object with a 'value' property\n const filteredEntries = Object.entries(ex).filter(([_, obj]) => obj.value !== undefined); // eslint-disable-line\n // If no valid entries found, return JSON.stringify of the input\n if (filteredEntries.length === 0) {\n return undefined;\n }\n return Object.fromEntries(filteredEntries);\n } if (Array.isArray(ex)) {\n // Case 3: Array of primitive values\n return ex.reduce((acc, value, index) => {\n acc[`Example${index + 1}`] = { value };\n return acc;\n }, {});\n }\n // Case 4: Single primitive value\n return ex ? { Example: { value: ex } } : undefined;\n}\n\n/**\n * Normalize example object in the following format (List of object which is used to render example links and fill the input boxes)\n * [{\n * exampleVal : 'value to be rendered on the input control (text-box)',\n * exampleList : [\n * value : '',\n * printableValue: '',\n * summary : '',\n * description : ''\n * ]\n * }]\n * */\nexport function normalizeExamples(examples, dataType = 'string') {\n if (!examples) {\n return {\n exampleVal: '',\n exampleList: [],\n };\n }\n if (examples.constructor === Object) {\n const exampleList = Object.values(examples)\n .filter((v) => (v['x-example-show-value'] !== false))\n .map((v) => ({\n value: (typeof v.value === 'boolean' || typeof v.value === 'number' ? `${v.value}` : (v.value || '')),\n printableValue: getPrintableVal(v.value),\n summary: v.summary || '',\n description: v.description || '',\n }));\n const exampleVal = exampleList.length > 0\n ? exampleList[0].value\n : '';\n return { exampleVal, exampleList };\n }\n\n // This is non-standard way to provide example but will support for now\n if (!Array.isArray(examples)) {\n examples = examples ? [examples] : [];\n }\n\n if (examples.length === 0) {\n return {\n exampleVal: '',\n exampleList: [],\n };\n }\n\n if (dataType === 'array') {\n const [exampleVal] = examples;\n const exampleList = examples.map((v) => ({\n value: v,\n printableValue: getPrintableVal(v),\n }));\n return { exampleVal, exampleList };\n }\n\n const exampleVal = examples[0].toString();\n const exampleList = examples.map((v) => ({\n value: v.toString(),\n printableValue: getPrintableVal(v),\n }));\n return { exampleVal, exampleList };\n}\n\nexport function anyExampleWithSummaryOrDescription(examples) {\n return examples.some((x) => x.summary?.length > 0 || x.description?.length > 0);\n}\n\nexport function getSampleValueByType(schemaObj) {\n const example = schemaObj.examples\n ? schemaObj.examples[0]\n : schemaObj.example === null\n ? null\n : schemaObj.example || undefined;\n if (example === '') { return ''; }\n if (example === null) { return null; }\n if (example === 0) { return 0; }\n if (example === false) { return false; }\n if (example instanceof Date) {\n switch (schemaObj.format.toLowerCase()) {\n case 'date':\n return example.toISOString().split('T')[0];\n case 'time':\n return example.toISOString().split('T')[1];\n default:\n return example.toISOString();\n }\n }\n if (example) { return example; }\n\n if (Object.keys(schemaObj).length === 0) {\n return null;\n }\n if (schemaObj.$ref) {\n // Indicates a Circular ref\n return {};\n }\n if (schemaObj.const === false || schemaObj.const === 0 || schemaObj.const === null || schemaObj.const === '') {\n return schemaObj.const;\n }\n if (schemaObj.const) {\n return schemaObj.const;\n }\n if (schemaObj.default) {\n return schemaObj.default;\n }\n const typeValue = Array.isArray(schemaObj.type) ? schemaObj.type[0] : schemaObj.type;\n if (!typeValue) {\n return null;\n }\n if (typeValue.match(/^integer|^number/g)) {\n const multipleOf = Number.isNaN(Number(schemaObj.multipleOf)) ? undefined : Number(schemaObj.multipleOf);\n const maximum = Number.isNaN(Number(schemaObj.maximum)) ? undefined : Number(schemaObj.maximum);\n const minimumPossibleVal = Number.isNaN(Number(schemaObj.minimum))\n ? Number.isNaN(Number(schemaObj.exclusiveMinimum))\n ? maximum || 0\n : Number(schemaObj.exclusiveMinimum) + (typeValue.startsWith('integer') ? 1 : 0.001)\n : Number(schemaObj.minimum);\n const finalVal = multipleOf\n ? multipleOf >= minimumPossibleVal\n ? multipleOf\n : minimumPossibleVal % multipleOf === 0\n ? minimumPossibleVal\n : Math.ceil(minimumPossibleVal / multipleOf) * multipleOf\n : minimumPossibleVal;\n return finalVal;\n }\n if (typeValue.match(/^boolean/g)) { return false; }\n if (typeValue.match(/^null/g)) { return null; }\n if (typeValue.match(/^string/g)) {\n if (schemaObj.enum) { return schemaObj.enum[0]; }\n if (schemaObj.const) { return schemaObj.const; }\n if (schemaObj.pattern) {\n try {\n return new RandExp(schemaObj.pattern).gen();\n } catch {\n return schemaObj.pattern;\n }\n }\n if (schemaObj.format) {\n const u = `${Date.now().toString(16)}${Math.random().toString(16)}0`.repeat(16);\n switch (schemaObj.format.toLowerCase()) {\n case 'url':\n case 'uri':\n return 'http://example.com';\n case 'date':\n return (new Date(0)).toISOString().split('T')[0];\n case 'time':\n return (new Date(0)).toISOString().split('T')[1];\n case 'date-time':\n return (new Date(0)).toISOString();\n case 'duration':\n return 'P3Y6M4DT12H30M5S'; // P=Period 3-Years 6-Months 4-Days 12-Hours 30-Minutes 5-Seconds\n case 'email':\n case 'idn-email':\n return 'user@example.com';\n case 'hostname':\n case 'idn-hostname':\n return 'www.example.com';\n case 'ipv4':\n return '198.51.100.42';\n case 'ipv6':\n return '2001:0db8:5b96:0000:0000:426f:8e17:642a';\n case 'uuid':\n return [u.substring(0, 8), u.substring(8, 12), `4000-8${u.substring(13, 16)}`, u.substring(16, 28)].join('-');\n case 'byte':\n return 'ZXhhbXBsZQ=='; // 'example' base64 encoded. See https://spec.openapis.org/oas/v3.0.0#data-types\n default:\n return '';\n }\n } else {\n const minLength = Number.isNaN(schemaObj.minLength) ? undefined : Number(schemaObj.minLength);\n const maxLength = Number.isNaN(schemaObj.maxLength) ? undefined : Number(schemaObj.maxLength);\n const finalLength = minLength || (maxLength > 6 ? 6 : maxLength || undefined);\n return finalLength ? 'A'.repeat(finalLength) : 'string';\n }\n }\n // If type cannot be determined\n return null;\n}\n\n/*\njson2xml- TestCase\n {\n 'prop1' : 'one',\n 'prop2' : 'two',\n 'prop3' : [ 'a', 'b', 'c' ],\n 'prop4' : {\n 'ob1' : 'val-1',\n 'ob2' : 'val-2'\n }\n }\n \n simple\n \n <0>a\n <1>b\n <2>c\n \n \n val-1\n val-2\n \n \n*/\nexport function json2xml(obj, level = 1) {\n const indent = ' '.repeat(level);\n let xmlText = '';\n if (level === 1 && typeof obj !== 'object') {\n return `\\n${indent}${obj.toString()}`;\n }\n for (const prop in obj) {\n const tagNameOrProp = (obj[prop]['::XML_TAG'] || prop);\n let tagName = '';\n if (Array.isArray(obj[prop])) {\n tagName = tagNameOrProp[0]['::XML_TAG'] || `${prop}`;\n } else {\n tagName = tagNameOrProp;\n }\n if (prop.startsWith('::')) {\n continue;\n }\n if (Array.isArray(obj[prop])) {\n xmlText = `${xmlText}\\n${indent}<${tagName}>${json2xml(obj[prop], level + 1)}\\n${indent}`;\n } else if (typeof obj[prop] === 'object') {\n xmlText = `${xmlText}\\n${indent}<${tagName}>${json2xml(obj[prop], level + 1)}\\n${indent}`;\n } else {\n xmlText = `${xmlText}\\n${indent}<${tagName}>${obj[prop].toString()}`;\n }\n }\n return xmlText;\n}\n\nfunction addSchemaInfoToExample(schema, obj) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n if (schema.title) {\n obj['::TITLE'] = schema.title;\n }\n if (schema.description) {\n obj['::DESCRIPTION'] = schema.description;\n }\n if (schema.xml?.name) {\n obj['::XML_TAG'] = schema.xml?.name;\n }\n if (schema.xml?.wrapped) {\n obj['::XML_WRAP'] = schema.xml?.wrapped.toString();\n }\n}\n\nfunction removeTitlesAndDescriptions(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n delete obj['::TITLE'];\n delete obj['::DESCRIPTION'];\n delete obj['::XML_TAG'];\n delete obj['::XML_WRAP'];\n for (const k in obj) {\n removeTitlesAndDescriptions(obj[k]);\n }\n}\n\nfunction addPropertyExampleToObjectExamples(example, obj, propertyKey) {\n for (const key in obj) {\n obj[key][propertyKey] = example;\n }\n}\n\nfunction mergePropertyExamples(obj, propertyName, propExamples) {\n // Create an example for each variant of the propertyExample, merging them with the current (parent) example\n let i = 0;\n const maxCombinations = 10;\n const mergedObj = {};\n for (const exampleKey in obj) {\n for (const propExampleKey in propExamples) {\n mergedObj[`example-${i}`] = { ...obj[exampleKey] };\n mergedObj[`example-${i}`][propertyName] = propExamples[propExampleKey];\n i++;\n if (i >= maxCombinations) {\n break;\n }\n }\n if (i >= maxCombinations) {\n break;\n }\n }\n return mergedObj;\n}\n\n/* For changing JSON-Schema to a Sample Object, as per the schema (to generate examples based on schema) */\nexport function schemaToSampleObj(schema, config = { }) {\n let obj = {};\n if (!schema) {\n return;\n }\n if (schema.allOf) {\n const objWithAllProps = {};\n\n if (schema.allOf.length === 1 && !schema.allOf[0]?.properties && !schema.allOf[0]?.items) {\n // If allOf has single item and the type is not an object or array, then its a primitive\n if (schema.allOf[0].$ref) {\n return '{ }';\n }\n if (schema.allOf[0].readOnly && config.includeReadOnly) {\n const tempSchema = schema.allOf[0];\n return getSampleValueByType(tempSchema);\n }\n return;\n }\n\n schema.allOf.forEach((v) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const partialObj = schemaToSampleObj(v, config);\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type === 'array' || v.items) {\n const partialObj = [schemaToSampleObj(v, config)];\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type) {\n const prop = `prop${Object.keys(objWithAllProps).length}`;\n objWithAllProps[prop] = getSampleValueByType(v);\n } else {\n return '';\n }\n });\n\n obj = objWithAllProps;\n } else if (schema.oneOf) {\n // 1. First create example with scheme.properties\n const objWithSchemaProps = {};\n if (schema.properties) {\n for (const propertyName in schema.properties) {\n if (schema.properties[propertyName].properties || schema.properties[propertyName].properties?.items) {\n objWithSchemaProps[propertyName] = schemaToSampleObj(schema.properties[propertyName], config);\n } else {\n objWithSchemaProps[propertyName] = getSampleValueByType(schema.properties[propertyName]);\n }\n }\n }\n\n if (schema.oneOf.length > 0) {\n /*\n oneOf:\n - type: object\n properties:\n option1_PropA:\n type: string\n option1_PropB:\n type: string\n - type: object\n properties:\n option2_PropX:\n type: string\n properties:\n prop1:\n type: string\n prop2:\n type: string\n minLength: 10\n\n The aboove Schem should generate the following 2 examples\n\n Example-1\n {\n prop1: 'string',\n prop2: 'AAAAAAAAAA', <-- min-length 10\n option1_PropA: 'string',\n option1_PropB: 'string'\n }\n\n Example-2\n {\n prop1: 'string',\n prop2: 'AAAAAAAAAA', <-- min-length 10\n option2_PropX: 'string'\n }\n */\n let i = 0;\n // Merge all examples of each oneOf-schema\n for (const key in schema.oneOf) {\n const oneOfSamples = schemaToSampleObj(schema.oneOf[key], config);\n for (const sampleKey in oneOfSamples) {\n // 2. In the final example include a one-of item along with properties\n let finalExample;\n if (Object.keys(objWithSchemaProps).length > 0) {\n if (oneOfSamples[sampleKey] === null || typeof oneOfSamples[sampleKey] !== 'object') {\n // This doesn't really make sense since every oneOf schema _should_ be an object if there are common properties, so we'll skip this\n continue;\n } else {\n finalExample = Object.assign(oneOfSamples[sampleKey], objWithSchemaProps);\n }\n } else {\n finalExample = oneOfSamples[sampleKey];\n }\n obj[`example-${i}`] = finalExample;\n addSchemaInfoToExample(schema.oneOf[key], obj[`example-${i}`]);\n i++;\n }\n }\n }\n } else if (schema.anyOf) {\n // First generate values for regular properties\n let commonObj;\n if (schema.type === 'object' || schema.properties) {\n commonObj = { 'example-0': {} };\n for (const propertyName in schema.properties) {\n if (schema.example) {\n commonObj = schema;\n break;\n }\n if (schema.properties[propertyName].deprecated && !config.includeDeprecated) { continue; }\n if (schema.properties[propertyName].readOnly && !config.includeReadOnly) { continue; }\n if (schema.properties[propertyName].writeOnly && !config.includeWriteOnly) { continue; }\n commonObj = mergePropertyExamples(commonObj, propertyName, schemaToSampleObj(schema.properties[propertyName], config));\n }\n }\n\n // Combine every variant of the regular properties with every variant of the anyOf samples\n let i = 0;\n for (const key in schema.anyOf) {\n const anyOfSamples = schemaToSampleObj(schema.anyOf[key], config);\n for (const sampleKey in anyOfSamples) {\n if (typeof commonObj !== 'undefined') {\n for (const commonKey in commonObj) {\n obj[`example-${i}`] = { ...commonObj[commonKey], ...anyOfSamples[sampleKey] };\n }\n } else {\n obj[`example-${i}`] = anyOfSamples[sampleKey];\n }\n addSchemaInfoToExample(schema.anyOf[key], obj[`example-${i}`]);\n i++;\n }\n }\n } else if (schema.type === 'object' || schema.properties) {\n obj['example-0'] = {};\n addSchemaInfoToExample(schema, obj['example-0']);\n if (schema.example) {\n obj['example-0'] = schema.example;\n } else {\n for (const propertyName in schema.properties) {\n if (schema.properties[propertyName]?.deprecated && !config.includeDeprecated) { continue; }\n if (schema.properties[propertyName]?.readOnly && !config.includeReadOnly) { continue; }\n if (schema.properties[propertyName]?.writeOnly && !config.includeWriteOnly) { continue; }\n if (schema.properties[propertyName]?.type === 'array' || schema.properties[propertyName]?.items) {\n if (schema.properties[propertyName].example) {\n addPropertyExampleToObjectExamples(schema.properties[propertyName].example, obj, propertyName);\n } else if (schema.properties[propertyName]?.items?.example) { // schemas and properties support single example but not multiple examples.\n addPropertyExampleToObjectExamples([schema.properties[propertyName].items.example], obj, propertyName);\n } else {\n const itemSamples = schemaToSampleObj(schema.properties[propertyName].items, config);\n if (config.useXmlTagForProp) {\n const xmlTagName = schema.properties[propertyName].xml?.name || propertyName;\n if (schema.properties[propertyName].xml?.wrapped) {\n const wrappedItemSample = JSON.parse(`{ \"${xmlTagName}\" : { \"${xmlTagName}\" : ${JSON.stringify(itemSamples['example-0'])} } }`);\n obj = mergePropertyExamples(obj, xmlTagName, wrappedItemSample);\n } else {\n obj = mergePropertyExamples(obj, xmlTagName, itemSamples);\n }\n } else {\n const arraySamples = [];\n for (const key in itemSamples) {\n arraySamples[key] = [itemSamples[key]];\n }\n obj = mergePropertyExamples(obj, propertyName, arraySamples);\n }\n }\n continue;\n }\n obj = mergePropertyExamples(obj, propertyName, schemaToSampleObj(schema.properties[propertyName], config));\n }\n if (typeof schema.additionalProperties === 'object') {\n const propertyName = schema.additionalProperties['x-additionalPropertiesName'] || 'property';\n obj = mergePropertyExamples(obj, `${propertyName}1`, schemaToSampleObj(schema.additionalProperties, config));\n obj = mergePropertyExamples(obj, `${propertyName}2`, schemaToSampleObj(schema.additionalProperties, config));\n }\n }\n } else if (schema.type === 'array' || schema.items) {\n if (schema.items || schema.example) {\n if (schema.example) {\n obj['example-0'] = schema.example;\n } else if (schema.items?.example) { // schemas and properties support single example but not multiple examples.\n obj['example-0'] = [schema.items.example];\n } else {\n const samples = schemaToSampleObj(schema.items, config);\n let i = 0;\n for (const key in samples) {\n obj[`example-${i}`] = [samples[key]];\n addSchemaInfoToExample(schema.items, obj[`example-${i}`]);\n i++;\n }\n }\n } else {\n obj['example-0'] = [];\n }\n } else {\n return { 'example-0': getSampleValueByType(schema) };\n }\n return obj;\n}\n\nfunction generateMarkdownForArrayAndObjectDescription(schema, level = 0) {\n let markdown = ((schema.description || schema.title) && (schema.minItems || schema.maxItems)) ? '' : '';\n if (schema.title) {\n if (schema.description) {\n markdown = `${markdown} ${schema.title}: ${schema.description}
`;\n } else {\n markdown = `${markdown} ${schema.title}
`;\n }\n } else if (schema.description) {\n markdown = `${markdown} ${schema.description}
`;\n }\n if (schema.minItems) {\n markdown = `${markdown} Min Items: ${schema.minItems}`;\n }\n if (schema.maxItems) {\n markdown = `${markdown} Max Items: ${schema.maxItems}`;\n }\n if (level > 0 && schema.items?.description) {\n let itemsMarkdown = '';\n if (schema.items.minProperties) {\n itemsMarkdown = `Min Properties: ${schema.items.minProperties}`;\n }\n if (schema.items.maxProperties) {\n itemsMarkdown = `${itemsMarkdown} Max Properties: ${schema.items.maxProperties}`;\n }\n markdown = `${markdown} ⮕ ${itemsMarkdown} [ ${schema.items.description} ] `;\n }\n return markdown;\n}\n/**\n * For changing OpenAPI-Schema to an Object Notation,\n * This Object would further be an input to UI Components to generate an Object-Tree\n * @param {object} schema - Schema object from OpenAPI spec\n * @param {object} obj - recursivly pass this object to generate object notation\n * @param {number} level - recursion level\n * @param {string} suffix - used for suffixing property names to avoid duplicate props during object composion\n */\nexport function schemaInObjectNotation(schema, obj, level = 0, suffix = '') {\n if (!schema) {\n return;\n }\n if (schema.allOf) {\n const objWithAllProps = {};\n if (schema.allOf.length === 1 && !schema.allOf[0].properties && !schema.allOf[0].items) {\n // If allOf has single item and the type is not an object or array, then its a primitive\n const tempSchema = schema.allOf[0];\n return `${getTypeInfo(tempSchema).html}`;\n }\n // If allOf is an array of multiple elements, then all the keys makes a single object\n schema.allOf.map((v, i) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const propSuffix = (v.anyOf || v.oneOf) && i > 0 ? i : '';\n const partialObj = schemaInObjectNotation(v, {}, (level + 1), propSuffix);\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type === 'array' || v.items) {\n const partialObj = schemaInObjectNotation(v, {}, (level + 1));\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type) {\n const prop = `prop${Object.keys(objWithAllProps).length}`;\n const typeObj = getTypeInfo(v);\n objWithAllProps[prop] = `${typeObj.html}`;\n } else {\n return '';\n }\n });\n obj = objWithAllProps;\n } else if (schema.anyOf || schema.oneOf) {\n obj['::description'] = schema.description || '';\n // 1. First iterate the regular properties\n if (schema.type === 'object' || schema.properties) {\n obj['::description'] = schema.description || '';\n obj['::type'] = 'object';\n // obj['::deprecated'] = schema.deprecated || false;\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n obj[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n obj[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n }\n // 2. Then show allof/anyof objects\n const objWithAnyOfProps = {};\n const xxxOf = schema.anyOf ? 'anyOf' : 'oneOf';\n schema[xxxOf].forEach((v, index) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const partialObj = schemaInObjectNotation(v, {});\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`] = partialObj;\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`]['::readwrite'] = ''; // xxx-options cannot be read or write only\n objWithAnyOfProps['::type'] = 'xxx-of-option';\n } else if (v.type === 'array' || v.items) {\n // This else-if block never seems to get executed\n const partialObj = schemaInObjectNotation(v, {});\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`] = partialObj;\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`]['::readwrite'] = ''; // xxx-options cannot be read or write only\n objWithAnyOfProps['::type'] = 'xxx-of-array';\n } else {\n const prop = `::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`;\n objWithAnyOfProps[prop] = `${getTypeInfo(v).html}`;\n objWithAnyOfProps['::type'] = 'xxx-of-option';\n }\n });\n obj[(schema.anyOf ? `::ANY~OF ${suffix}` : `::ONE~OF ${suffix}`)] = objWithAnyOfProps;\n // obj['::type'] = 'object';\n obj['::type'] = 'object';\n } else if (Array.isArray(schema.type)) {\n // When a property has multiple types, then check further if any of the types are array or object, if yes then modify the schema using one-of\n // Clone the schema - as it will be modified to replace multi-data-types with one-of;\n const subSchema = JSON.parse(JSON.stringify(schema));\n const primitiveType = [];\n const complexTypes = [];\n subSchema.type.forEach((v) => {\n if (v.match(/integer|number|string|null|boolean/g)) {\n primitiveType.push(v);\n } else if (v === 'array' && typeof subSchema.items?.type === 'string' && subSchema.items?.type.match(/integer|number|string|null|boolean/g)) {\n // Array with primitive types should also be treated as primitive type\n if (subSchema.items.type === 'string' && subSchema.items.format) {\n primitiveType.push(`[${subSchema.items.format}]`);\n } else {\n primitiveType.push(`[${subSchema.items.type}]`);\n }\n } else {\n complexTypes.push(v);\n }\n });\n let multiPrimitiveTypes;\n if (primitiveType.length > 0) {\n subSchema.type = primitiveType.join(primitiveType.length === 2 ? ' or ' : '┃');\n multiPrimitiveTypes = getTypeInfo(subSchema);\n if (complexTypes.length === 0) {\n return `${multiPrimitiveTypes?.html || ''}`;\n }\n }\n if (complexTypes.length > 0) {\n obj['::type'] = 'object';\n const multiTypeOptions = {\n '::type': 'xxx-of-option',\n };\n\n // Generate ONE-OF options for complexTypes\n complexTypes.forEach((v, i) => {\n if (v === 'null') {\n multiTypeOptions[`::OPTION~${i + 1}`] = 'NULL~|~~|~~|~~|~~|~~|~~|~~|~';\n } else if ('integer, number, string, boolean,'.includes(`${v},`)) {\n subSchema.type = Array.isArray(v) ? v.join('┃') : v;\n const primitiveTypeInfo = getTypeInfo(subSchema);\n multiTypeOptions[`::OPTION~${i + 1}`] = primitiveTypeInfo.html;\n } else if (v === 'object') {\n // If object type iterate all the properties and create an object-type-option\n const objTypeOption = {\n '::title': schema.title || '',\n '::description': schema.description || '',\n '::type': 'object',\n '::deprecated': schema.deprecated || false,\n };\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n objTypeOption[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n objTypeOption[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n multiTypeOptions[`::OPTION~${i + 1}`] = objTypeOption;\n } else if (v === 'array') {\n multiTypeOptions[`::OPTION~${i + 1}`] = {\n '::title': schema.title || '',\n '::description': schema.description || '',\n '::type': 'array',\n '::props': schemaInObjectNotation(schema.items, {}, (level + 1)),\n };\n }\n });\n multiTypeOptions[`::OPTION~${complexTypes.length + 1}`] = multiPrimitiveTypes?.html || '';\n obj['::ONE~OF'] = multiTypeOptions;\n }\n } else if (schema.type === 'object' || schema.properties) { // If Object\n obj['::title'] = schema.title || '';\n obj['::description'] = generateMarkdownForArrayAndObjectDescription(schema, level);\n obj['::type'] = 'object';\n if ((Array.isArray(schema.type) && schema.type.includes('null')) || schema.nullable) {\n obj['::dataTypeLabel'] = 'object or null';\n obj['::nullable'] = true;\n }\n obj['::deprecated'] = schema.deprecated || false;\n obj['::readwrite'] = schema.readOnly ? 'readonly' : schema.writeOnly ? 'writeonly' : '';\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n obj[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n obj[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n for (const key in schema.patternProperties) {\n obj[`[pattern: ${key}]`] = schemaInObjectNotation(schema.patternProperties[key], obj, (level + 1));\n }\n if (schema.additionalProperties) {\n obj['[any-key]'] = schemaInObjectNotation(schema.additionalProperties, {});\n }\n } else if (schema.type === 'array' || schema.items) { // If Array\n obj['::title'] = schema.title || '';\n obj['::description'] = generateMarkdownForArrayAndObjectDescription(schema, level);\n obj['::type'] = 'array';\n if ((Array.isArray(schema.type) && schema.type.includes('null')) || schema.nullable) {\n obj['::dataTypeLabel'] = 'array or null';\n obj['::nullable'] = true;\n }\n obj['::deprecated'] = schema.deprecated || false;\n obj['::readwrite'] = schema.readOnly ? 'readonly' : schema.writeOnly ? 'writeonly' : '';\n if (schema.items?.items) {\n obj['::array-type'] = schema.items.items.type;\n }\n obj['::props'] = schemaInObjectNotation(schema.items, {}, (level + 1));\n } else {\n const typeObj = getTypeInfo(schema);\n if (typeObj?.html) {\n return `${typeObj.html}`;\n }\n return '';\n }\n return obj;\n}\n\n/* Create Example object */\nexport function generateExample(schema, mimeType, examples = {}, example = {}, includeReadOnly = true, includeWriteOnly = true, outputType = 'json', includeGeneratedExample = false) {\n const finalExamples = [];\n // First check if examples is provided\n if (examples) {\n for (const eg in examples) {\n let egContent = '';\n let egFormat = 'json';\n if (mimeType?.toLowerCase().includes('json')) {\n if (outputType === 'text') {\n egContent = typeof examples[eg].value === 'string' ? examples[eg].value : JSON.stringify(examples[eg].value, undefined, 2);\n egFormat = 'text';\n } else {\n egContent = examples[eg].value;\n if (typeof examples[eg].value === 'string') {\n try {\n // const fixedJsonString = examples[eg].value.replace((/([\\w]+)(:)/g), '\"$1\"$2').replace((/'/g), '\"');\n const fixedJsonString = examples[eg].value;\n egContent = JSON.parse(fixedJsonString);\n egFormat = 'json';\n } catch {\n egFormat = 'text';\n egContent = examples[eg].value;\n }\n }\n }\n } else {\n egContent = examples[eg].value;\n egFormat = 'text';\n }\n\n finalExamples.push({\n exampleId: eg,\n exampleSummary: examples[eg].summary || eg,\n exampleDescription: examples[eg].description || '',\n exampleType: mimeType,\n exampleValue: egContent,\n exampleFormat: egFormat,\n });\n }\n } else if (example) {\n let egContent = '';\n let egFormat = 'json';\n if (mimeType?.toLowerCase().includes('json')) {\n if (outputType === 'text') {\n egContent = typeof example === 'string' ? example : JSON.stringify(example, undefined, 2);\n egFormat = 'text';\n } else if (typeof example === 'object') {\n egContent = example;\n egFormat = 'json';\n } else if (typeof example === 'string') {\n try {\n egContent = JSON.parse(example);\n egFormat = 'json';\n } catch {\n egFormat = 'text';\n egContent = example;\n }\n }\n } else {\n egContent = example;\n egFormat = 'text';\n }\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: egContent,\n exampleFormat: egFormat,\n });\n }\n // If schema-level examples are not provided or includeGeneratedExample === true then generate one based on the schema field types\n if (finalExamples.length === 0 || includeGeneratedExample === true) {\n if (schema) {\n if (schema.example) {\n // Note: Deprecated: The 'example' property has been deprecated in 3.1.0 in favor of the JSON Schema 'examples' keyword\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: schema.example,\n exampleFormat: ((mimeType?.toLowerCase().includes('json') && typeof schema.example === 'object') ? 'json' : 'text'),\n });\n } else if (mimeType?.toLowerCase().includes('json') || mimeType?.toLowerCase().includes('text') || mimeType?.toLowerCase().includes('*/*') || mimeType?.toLowerCase().includes('xml')) {\n let xmlRootStart = '';\n let xmlRootEnd = '';\n let exampleFormat = '';\n let exampleValue = '';\n if (mimeType?.toLowerCase().includes('xml')) {\n xmlRootStart = schema.xml?.name ? `<${schema.xml.name} ${schema.xml.namespace ? `xmlns=\"${schema.xml.namespace}\"` : ''}>` : '';\n xmlRootEnd = schema.xml?.name ? `` : '';\n exampleFormat = 'text';\n } else {\n exampleFormat = outputType;\n }\n const samples = schemaToSampleObj(schema, { includeReadOnly, includeWriteOnly, deprecated: true, useXmlTagForProp: mimeType?.toLowerCase().includes('xml') });\n let i = 0;\n for (const samplesKey in samples) {\n if (!samples[samplesKey]) {\n continue;\n }\n const summary = samples[samplesKey]['::TITLE'] || `Example ${++i}`;\n const description = samples[samplesKey]['::DESCRIPTION'] || '';\n if (mimeType?.toLowerCase().includes('xml')) {\n exampleValue = `\\n${xmlRootStart}${json2xml(samples[samplesKey], 1)}\\n${xmlRootEnd}`;\n } else {\n removeTitlesAndDescriptions(samples[samplesKey]);\n exampleValue = outputType === 'text' ? JSON.stringify(samples[samplesKey], null, 2) : samples[samplesKey];\n }\n\n finalExamples.push({\n exampleId: samplesKey,\n exampleSummary: summary,\n exampleDescription: description,\n exampleType: mimeType,\n exampleFormat,\n exampleValue,\n });\n }\n } else if (mimeType?.toLowerCase().includes('jose')) {\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: 'Base64 Encoded',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: schema.pattern || 'bXJpbg==',\n exampleFormat: 'text',\n });\n } else {\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: '',\n exampleFormat: 'text',\n });\n }\n } else {\n // No Example or Schema provided (should never reach here)\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: '',\n exampleFormat: 'text',\n });\n }\n }\n return finalExamples;\n}\n\nfunction getSerializeStyleForContentType(contentType) {\n if (contentType === 'application/json') {\n return 'json';\n }\n if (contentType === 'application/xml') {\n return 'xml';\n }\n return null;\n}\n\nexport function getSchemaFromParam(param) {\n if (param.schema) {\n return [param.schema, null, null];\n }\n if (param.content) {\n // we gonna use the first content-encoding\n for (const contentType of Object.keys(param.content)) {\n if (param.content[contentType].schema) {\n return [param.content[contentType].schema, getSerializeStyleForContentType(contentType), param.content[contentType]];\n }\n }\n }\n return [null, null, null];\n}\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport FontStyles from '~/styles/font-styles';\nimport SchemaStyles from '~/styles/schema-styles';\nimport CustomStyles from '~/styles/custom-styles';\n\nexport default class SchemaTable extends LitElement {\n static get properties() {\n return {\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n data: { type: Object },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true false'.includes(this.schemaDescriptionExpanded)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.schemaHideReadOnly || !'true false'.includes(this.schemaHideReadOnly)) { this.schemaHideReadOnly = 'true'; }\n if (!this.schemaHideWriteOnly || !'true false'.includes(this.schemaHideWriteOnly)) { this.schemaHideWriteOnly = 'true'; }\n }\n\n static get styles() {\n return [\n FontStyles,\n SchemaStyles,\n css`\n .table {\n font-size: var(--font-size-small);\n text-align: left;\n line-height: calc(var(--font-size-small) + 6px);\n }\n .table .tr {\n width: calc(100% - 5px);\n padding: 0 0 0 5px;\n border-bottom: 1px dotted var(--light-border-color);\n }\n .table .td {\n padding: 4px 0;\n }\n .table .key {\n width: 240px;\n }\n .key .key-label {\n font-size: var(--font-size-mono);\n }\n .key.deprecated .key-label {\n color: var(--red);\n }\n\n .table .key-type {\n white-space: normal;\n width: 150px;\n }\n .collapsed-all-descr .tr:not(.expanded-descr) {\n max-height: calc(var(--font-size-small) + var(--font-size-small));\n }\n\n .obj-toggle {\n padding: 0 2px;\n border-radius:2px;\n border: 1px solid transparent;\n display: inline-block;\n margin-left: -16px;\n color:var(--primary-color);\n cursor:pointer;\n font-size: calc(var(--font-size-small) + 4px);\n font-family: var(--font-mono);\n background-clip: border-box;\n }\n .obj-toggle:hover {\n border-color: var(--primary-color);\n }\n .tr.expanded + .object-body {\n display:block;\n }\n .tr.collapsed + .object-body {\n display:none;\n }`,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
this.handleAllEvents(e)}\">\n
\n
${this.data?.['::type'] || ''}
\n ${this.allowSchemaDescriptionExpandToggle === 'true'\n ? html`\n
\n
\n ${this.schemaDescriptionExpanded === 'true' ? 'Single line description' : 'Multiline description'}\n
\n `\n : ''\n }\n
\n ${unsafeHTML(marked(this.data?.['::description'] || ''))} \n
\n
\n
Field
\n
Type
\n
Description
\n
\n ${this.data\n ? html`\n ${this.generateTree(\n this.data['::type'] === 'array' ? this.data['::props'] : this.data,\n this.data['::type'],\n this.data['::array-type'],\n )}`\n : ''\n } \n
\n
\n `;\n }\n\n generateTree(data, dataType = 'object', arrayType = '', key = '', description = '', schemaLevel = 0, indentLevel = 0, readOrWrite = '', isDeprecated = false) {\n if (this.schemaHideReadOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'readonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'readonly') {\n return;\n }\n }\n if (this.schemaHideWriteOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'writeonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'writeonly') {\n return;\n }\n }\n if (!data) {\n return html`
\n   \n ${key.replace('::OPTION~', '')}\n ${\n dataType === 'array'\n ? html` [ ] `\n : dataType === 'object'\n ? html` { } `\n : html` schema undefined `\n }\n
`;\n }\n\n const newSchemaLevel = data['::type']?.startsWith('xxx-of') ? schemaLevel : (schemaLevel + 1);\n const newIndentLevel = dataType === 'xxx-of-option' || data['::type'] === 'xxx-of-option' || key.startsWith('::OPTION') ? indentLevel : (indentLevel + 1);\n const leftPadding = 16 * newIndentLevel; // 2 space indentation at each level\n if (Object.keys(data).length === 0) {\n return html`${key}`;\n }\n let keyLabel = '';\n let keyDescr = '';\n let isOneOfLabel = false;\n if (key.startsWith('::ONE~OF') || key.startsWith('::ANY~OF')) {\n keyLabel = key.replace('::', '').replace('~', ' ');\n isOneOfLabel = true;\n } else if (key.startsWith('::OPTION')) {\n const parts = key.split('~');\n keyLabel = parts[1]; // eslint-disable-line prefer-destructuring\n keyDescr = parts[2]; // eslint-disable-line prefer-destructuring\n } else {\n keyLabel = key;\n }\n\n let detailObjType = '';\n if (data['::type'] === 'object') {\n if (dataType === 'array') {\n detailObjType = 'array of object'; // Array of Object\n } else {\n detailObjType = data['::dataTypeLabel'] || data['::type'];\n }\n } else if (data['::type'] === 'array') {\n if (dataType === 'array') {\n // detailObjType = 'array of array'; // Array of array\n detailObjType = `array of array ${arrayType !== 'object' ? `of ${arrayType}` : ''}`; // Array of array\n } else {\n detailObjType = data['::dataTypeLabel'] || data['::type'];\n }\n }\n\n if (typeof data === 'object') {\n return html`\n ${newSchemaLevel >= 0 && key\n ? html`\n
\n
\n ${(keyLabel || keyDescr)\n ? html`\n \n ${schemaLevel < this.schemaExpandLevel ? '-' : '+'}\n `\n : ''\n }\n ${data['::type'] === 'xxx-of-option' || data['::type'] === 'xxx-of-array' || key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : keyLabel.endsWith('*')\n ? html`${(isDeprecated || data['::deprecated'])\n ? html``\n : ''\n } ${keyLabel.substring(0, keyLabel.length - 1)}*`\n : html`${(isDeprecated || data['::deprecated'])\n ? html``\n : ''\n } ${keyLabel === '::props' ? '' : keyLabel}`\n }\n ${data['::type'] === 'xxx-of' && dataType === 'array' ? html`ARRAY` : ''} \n
\n
\n ${(data['::type'] || '').includes('xxx-of') ? '' : detailObjType}\n ${data['::readwrite'] === 'readonly' ? ' 🆁' : data['::readwrite'] === 'writeonly' ? ' 🆆' : ''}\n
\n
${unsafeHTML(marked(description || ''))}
\n
`\n : html`\n ${data['::type'] === 'array' && dataType === 'array'\n ? html`\n
\n
\n
\n ${arrayType && arrayType !== 'object' ? `${dataType} of ${arrayType}` : dataType}\n
\n
\n
`\n : ''\n }`\n }\n
\n ${Array.isArray(data) && data[0]\n ? html`${this.generateTree(data[0], 'xxx-of-option', '', '::ARRAY~OF', '', newSchemaLevel, newIndentLevel, '')}`\n : html`\n ${Object.keys(data).map((dataKey) => html`\n ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite', '::dataTypeLabel', '::nullable'].includes(dataKey)\n ? data[dataKey]['::type'] === 'array' || data[dataKey]['::type'] === 'object'\n ? html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]['::description'],\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n (isDeprecated || data[dataKey]['::deprecated']),\n )}`\n : ''\n : html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]?.['::description'] || '',\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n (isDeprecated || data[dataKey]['::deprecated']),\n )}`\n }\n `)}\n `\n }\n
\n `;\n }\n\n // For Primitive Data types\n // eslint-disable-next-line no-unused-vars\n const [type, readOrWriteOnly, constraint, defaultValue, allowedValues, pattern, schemaDescription, schemaTitle, deprecated] = data.split('~|~');\n if (readOrWriteOnly === '🆁' && this.schemaHideReadOnly === 'true') {\n return;\n }\n if (readOrWriteOnly === '🆆' && this.schemaHideWriteOnly === 'true') {\n return;\n }\n const dataTypeCss = type.replace(/┃.*/g, '').replace(/[^a-zA-Z0-9+]/g, '').substring(0, 4).toLowerCase();\n const descrExpander = `${constraint || defaultValue || allowedValues || pattern ? '' : ''}`;\n let dataTypeHtml = '';\n if (dataType === 'array') {\n dataTypeHtml = html` \n
\n [${type}] ${readOrWrite === 'readonly' ? '🆁' : readOrWrite === 'writeonly' ? '🆆' : ''}\n
`;\n } else {\n dataTypeHtml = html` \n
\n ${type} ${readOrWriteOnly}\n
`;\n }\n return html`\n
\n
\n ${isDeprecated || deprecated\n ? html``\n : ''\n }\n ${keyLabel?.endsWith('*')\n ? html`\n ${keyLabel.substring(0, keyLabel.length - 1)}\n *`\n : key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : html`${keyLabel ? html` ${keyLabel}` : html`${schemaTitle}`}`\n }\n
\n ${dataTypeHtml}\n
\n ${html`\n ${unsafeHTML(marked(dataType === 'array'\n ? `${descrExpander} ${description}`\n : schemaTitle\n ? `${descrExpander} ${schemaTitle}: ${schemaDescription}`\n : `${descrExpander} ${schemaDescription}`))}\n `\n }\n ${constraint ? html`
Constraints: ${constraint}
` : ''}\n ${defaultValue ? html`
Default: ${defaultValue}
` : ''}\n ${allowedValues ? html`
${type === 'const' ? 'Value' : 'Allowed'}: ${allowedValues}
` : ''}\n ${pattern ? html`
Pattern: ${pattern}
` : ''}\n
\n
\n `;\n }\n /* eslint-enable indent */\n\n handleAllEvents(e) {\n if (e.target.classList.contains('obj-toggle')) {\n this.toggleObjectExpand(e);\n } else if (e.target.classList.contains('schema-multiline-toggle')) {\n this.schemaDescriptionExpanded = (this.schemaDescriptionExpanded === 'true' ? 'false' : 'true');\n } else if (e.target.classList.contains('descr-expand-toggle')) {\n const trEl = e.target.closest('.tr');\n if (trEl) {\n trEl.classList.toggle('expanded-descr');\n trEl.style.maxHeight = trEl.scrollHeight;\n }\n }\n }\n\n toggleObjectExpand(e) {\n const rowEl = e.target.closest('.tr');\n if (rowEl.classList.contains('expanded')) {\n rowEl.classList.add('collapsed');\n rowEl.classList.remove('expanded');\n e.target.innerText = '+';\n } else {\n rowEl.classList.remove('collapsed');\n rowEl.classList.add('expanded');\n e.target.innerText = '-';\n }\n }\n}\ncustomElements.define('schema-table', SchemaTable);\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { rapidocApiKey } from '~/utils/common-utils';\nimport { pathSecurityTemplate } from '~/templates/security-scheme-template';\nimport codeSamplesTemplate from '~/templates/code-samples-template';\nimport callbackTemplate from '~/templates/callback-template';\nimport '~/components/api-request';\nimport '~/components/api-response';\n\n/* eslint-disable indent */\nfunction headingRenderer(tagElementId) {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nfunction expandCollapseTagDescription(e) {\n const tagDescriptionEl = e.target.closest('.tag-container').querySelector('.tag-description');\n const tagIconEl = e.target.closest('.tag-container').querySelector('.tag-icon');\n if (tagDescriptionEl && tagIconEl) {\n const isExpanded = tagDescriptionEl.classList.contains('expanded');\n if (isExpanded) {\n tagDescriptionEl.style.maxHeight = 0;\n tagDescriptionEl.classList.replace('expanded', 'collapsed');\n tagIconEl.classList.replace('expanded', 'collapsed');\n } else {\n tagDescriptionEl.style.maxHeight = `${tagDescriptionEl.scrollHeight}px`;\n tagDescriptionEl.classList.replace('collapsed', 'expanded');\n tagIconEl.classList.replace('collapsed', 'expanded');\n }\n }\n}\n\nexport function expandedEndpointBodyTemplate(path, tagName = '', tagDescription = '') {\n const acceptContentTypes = new Set();\n for (const respStatus in path.responses) {\n for (const acceptContentType in (path.responses[respStatus]?.content)) {\n acceptContentTypes.add(acceptContentType.trim());\n }\n }\n const accept = [...acceptContentTypes].join(', ');\n\n // Filter API Keys that are non-empty and are applicable to the the path\n const nonEmptyApiKeys = this.resolvedSpec.securitySchemes.filter((v) => (v.finalKeyValue && path.security?.some((ps) => (v.securitySchemeId in ps)))) || [];\n\n // If a RapiDoc API Key is specified on the element and its value is not hyphen(-) then include it for all paths\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === rapidocApiKey && v.value !== '-'));\n if (rapiDocApiKey) {\n nonEmptyApiKeys.push(rapiDocApiKey);\n }\n\n const codeSampleTabPanel = path.xCodeSamples ? codeSamplesTemplate.call(this, path.xCodeSamples) : '';\n return html`\n ${this.renderStyle === 'read' ? html`
` : ''}\n
\n ${(this.renderStyle === 'focused' && tagName !== 'General ⦂')\n ? html`\n
\n ${tagName} \n ${tagDescription\n ? html`\n { expandCollapseTagDescription.call(this, e); }}\"\n >\n \n \n
\n
${unsafeHTML(marked(tagDescription))}
\n
`\n : ''\n } \n
\n `\n : ''\n }\n ${path.deprecated ? html`
DEPRECATED
` : ''}\n ${html`\n ${path.xBadges && path.xBadges?.length > 0\n ? html`\n
\n ${path.xBadges.map((v) => (\n v.color === 'none'\n ? ''\n : html`${v.label}`\n ))\n }\n
\n `\n : ''\n }\n

${path.shortSummary || `${path.method.toUpperCase()} ${path.path}`}

\n ${path.isWebhook\n ? html` WEBHOOK `\n : html`\n
\n ${path.method} \n ${path.path}\n
\n `\n }\n `\n }\n ${path.description ? html`
${unsafeHTML(marked(path.description))}
` : ''}\n ${pathSecurityTemplate.call(this, path.security)}\n ${path.externalDocs?.url || path.externalDocs?.description\n ? html`
\n
${unsafeHTML(marked(path.externalDocs?.description || ''))}
\n ${path.externalDocs?.url\n ? html`\n ${path.externalDocs?.url}
\n
`\n : ''\n }\n
`\n : ''\n }\n ${codeSampleTabPanel}\n
\n \n\n ${path.callbacks ? callbackTemplate.call(this, path.callbacks) : ''}\n\n \n
\n
\n `;\n}\n\nexport default function expandedEndpointTemplate() {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${this.resolvedSpec.tags.map((tag) => html`\n
\n
${tag.displayName || tag.name}
\n \n
\n ${\n unsafeHTML(`\n
\n ${marked(tag.description || '', this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer(tag.elementId) } : undefined)}\n
`)\n }\n
\n
\n
\n ${tag.paths.map((path) => expandedEndpointBodyTemplate.call(this, path))}\n
\n `)\n }\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { schemaInObjectNotation } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport '~/components/schema-table';\n\nfunction schemaBodyTemplate(sComponent) {\n return html`\n
\n
\n
${sComponent.name} Schema
\n ${this.schemaStyle === 'table'\n ? html`\n `\n : html`\n `\n}\n
`;\n}\n\nfunction componentBodyTemplate(sComponent, componentType) {\n if (sComponent.id.indexOf('schemas-') !== -1) {\n return schemaBodyTemplate.call(this, sComponent);\n }\n return html`\n
\n
\n ${html`\n
${sComponent.name} ${componentType}
\n ${sComponent.component\n ? html`\n
\n \n
`\n : ''}\n `}\n
\n `;\n}\n\nexport default function componentsTemplate() {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${this.resolvedSpec.components.map((component) => html`\n
\n
${component.name}
\n
\n ${unsafeHTML(`
${marked(component.description ? component.description : '')}
`)}\n
\n
\n
\n ${component.subComponents.filter((c) => c.expanded !== false).map((sComponent) => componentBodyTemplate.call(this, sComponent, component.name))}\n
\n `)\n}\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { downloadResource, viewResource } from '~/utils/common-utils';\n\n/* eslint-disable indent */\nfunction headingRenderer() {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nexport default function overviewTemplate() {\n return html`\n
\n ${this.resolvedSpec?.info\n ? html`\n
\n ${this.resolvedSpec.info.title}\n ${!this.resolvedSpec.info.version ? '' : html`\n \n ${this.resolvedSpec.info.version}\n `\n }\n
\n
\n ${this.resolvedSpec.info.contact?.email\n ? html`${this.resolvedSpec.info.contact.name || 'Email'}: \n ${this.resolvedSpec.info.contact.email}\n `\n : ''\n }\n ${this.resolvedSpec.info.contact?.url\n ? html`URL: ${this.resolvedSpec.info.contact.url}`\n : ''\n }\n ${this.resolvedSpec.info.license\n ? html`License: \n ${this.resolvedSpec.info.license.url\n ? html`${this.resolvedSpec.info.license.name}`\n : this.resolvedSpec.info.license.name\n } `\n : ''\n }\n ${this.resolvedSpec.info.termsOfService\n ? html`Terms of Service`\n : ''\n }\n ${this.specUrl && this.allowSpecFileDownload === 'true'\n ? html`\n
\n \n ${this.specUrl?.trim().toLowerCase().endsWith('json')\n ? html``\n : ''\n }\n
`\n : ''\n }\n
\n \n
\n ${this.resolvedSpec.info.description\n ? html`${\n unsafeHTML(`\n
\n ${marked(this.resolvedSpec.info.description, this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer() } : undefined)}\n
`)}`\n : ''\n }\n
\n `\n : ''\n }\n
\n `;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\nexport function setApiServer(serverUrl) {\n const serverObj = this.resolvedSpec?.servers.find((s) => s.url === serverUrl);\n if (!serverObj) {\n return false;\n }\n this.selectedServer = serverObj;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('api-server-change', {\n bubbles: true,\n composed: true,\n detail: {\n selectedServer: serverObj,\n },\n }));\n return true;\n}\n\nfunction onApiServerVarChange(e, serverObj) {\n const inputEls = [...e.currentTarget.closest('table').querySelectorAll('input, select')];\n let tempUrl = serverObj.url;\n inputEls.forEach((v) => {\n const regex = new RegExp(`{${v.dataset.var}}`, 'g');\n tempUrl = tempUrl.replace(regex, v.value);\n });\n serverObj.computedUrl = tempUrl;\n this.requestUpdate();\n}\n\n/* eslint-disable indent */\nfunction serverVarsTemplate() {\n // const selectedServerObj = this.resolvedSpec.servers.find((v) => (v.url === this.selectedServer));\n return this.selectedServer && this.selectedServer.variables\n ? html`\n
SERVER VARIABLES
\n \n ${Object.entries(this.selectedServer.variables).map((kv) => html`\n \n \n \n \n ${kv[1].description\n ? html``\n : ''\n }\n `)}\n \n `\n : '';\n}\n\nexport default function serverTemplate() {\n if (!this.resolvedSpec || this.resolvedSpec.specLoadError) { return ''; }\n return html`\n
\n
API SERVER
\n
\n ${!this.resolvedSpec.servers || this.resolvedSpec.servers?.length === 0\n ? ''\n : html`\n ${this.resolvedSpec?.servers.map((server, i) => html`\n { setApiServer.call(this, server.url); }}\n .checked = '${this.selectedServer.url === server.url}'\n style = 'margin:4px 0; cursor:pointer'\n />\n \n
\n `)}\n `}\n
SELECTED: ${this.selectedServer?.computedUrl || 'none'}
\n
\n \n ${serverVarsTemplate.call(this)}\n
`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { marked } from 'marked';\nimport { getMatchedPaths } from '~/utils/common-utils';\n\nexport function expandCollapseNavBarTag(navLinkEl, action = 'toggle') {\n const tagAndPathEl = navLinkEl?.closest('.nav-bar-tag-and-paths');\n const pathsUnderTagEl = tagAndPathEl?.querySelector('.nav-bar-paths-under-tag');\n if (tagAndPathEl) {\n const isExpanded = tagAndPathEl.classList.contains('expanded');\n if (isExpanded && (action === 'toggle' || action === 'collapse')) {\n pathsUnderTagEl.style.maxHeight = 0;\n tagAndPathEl.classList.replace('expanded', 'collapsed');\n } else if (!isExpanded && (action === 'toggle' || action === 'expand')) {\n tagAndPathEl.classList.replace('collapsed', 'expanded');\n pathsUnderTagEl.style.maxHeight = `${pathsUnderTagEl.scrollHeight}px`;\n }\n }\n}\n\nexport function expandCollapseAll(event, action = 'expand-all') {\n if (!(event.type === 'click' || (event.type === 'keyup' && event.keyCode === 13))) {\n return;\n }\n const navEl = event.target.closest('.nav-scroll');\n const elList = [...navEl.querySelectorAll('.nav-bar-tag-and-paths')];\n if (action === 'expand-all') {\n elList.forEach((el) => {\n const navBarPathsUnderTagEl = el.querySelector('.nav-bar-paths-under-tag');\n el.classList.replace('collapsed', 'expanded');\n navBarPathsUnderTagEl.style.maxHeight = `${navBarPathsUnderTagEl?.scrollHeight}px`;\n });\n } else {\n elList.forEach((el) => {\n el.classList.replace('expanded', 'collapsed');\n el.querySelector('.nav-bar-paths-under-tag').style.maxHeight = 0;\n });\n }\n}\n\nexport function navBarClickAndEnterHandler(event) {\n if (!(event.type === 'click' || (event.type === 'keyup' && event.keyCode === 13))) {\n return;\n }\n const navEl = event.target;\n event.stopPropagation();\n if (navEl.dataset?.action === 'navigate') {\n this.scrollToEventTarget(event, false);\n } else if (navEl.dataset?.action === 'expand-all' || (navEl.dataset?.action === 'collapse-all')) {\n expandCollapseAll(event, navEl.dataset.action);\n } else if (navEl.dataset?.action === 'expand-collapse-tag') {\n expandCollapseNavBarTag(navEl, 'toggle');\n }\n}\n\n/* eslint-disable indent */\nexport default function navbarTemplate() {\n if (!this.resolvedSpec || this.resolvedSpec.specLoadError) {\n return html`\n \n `;\n }\n return html`\n \n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { expandedEndpointBodyTemplate } from '~/templates/expanded-endpoint-template';\nimport '~/components/api-request';\nimport '~/components/api-response';\nimport componentsTemplate from '~/templates/components-template';\nimport overviewTemplate from '~/templates/overview-template';\nimport serverTemplate from '~/templates/server-template';\nimport securitySchemeTemplate from '~/templates/security-scheme-template';\nimport { expandCollapseNavBarTag } from '~/templates/navbar-template';\n\nfunction headingRenderer(tagElementId) {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nfunction wrapFocusedTemplate(templateToWrap) {\n return html`\n
\n ${templateToWrap}\n
`;\n}\n\nfunction defaultContentTemplate() {\n // In focused mode default content is overview or first path\n if (this.showInfo === 'true') {\n return wrapFocusedTemplate(overviewTemplate.call(this));\n }\n const selectedTagObj = this.resolvedSpec.tags[0];\n const selectedPathObj = this.resolvedSpec.tags[0]?.paths[0];\n return (selectedTagObj && selectedPathObj)\n ? wrapFocusedTemplate(expandedEndpointBodyTemplate.call(this, selectedPathObj, selectedTagObj.name))\n : wrapFocusedTemplate('');\n}\n\n/* eslint-disable indent */\nfunction focusedTagBodyTemplate(tag) {\n return html`\n

${tag.displayName || tag.name}

\n ${this.onNavTagClick === 'show-description' && tag.description\n ? html`\n
\n ${\n unsafeHTML(`\n
\n ${marked(tag.description || '', this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer(tag.elementId) } : undefined)}\n
`)\n }\n
`\n : ''\n }\n `;\n}\n\nexport default function focusedEndpointTemplate() {\n if (!this.focusedElementId || !this.resolvedSpec) {\n return;\n }\n const focusElId = this.focusedElementId;\n let selectedPathObj = null;\n let selectedTagObj = null;\n let focusedTemplate;\n let i = 0;\n if (focusElId.startsWith('overview') && this.showInfo === 'true') {\n focusedTemplate = overviewTemplate.call(this);\n } else if (focusElId === 'auth' && this.allowAuthentication === 'true') {\n focusedTemplate = securitySchemeTemplate.call(this);\n } else if (focusElId === 'servers' && this.allowServerSelection === 'true') {\n focusedTemplate = serverTemplate.call(this);\n } else if (focusElId === 'operations-top') {\n focusedTemplate = html`\n
\n \n
`;\n } else if (focusElId.startsWith('cmp--') && this.showComponents === 'true') {\n focusedTemplate = componentsTemplate.call(this);\n } else if (focusElId.startsWith('tag--')) {\n const idToFocus = focusElId.indexOf('--', 4) > 0 ? focusElId.substring(0, focusElId.indexOf('--', 5)) : focusElId;\n selectedTagObj = this.resolvedSpec.tags.find((v) => v.elementId === idToFocus);\n if (selectedTagObj) {\n focusedTemplate = wrapFocusedTemplate.call(this, focusedTagBodyTemplate.call(this, selectedTagObj));\n } else {\n focusedTemplate = defaultContentTemplate.call(this);\n }\n } else {\n for (i = 0; i < this.resolvedSpec.tags.length; i += 1) {\n selectedTagObj = this.resolvedSpec.tags[i];\n selectedPathObj = this.resolvedSpec.tags[i].paths.find((v) => `${v.elementId}` === focusElId);\n if (selectedPathObj) {\n break;\n }\n }\n if (selectedPathObj) {\n // In focused mode we must expand the nav-bar tag element if it is collapsed\n const newNavEl = this.shadowRoot.getElementById(`link-${focusElId}`);\n expandCollapseNavBarTag(newNavEl, 'expand');\n focusedTemplate = wrapFocusedTemplate.call(\n this,\n expandedEndpointBodyTemplate.call(this, selectedPathObj, (selectedTagObj.name || ''), (selectedTagObj.description || '')),\n );\n } else {\n // if focusedElementId is not found then show the default content (overview or first-path)\n focusedTemplate = defaultContentTemplate.call(this);\n }\n }\n return focusedTemplate;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport '~/components/api-request';\nimport '~/components/api-response';\nimport codeSamplesTemplate from '~/templates/code-samples-template';\nimport callbackTemplate from '~/templates/callback-template';\nimport { pathSecurityTemplate } from '~/templates/security-scheme-template';\nimport { getMatchedPaths, rapidocApiKey } from '~/utils/common-utils';\n\nfunction toggleExpand(path) {\n if (path.expanded) {\n path.expanded = false; // collapse\n if (this.updateRoute === 'true') {\n this.replaceHistoryState('');\n }\n } else {\n path.expanded = true; // Expand\n if (this.updateRoute === 'true') {\n const newHash = `${this.routePrefix || '#'}${path.elementId}`;\n if (window.location.hash !== newHash) {\n this.replaceHistoryState(path.elementId);\n }\n }\n }\n this.requestUpdate();\n}\n\nexport function expandCollapseAll(operationsRootEl, action = 'expand-all') {\n const elList = [...operationsRootEl.querySelectorAll('.section-tag')];\n if (action === 'expand-all') {\n elList.map((el) => {\n el.classList.replace('collapsed', 'expanded');\n });\n } else {\n elList.map((el) => {\n el.classList.replace('expanded', 'collapsed');\n });\n }\n}\n\nfunction onExpandCollapseAll(e, action = 'expand-all') {\n expandCollapseAll.call(this, e.target.closest('.operations-root'), action);\n}\n\n/* eslint-disable indent */\nfunction endpointHeadTemplate(path, pathsExpanded = false) {\n return html`\n { toggleExpand.call(this, path, e); }}\" part=\"section-endpoint-head-${path.expanded ? 'expanded' : 'collapsed'}\" class='endpoint-head ${path.method} ${path.deprecated ? 'deprecated' : ''} ${pathsExpanded || path.expanded ? 'expanded' : 'collapsed'}'>\n
${path.method}
\n
\n ${path.path} \n ${path.isWebhook ? html` Webhook` : ''}\n
\n ${path.deprecated\n ? html`\n \n deprecated \n `\n : ''\n }\n ${this.showSummaryWhenCollapsed\n ? html`\n
\n
${path.summary || path.shortSummary}
`\n : ''\n }\n
\n `;\n}\n\nfunction endpointBodyTemplate(path) {\n const acceptContentTypes = new Set();\n for (const respStatus in path.responses) {\n for (const acceptContentType in (path.responses[respStatus]?.content)) {\n acceptContentTypes.add(acceptContentType.trim());\n }\n }\n const accept = [...acceptContentTypes].join(', ');\n // Filter API Keys that are non-empty and are applicable to the the path\n const nonEmptyApiKeys = this.resolvedSpec.securitySchemes.filter((v) => (v.finalKeyValue && path.security?.some((ps) => (v.securitySchemeId in ps)))) || [];\n\n // If a RapiDoc API Key is specified on the element and its value is not hyphen(-) then include it for all paths\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === rapidocApiKey && v.value !== '-'));\n if (rapiDocApiKey) {\n nonEmptyApiKeys.push(rapiDocApiKey);\n }\n\n const codeSampleTabPanel = path.xCodeSamples ? codeSamplesTemplate(path.xCodeSamples) : '';\n return html`\n
\n
\n ${path.summary\n ? html`
${path.summary}
`\n : path.shortSummary !== path.description\n ? html`
${path.shortSummary}
`\n : ''\n }\n ${path.xBadges && path.xBadges?.length > 0\n ? html`\n
\n ${path.xBadges.map((v) => (\n v.color === 'none'\n ? ''\n : html`${v.label}`\n ))\n }\n
\n `\n : ''\n }\n\n ${path.description ? html`
${unsafeHTML(marked(path.description))}
` : ''}\n ${path.externalDocs?.url || path.externalDocs?.description\n ? html`
\n
${unsafeHTML(marked(path.externalDocs?.description || ''))}
\n ${path.externalDocs?.url\n ? html` \n ${path.externalDocs?.url}
\n
`\n : ''\n }\n
`\n : ''\n }\n \n ${pathSecurityTemplate.call(this, path.security)}\n ${codeSampleTabPanel}\n
\n
\n
\n 0 ? path.servers[0].url : this.selectedServer?.computedUrl}\" \n active-schema-tab = \"${this.defaultSchemaTab}\"\n fill-request-fields-with-example = \"${this.fillRequestFieldsWithExample}\"\n allow-try = \"${this.allowTry}\"\n show-curl-before-try = \"${this.showCurlBeforeTry}\"\n accept = \"${accept}\"\n render-style=\"${this.renderStyle}\" \n schema-style = \"${this.schemaStyle}\" \n schema-expand-level = \"${this.schemaExpandLevel}\"\n schema-description-expanded = \"${this.schemaDescriptionExpanded}\"\n allow-schema-description-expand-toggle = \"${this.allowSchemaDescriptionExpandToggle}\"\n schema-hide-read-only = \"${this.schemaHideReadOnly === 'never' ? 'false' : path.isWebhook ? 'false' : 'true'}\"\n schema-hide-write-only = \"${this.schemaHideWriteOnly === 'never' ? 'false' : path.isWebhook ? 'true' : 'false'}\"\n fetch-credentials = \"${this.fetchCredentials}\"\n exportparts = \"wrap-request-btn:wrap-request-btn, btn:btn, btn-fill:btn-fill, btn-outline:btn-outline, btn-try:btn-try, btn-clear:btn-clear, btn-clear-resp:btn-clear-resp,\n tab-panel:tab-panel, tab-btn:tab-btn, tab-btn-row:tab-btn-row, tab-coontent:tab-content, \n file-input:file-input, textbox:textbox, textbox-param:textbox-param, textarea:textarea, textarea-param:textarea-param, \n anchor:anchor, anchor-param-example:anchor-param-example, schema-description:schema-description, schema-multiline-toggle:schema-multiline-toggle\"\n > \n\n ${path.callbacks ? callbackTemplate.call(this, path.callbacks) : ''}\n
\n\n \n
\n
`;\n}\n\nexport default function endpointTemplate(isMini = false, pathsExpanded = false) {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${isMini\n ? ''\n : html`\n
\n onExpandCollapseAll(e, 'expand-all')}\" style=\"color:var(--primary-color); cursor:pointer;\">\n Expand all\n \n  |  \n onExpandCollapseAll(e, 'collapse-all')}\" style=\"color:var(--primary-color); cursor:pointer;\" >\n Collapse all\n \n   sections\n
`\n }\n ${this.resolvedSpec.tags.map((tag) => html`\n ${isMini\n ? html`\n \n `\n : html` \n \n `\n }\n `)\n }`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\n\n/* eslint-disable indent */\nexport default function logoTemplate(style) {\nreturn html`\n
\n \n \n \n \n \n \n \n \n
\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport logoTemplate from '~/templates/logo-template';\n\n/* eslint-disable indent */\nexport default function headerTemplate() {\n return html`\n
\n
\n \n ${logoTemplate('height:36px;width:36px;margin-left:5px')}\n \n \n
${this.headingText}
\n
\n
\n ${(this.allowSpecUrlLoad === 'false')\n ? ''\n : html`\n \n
\n `\n } \n ${(this.allowSpecFileLoad === 'false')\n ? ''\n : html`\n \n \n `\n }\n \n ${(this.allowSearch === 'false' || 'read focused'.includes(this.renderStyle))\n ? ''\n : html` \n \n
\n `\n }\n \n ${(this.allowAdvancedSearch === 'false' || 'read focused'.includes(this.renderStyle))\n ? ''\n : html`\n \n `\n }\n
\n
`;\n }\n/* eslint-enable indent */\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { schemaInObjectNotation, generateExample, standardizeExample } from '~/utils/schema-utils';\nimport FontStyles from '~/styles/font-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport InputStyles from '~/styles/input-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport CustomStyles from '~/styles/custom-styles';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport '~/components/schema-table';\n\nexport default class ApiResponse extends LitElement {\n constructor() {\n super();\n this.selectedStatus = '';\n this.headersForEachRespStatus = {};\n this.mimeResponsesForEachStatus = {};\n this.activeSchemaTab = 'schema';\n }\n\n static get properties() {\n return {\n callback: { type: String },\n webhook: { type: String },\n responses: { type: Object },\n parser: { type: Object },\n schemaStyle: { type: String, attribute: 'schema-style' },\n renderStyle: { type: String, attribute: 'render-style' },\n selectedStatus: { type: String, attribute: 'selected-status' },\n selectedMimeType: { type: String, attribute: 'selected-mime-type' },\n activeSchemaTab: { type: String, attribute: 'active-schema-tab' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n FlexStyles,\n TabStyles,\n TableStyles,\n InputStyles,\n BorderStyles,\n css`\n :where(button, input[type=\"checkbox\"], [tabindex=\"0\"]):focus-visible { box-shadow: var(--focus-shadow); }\n :where(input[type=\"text\"], input[type=\"password\"], select, textarea):focus-visible { border-color: var(--primary-color); }\n .resp-head{\n vertical-align: middle;\n padding:16px 0 8px;\n }\n .resp-head.divider{\n border-top: 1px solid var(--border-color);\n margin-top:10px;\n }\n .resp-status{ \n font-weight:bold;\n font-size:calc(var(--font-size-small) + 1px);\n }\n .resp-descr{\n font-size:calc(var(--font-size-small) + 1px);\n color:var(--light-fg);\n text-align:left;\n }\n .top-gap{margin-top:16px;}\n .example-panel{\n font-size:var(--font-size-small);\n margin:0;\n }\n .focused-mode,\n .read-mode {\n padding-top:24px;\n margin-top:12px;\n border-top: 1px dashed var(--border-color);\n }`,\n CustomStyles,\n ];\n }\n\n render() {\n return html`\n
\n
\n ${this.callback === 'true' ? 'CALLBACK RESPONSE' : 'RESPONSE'}\n
\n
\n ${this.responseTemplate()}\n
\n
\n `;\n }\n\n resetSelection() {\n this.selectedStatus = '';\n this.selectedMimeType = '';\n }\n\n /* eslint-disable indent */\n responseTemplate() {\n if (!this.responses) { return ''; }\n for (const statusCode in this.responses) {\n if (!this.selectedStatus) {\n this.selectedStatus = statusCode;\n }\n const allMimeResp = {};\n for (const mimeResp in this.responses[statusCode]?.content) {\n const mimeRespObj = this.responses[statusCode].content[mimeResp];\n if (!this.selectedMimeType) {\n this.selectedMimeType = mimeResp;\n }\n // Generate Schema\n const schemaTree = schemaInObjectNotation(mimeRespObj.schema, {});\n // Generate Example\n const respExamples = generateExample(\n mimeRespObj.schema,\n mimeResp,\n standardizeExample(mimeRespObj.examples),\n standardizeExample(mimeRespObj.example),\n this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary\n this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary\n mimeResp.includes('json') ? 'json' : 'text',\n );\n allMimeResp[mimeResp] = {\n description: this.responses[statusCode].description,\n examples: respExamples,\n selectedExample: respExamples[0]?.exampleId || '',\n schemaTree,\n };\n }\n // Headers for each response status\n const tempHeaders = [];\n for (const key in this.responses[statusCode]?.headers) {\n tempHeaders.push({ name: key, ...this.responses[statusCode].headers[key] });\n }\n this.headersForEachRespStatus[statusCode] = tempHeaders;\n this.mimeResponsesForEachStatus[statusCode] = allMimeResp;\n }\n return html`\n ${Object.keys(this.responses).length > 1\n ? html`
\n ${Object.keys(this.responses).map((respStatus) => html`\n ${respStatus === '$$ref' // Swagger-Client parser creates '$$ref' object if JSON references are used to create responses - this should be ignored\n ? ''\n : html`\n `\n }`)\n }
`\n : html`${Object.keys(this.responses)[0]}`\n }\n\n ${Object.keys(this.responses).map((status) => html`\n
\n
\n ${unsafeHTML(marked(this.responses[status]?.description || ''))}\n ${(this.headersForEachRespStatus[status] && this.headersForEachRespStatus[status]?.length > 0)\n ? html`${this.responseHeaderListTemplate(this.headersForEachRespStatus[status])}`\n : ''\n }\n
\n ${Object.keys(this.mimeResponsesForEachStatus[status]).length === 0\n ? ''\n : html` \n
\n
{ if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; } }}\" >\n \n \n
\n ${Object.keys(this.mimeResponsesForEachStatus[status]).length === 1\n ? html` ${Object.keys(this.mimeResponsesForEachStatus[status])[0]} `\n : html`${this.mimeTypeDropdownTemplate(Object.keys(this.mimeResponsesForEachStatus[status]))}`\n }\n
\n ${this.activeSchemaTab === 'example'\n ? html`
\n ${this.mimeExampleTemplate(this.mimeResponsesForEachStatus[status][this.selectedMimeType])}\n
`\n : html`
\n ${this.mimeSchemaTemplate(this.mimeResponsesForEachStatus[status][this.selectedMimeType])}\n
`\n }\n
\n `\n }
`)\n }\n `;\n }\n\n responseHeaderListTemplate(respHeaders) {\n return html`\n
RESPONSE HEADERS
\n \n ${respHeaders.map((v) => html`\n \n \n \n \n \n \n `)}\n
\n ${v.name || ''}\n \n ${v.schema?.type || ''}\n \n
${unsafeHTML(marked(v.description || ''))}
\n
\n ${v.schema?.example || ''}\n
`;\n }\n\n mimeTypeDropdownTemplate(mimeTypes) {\n return html`\n `;\n }\n\n onSelectExample(e) {\n const exampleContainerEl = e.target.closest('.example-panel');\n const exampleEls = [...exampleContainerEl.querySelectorAll('.example')];\n\n exampleEls.forEach((v) => {\n v.style.display = v.dataset.example === e.target.value ? 'block' : 'none';\n });\n }\n\n mimeExampleTemplate(mimeRespDetails) {\n if (!mimeRespDetails) {\n return html`\n
 No example provided 
\n `;\n }\n return html`\n ${mimeRespDetails.examples.length === 1\n ? html`\n ${mimeRespDetails.examples[0].exampleFormat === 'json'\n ? html`\n ${mimeRespDetails.examples[0].exampleSummary && mimeRespDetails.examples[0].exampleSummary.length > 80 ? html`
${mimeRespDetails.examples[0].exampleSummary}
` : ''}\n ${mimeRespDetails.examples[0].exampleDescription ? html`
${unsafeHTML(marked(mimeRespDetails.examples[0].exampleDescription || ''))}
` : ''}\n `\n : html`\n ${mimeRespDetails.examples[0].exampleSummary && mimeRespDetails.examples[0].exampleSummary.length > 80 ? html`
${mimeRespDetails.examples[0].exampleSummary}
` : ''}\n ${mimeRespDetails.examples[0].exampleDescription ? html`
${unsafeHTML(marked(mimeRespDetails.examples[0].exampleDescription || ''))}
` : ''}\n
${mimeRespDetails.examples[0].exampleValue}
\n `\n }`\n : html`\n \n \n ${mimeRespDetails.examples.map((v) => html`\n
\n ${v.exampleSummary && v.exampleSummary.length > 80 ? html`
${v.exampleSummary}
` : ''}\n ${v.exampleDescription ? html`
${unsafeHTML(marked(v.exampleDescription || ''))}
` : ''}\n ${v.exampleFormat === 'json'\n ? html`\n `\n : html`
${v.exampleValue}
`\n }\n
\n `)}\n
\n `\n }\n `;\n }\n\n mimeSchemaTemplate(mimeRespDetails) {\n if (!mimeRespDetails) {\n return html`\n
 Schema not found
\n `;\n }\n return html`\n ${this.schemaStyle === 'table'\n ? html`\n `\n : html`\n `\n }`;\n }\n /* eslint-enable indent */\n}\n\n// Register the element with the browser\ncustomElements.define('api-response', ApiResponse);\n","import { html } from 'lit';\nimport '~/components/dialog-box';\n\n/* eslint-disable indent */\nexport default function searchByPropertiesModalTemplate() {\n document.addEventListener('close', () => { this.showAdvancedSearchDialog = false; });\n document.addEventListener('open', this.onOpenSearchDialog);\n\n return html`\n \n \n this.onAdvancedSearch(e, 400)}\"\n >\n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n
\n \n ${this.advancedSearchMatches?.map((path) => html`\n {\n this.searchVal = ''; // clear quick filter if applied\n this.showAdvancedSearchDialog = false; // Hide Search Dialog\n this.requestUpdate();\n this.scrollToEventTarget(e, true);\n }\n }\"\n > \n ${path.method} \n ${path.path}\n ${path.summary}\n \n `)\n }\n
\n `;\n}\n/* eslint-enable indent */\n","import { LitElement, html } from 'lit';\nimport DialogBoxStyles from '~/styles/dialog-box-styles';\n\nexport default class DialogBox extends LitElement {\n static get properties() {\n return {\n heading: { type: String, attribute: 'heading' },\n show: { type: String, attribute: 'show' },\n };\n }\n\n static get styles() {\n return [DialogBoxStyles];\n }\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', (e) => {\n if (e.code === 'Escape') {\n this.onClose();\n }\n });\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal !== newVal) {\n if (name === 'heading') {\n this.heading = newVal;\n }\n if (name === 'show') {\n this.show = newVal;\n if (newVal === 'true') {\n document.dispatchEvent(new CustomEvent('open', {\n bubbles: true,\n composed: true,\n detail: this,\n }));\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n ${this.show === 'true'\n ? html`\n
\n
\n
\n ${this.heading}\n \n
\n
\n \n
\n
\n
`\n : ''\n }`;\n }\n /* eslint-enable indent */\n\n onClose() {\n document.dispatchEvent(new CustomEvent('close', {\n bubbles: true,\n composed: true,\n }));\n }\n}\n\ncustomElements.define('dialog-box', DialogBox);\n","import { html } from 'lit';\nimport ColorUtils from '~/utils/color-utils';\n/* Generates an schema object containing type and constraint info */\nexport default function setTheme(baseTheme, theme = {}) {\n let newTheme = {};\n\n // Common Theme colors\n const primaryColor = theme.primaryColor ? theme.primaryColor : baseTheme === 'dark' ? '#f76b39' : '#ff591e';\n const primaryColorInvert = ColorUtils.color.invert(primaryColor);\n const primaryColorTrans = ColorUtils.color.opacity(primaryColor, '0.4');\n\n // Dark and Light Theme colors\n if (baseTheme === 'dark') {\n const bg1 = theme.bg1 ? theme.bg1 : '#2a2b2c';\n const fg1 = theme.fg1 ? theme.fg1 : '#bbb';\n\n const bg2 = theme.bg2 ? theme.bg2 : ColorUtils.color.brightness(bg1, 5); // or #383838;\n const bg3 = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, 17); // or #444;\n const lightBg = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, 35);\n const fg2 = theme.fg2 ? theme.fg2 : ColorUtils.color.brightness(fg1, -15); // or #ababab\n const fg3 = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, -20); // or #aaa\n const lightFg = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, -65); // or #777\n const inlineCodeFg = theme.inlineCodeFg ? theme.inlineCodeFg : '#aaa';\n const selectionBg = fg2;\n const selectionFg = bg2;\n\n const headerColor = theme.headerColor ? theme.headerColor : ColorUtils.color.brightness(bg1, 10);\n\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, 10);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.opacity(ColorUtils.color.invert(navBgColor), '0.50');\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : ColorUtils.color.brightness(navBgColor, -15);\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : ColorUtils.color.invert(navBgColor);\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : ColorUtils.color.brightness(primaryColor, 25);\n const navAccentTextColor = theme.navAccentTextColor ? theme.navAccenttextColor : ColorUtils.color.invert(navAccentColor);\n\n const overlayBg = 'rgba(80, 80, 80, 0.4)';\n\n newTheme = {\n bg1,\n bg2,\n bg3,\n lightBg,\n fg1,\n fg2,\n fg3,\n lightFg,\n inlineCodeFg,\n primaryColor,\n primaryColorTrans,\n primaryColorInvert,\n selectionBg,\n selectionFg,\n overlayBg,\n navBgColor,\n navTextColor,\n navHoverBgColor,\n navHoverTextColor,\n navAccentColor,\n navAccentTextColor,\n headerColor,\n headerColorInvert: ColorUtils.color.invert(headerColor),\n headerColorDarker: ColorUtils.color.brightness(headerColor, -20),\n headerColorBorder: ColorUtils.color.brightness(headerColor, 10),\n\n borderColor: theme.borderColor || ColorUtils.color.brightness(bg1, 20), // #555\n lightBorderColor: theme.lightBorderColor || ColorUtils.color.brightness(bg1, 15), // #444\n codeBorderColor: theme.codeBorderColor || ColorUtils.color.brightness(bg1, 30),\n\n inputBg: theme.inputBg || ColorUtils.color.brightness(bg1, -5), // #2f2f2f\n placeHolder: theme.placeHolder || ColorUtils.color.opacity(fg1, '0.3'),\n hoverColor: theme.hoverColor || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n red: theme.red ? theme.red : '#F06560',\n lightRed: theme.lightRed ? theme.lightRed : ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n pink: theme.pink ? theme.pink : '#ffb2b2',\n lightPink: theme.lightPink || ColorUtils.color.brightness(bg1, -10),\n\n green: theme.green || '#7ec699',\n lightGreen: theme.lightGreen || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n blue: theme.blue || '#71b7ff',\n lightBlue: theme.lightBlue || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n orange: theme.orange ? theme.orange : '#f08d49',\n lightOrange: theme.lightOrange || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n yellow: theme.yellow || '#827717',\n lightYellow: theme.lightYellow || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n purple: theme.purple || '#786FF1',\n brown: theme.brown || '#D4AC0D',\n\n codeBg: theme.codeBg || ColorUtils.color.opacity(ColorUtils.color.brightness(bg1, -15), 0.7),\n codeFg: theme.codeFg || '#aaa',\n codePropertyColor: theme.codePropertyColor || '#f8c555',\n codeKeywordColor: theme.codeKeywordColor || '#cc99cd',\n codeOperatorColor: theme.codeOperatorColor || '#67cdcc',\n };\n } else {\n const bg1 = (theme.bg1 ? theme.bg1 : '#fafbfc');\n const fg1 = (theme.fg1 ? theme.fg1 : '#444444');\n const bg2 = theme.bg2 ? theme.bg2 : ColorUtils.color.brightness(bg1, -5); // or '#fafafa'\n const bg3 = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, -15); // or '#f6f6f6'\n const lightBg = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, -45);\n const fg2 = theme.fg2 ? theme.fg2 : ColorUtils.color.brightness(fg1, 17); // or '#555'\n const fg3 = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, 30); // or #666\n const lightFg = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, 70); // or #999\n const inlineCodeFg = theme.inlineCodeFg ? theme.inlineCodeFg : 'brown';\n const selectionBg = fg2;\n const selectionFg = bg2;\n const headerColor = theme.headerColor ? theme.headerColor : ColorUtils.color.brightness(bg1, -180);\n\n /*\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, -10);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.brightness(fg1, 5);\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : bg1;\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : primaryColor;\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : primaryColor;\n */\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, -200);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.opacity(ColorUtils.color.invert(navBgColor), '0.65');\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : ColorUtils.color.brightness(navBgColor, -15);\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : ColorUtils.color.invert(navBgColor);\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : ColorUtils.color.brightness(primaryColor, 25);\n const navAccentTextColor = theme.navAccentTextColor ? theme.navAccenttextColor : ColorUtils.color.invert(navAccentColor);\n const overlayBg = 'rgba(0, 0, 0, 0.4)';\n\n newTheme = {\n bg1,\n bg2,\n bg3,\n lightBg,\n fg1,\n fg2,\n fg3,\n lightFg,\n inlineCodeFg,\n primaryColor,\n primaryColorTrans,\n primaryColorInvert,\n selectionBg,\n selectionFg,\n overlayBg,\n navBgColor,\n navTextColor,\n navHoverBgColor,\n navHoverTextColor,\n navAccentColor,\n navAccentTextColor,\n headerColor,\n headerColorInvert: ColorUtils.color.invert(headerColor),\n headerColorDarker: ColorUtils.color.brightness(headerColor, -20),\n headerColorBorder: ColorUtils.color.brightness(headerColor, 10),\n\n borderColor: theme.borderColor || ColorUtils.color.brightness(bg1, -38),\n lightBorderColor: theme.lightBorderColor || ColorUtils.color.brightness(bg1, -23),\n codeBorderColor: theme.codeBorderColor || 'transparent',\n\n inputBg: theme.inputBg || ColorUtils.color.brightness(bg1, 10), // #fff\n placeHolder: theme.placeHolder || ColorUtils.color.brightness(lightFg, 20), // #dedede\n hoverColor: theme.hoverColor || ColorUtils.color.brightness(bg1, -5), // # f1f1f1\n\n red: theme.red || '#F06560',\n lightRed: theme.lightRed || '#fff0f0',\n\n pink: theme.pink ? theme.pink : '#990055',\n lightPink: theme.lightPink ? theme.lightPink : '#ffb2b2',\n\n green: theme.green || '#690',\n lightGreen: theme.lightGreen || '#fbfff0',\n\n blue: theme.blue || '#47AFE8',\n lightBlue: theme.lightBlue || '#eff8fd',\n\n orange: theme.orange || '#FF9900',\n lightOrange: theme.lightOrange || '#fff5e6',\n\n yellow: theme.yellow || '#827717',\n lightYellow: theme.lightYellow || '#fff5cc',\n\n purple: theme.purple || '#786FF1',\n brown: theme.brown || '#D4AC0D',\n\n codeBg: theme.codeBg || ColorUtils.color.opacity(ColorUtils.color.brightness(bg1, -15), 0.7),\n codeFg: theme.codeFg || '#666',\n codePropertyColor: theme.codePropertyColor || '#905',\n codeKeywordColor: theme.codeKeywordColor || '#07a',\n codeOperatorColor: theme.codeOperatorColor || '#9a6e3a',\n };\n }\n return html`\n `;\n}\n","import { html } from 'lit';\n\n// Templates\nimport expandedEndpointTemplate from '~/templates/expanded-endpoint-template';\nimport focusedEndpointTemplate from '~/templates/focused-endpoint-template';\nimport overviewTemplate from '~/templates/overview-template';\nimport endpointTemplate from '~/templates/endpoint-template';\nimport serverTemplate from '~/templates/server-template';\nimport securitySchemeTemplate, { recoverPersistedApiKeys } from '~/templates/security-scheme-template';\nimport headerTemplate from '~/templates/header-template';\nimport navbarTemplate from '~/templates/navbar-template';\nimport advancedSearchTemplate from '~/templates/advance-search-template';\nimport SetTheme from '~/utils/theme';\nimport { isValidHexColor } from '~/utils/color-utils';\n\nexport default function mainBodyTemplate(isMini = false, pathsExpanded = false) {\n if (!this.resolvedSpec) {\n return '';\n }\n if (this.persistAuth === 'true') {\n recoverPersistedApiKeys.call(this);\n }\n const newTheme = {\n bg1: isValidHexColor(this.bgColor) ? this.bgColor : '',\n fg1: isValidHexColor(this.textColor) ? this.textColor : '',\n headerColor: isValidHexColor(this.headerColor) ? this.headerColor : '',\n primaryColor: isValidHexColor(this.primaryColor) ? this.primaryColor : '',\n navBgColor: isValidHexColor(this.navBgColor) ? this.navBgColor : '',\n navTextColor: isValidHexColor(this.navTextColor) ? this.navTextColor : '',\n navHoverBgColor: isValidHexColor(this.navHoverBgColor) ? this.navHoverBgColor : '',\n navHoverTextColor: isValidHexColor(this.navHoverTextColor) ? this.navHoverTextColor : '',\n navAccentColor: isValidHexColor(this.navAccentColor) ? this.navAccentColor : '',\n navAccentTextColor: isValidHexColor(this.navAccentTextColor) ? this.navAccentTextColor : '',\n };\n /* eslint-disable indent */\n if (this.resolvedSpec.specLoadError) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
\n ${this.resolvedSpec.info.description} \n
\n `;\n }\n\n if (this.resolvedSpec.isSpecLoading) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
\n \n
\n
\n
\n
\n `;\n }\n\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n\n \n ${this.showHeader === 'false' ? '' : headerTemplate.call(this)}\n \n \n ${this.allowAdvancedSearch === 'false' ? '' : advancedSearchTemplate.call(this)}\n\n
\n \n ${((this.renderStyle === 'read' || this.renderStyle === 'focused')\n && this.showSideNav === 'true'\n && this.resolvedSpec\n ) ? navbarTemplate.call(this) : ''\n }\n\n \n
\n \n
\n ${this.loading === true\n ? html`
`\n : html`\n ${this.loadFailed === true\n ? html`
Unable to load the Spec
`\n : html`\n
\n ${this.renderStyle === 'focused'\n ? html`${focusedEndpointTemplate.call(this)}`\n : html`\n ${this.showInfo === 'true' ? overviewTemplate.call(this) : ''}\n ${this.allowServerSelection === 'true' ? serverTemplate.call(this) : ''}\n ${this.allowAuthentication === 'true' ? securitySchemeTemplate.call(this) : ''}\n
\n \n
\n ${this.renderStyle === 'read'\n ? expandedEndpointTemplate.call(this)\n : endpointTemplate.call(this, isMini, pathsExpanded)\n }\n `\n }\n
\n `\n }`\n }\n
\n \n
\n
\n `;\n}\n/* eslint-enable indent */\n","import { css, LitElement, unsafeCSS } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\nimport CustomStyles from '~/styles/custom-styles';\n// import { expandCollapseNavBarTag } from '@/templates/navbar-template';\nimport { advancedSearch, getMatchedPaths, getMatchedComponents, rapidocApiKey, sleep } from '~/utils/common-utils';\nimport ProcessSpec from '~/utils/spec-parser';\nimport mainBodyTemplate from '~/templates/main-body-template';\nimport { applyApiKey, onClearAllApiKeys } from '~/templates/security-scheme-template';\nimport { setApiServer } from '~/templates/server-template';\n\nexport default class RapiDoc extends LitElement {\n constructor() {\n super();\n const intersectionObserverOptions = {\n root: this.getRootNode().host,\n rootMargin: '-50px 0px -50px 0px', // when the element is visible 100px from bottom\n threshold: 0,\n };\n this.showSummaryWhenCollapsed = true;\n // Will activate intersection observer only after spec load and hash analyze\n // to scroll to the proper element without being reverted by observer behavior\n this.isIntersectionObserverActive = false;\n this.intersectionObserver = new IntersectionObserver((entries) => { this.onIntersect(entries); }, intersectionObserverOptions);\n }\n\n static get properties() {\n return {\n // Heading\n headingText: { type: String, attribute: 'heading-text' },\n gotoPath: { type: String, attribute: 'goto-path' },\n\n // Spec\n updateRoute: { type: String, attribute: 'update-route' },\n routePrefix: { type: String, attribute: 'route-prefix' },\n specUrl: { type: String, attribute: 'spec-url' },\n sortTags: { type: String, attribute: 'sort-tags' },\n sortSchemas: { type: String, attribute: 'sort-schemas' },\n generateMissingTags: { type: String, attribute: 'generate-missing-tags' },\n sortEndpointsBy: { type: String, attribute: 'sort-endpoints-by' },\n specFile: { type: String, attribute: false },\n\n // UI Layouts\n layout: { type: String },\n renderStyle: { type: String, attribute: 'render-style' },\n defaultSchemaTab: { type: String, attribute: 'default-schema-tab' },\n responseAreaHeight: { type: String, attribute: 'response-area-height' },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n persistAuth: { type: String, attribute: 'persist-auth' },\n onNavTagClick: { type: String, attribute: 'on-nav-tag-click' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n\n // API Server\n apiKeyName: { type: String, attribute: 'api-key-name' },\n apiKeyLocation: { type: String, attribute: 'api-key-location' },\n apiKeyValue: { type: String, attribute: 'api-key-value' },\n defaultApiServerUrl: { type: String, attribute: 'default-api-server' },\n serverUrl: { type: String, attribute: 'server-url' },\n oauthReceiver: { type: String, attribute: 'oauth-receiver' },\n\n // Hide/Show Sections & Enable Disable actions\n showHeader: { type: String, attribute: 'show-header' },\n showSideNav: { type: String, attribute: 'show-side-nav' },\n showInfo: { type: String, attribute: 'show-info' },\n allowAuthentication: { type: String, attribute: 'allow-authentication' },\n allowTry: { type: String, attribute: 'allow-try' },\n showCurlBeforeTry: { type: String, attribute: 'show-curl-before-try' },\n allowSpecUrlLoad: { type: String, attribute: 'allow-spec-url-load' },\n allowSpecFileLoad: { type: String, attribute: 'allow-spec-file-load' },\n allowSpecFileDownload: { type: String, attribute: 'allow-spec-file-download' },\n allowSearch: { type: String, attribute: 'allow-search' },\n allowAdvancedSearch: { type: String, attribute: 'allow-advanced-search' },\n allowServerSelection: { type: String, attribute: 'allow-server-selection' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n showComponents: { type: String, attribute: 'show-components' },\n pageDirection: { type: String, attribute: 'page-direction' },\n scrollBehavior: { type: String, attribute: 'scroll-behavior' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n headerColor: { type: String, attribute: 'header-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n cssFile: { type: String, attribute: 'css-file' },\n cssClasses: { type: String, attribute: 'css-classes' },\n\n // Nav Bar Colors\n navBgColor: { type: String, attribute: 'nav-bg-color' },\n navTextColor: { type: String, attribute: 'nav-text-color' },\n navHoverBgColor: { type: String, attribute: 'nav-hover-bg-color' },\n navHoverTextColor: { type: String, attribute: 'nav-hover-text-color' },\n navAccentColor: { type: String, attribute: 'nav-accent-color' },\n navAccentTextColor: { type: String, attribute: 'nav-accent-text-color' },\n navActiveItemMarker: { type: String, attribute: 'nav-active-item-marker' },\n navItemSpacing: { type: String, attribute: 'nav-item-spacing' },\n showMethodInNavBar: { type: String, attribute: 'show-method-in-nav-bar' },\n usePathInNavBar: { type: String, attribute: 'use-path-in-nav-bar' },\n infoDescriptionHeadingsInNavBar: { type: String, attribute: 'info-description-headings-in-navbar' },\n\n // Fetch Options\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // Filters\n matchPaths: { type: String, attribute: 'match-paths' },\n matchType: { type: String, attribute: 'match-type' },\n removeEndpointsWithBadgeLabelAs: { type: String, attribute: 'remove-endpoints-with-badge-label-as' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n focusedElementId: { type: String }, // updating the focusedElementId will automatically render appropriate section in focused mode\n showAdvancedSearchDialog: { type: Boolean },\n advancedSearchMatches: { type: Object },\n searchVal: { type: String },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n all: initial;\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n container-type: inline-size;\n }\n :where(button, input[type=\"checkbox\"], [tabindex=\"0\"]):focus-visible { box-shadow: var(--focus-shadow); }\n :where(input[type=\"text\"], input[type=\"password\"], select, textarea):focus-visible { border-color: var(--primary-color); }\n .body {\n display:flex;\n height:100%;\n width:100%;\n overflow:hidden;\n }\n .main-content { \n margin:0;\n padding: 0; \n display:block;\n flex:1;\n height:100%;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) transparent;\n }\n\n .main-content-inner--view-mode {\n padding: 0 8px;\n }\n .main-content::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n .main-content::-webkit-scrollbar-track {\n background:transparent;\n }\n .main-content::-webkit-scrollbar-thumb {\n background-color: var(--border-color);\n }\n\n .section-gap.section-tag {\n border-bottom:1px solid var(--border-color);\n }\n .section-gap,\n .section-gap--focused-mode,\n .section-gap--read-mode { \n padding: 0px 4px; \n }\n .section-tag-header {\n position:relative;\n cursor: n-resize;\n padding: 12px 0;\n }\n .collapsed .section-tag-header:hover {\n cursor: s-resize;\n }\n\n .section-tag-header:hover {\n background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-color), rgba(0,0,0,0));\n }\n\n .section-tag-header:hover::after {\n position:absolute;\n margin-left:-24px;\n font-size:20px;\n top: calc(50% - 14px);\n color:var(--primary-color);\n content: '⬆'; \n }\n\n .collapsed .section-tag-header::after {\n position:absolute;\n margin-left:-24px;\n font-size:20px;\n top: calc(50% - 14px);\n color: var(--border-color);\n content: '⬇'; \n }\n .collapsed .section-tag-header:hover::after {\n color:var(--primary-color);\n }\n\n .collapsed .section-tag-body {\n display:none;\n }\n\n .logo {\n height:36px;\n width:36px;\n margin-left:5px; \n }\n .only-large-screen-flex,\n .only-large-screen {\n display:none;\n }\n .tag.title {\n text-transform: uppercase;\n }\n .main-header {\n background-color:var(--header-bg);\n color:var(--header-fg);\n width:100%;\n }\n .header-title {\n font-size:calc(var(--font-size-regular) + 8px); \n padding:0 8px;\n }\n input.header-input{\n background:var(--header-color-darker);\n color:var(--header-fg);\n border:1px solid var(--header-color-border);\n flex:1; \n padding-right:24px;\n border-radius:3px;\n }\n input.header-input::placeholder {\n opacity:0.4;\n }\n .loader {\n margin: 16px auto 16px auto; \n border: 4px solid var(--bg3);\n border-radius: 50%;\n border-top: 4px solid var(--primary-color);\n width: 36px;\n height: 36px;\n animation: spin 2s linear infinite;\n }\n .expanded-endpoint-body { \n position: relative;\n padding: 6px 0px; \n }\n .expanded-endpoint-body .tag-description {\n background: var(--code-bg);\n border-radius: var(--border-radius);\n transition: max-height .2s ease-out;\n }\n .expanded-endpoint-body .tag-icon {\n transition: transform .2s ease-out;\n }\n .expanded-endpoint-body .tag-icon.expanded {\n transform: rotate(180deg);\n }\n .divider { \n border-top: 2px solid var(--border-color);\n margin: 24px 0;\n width:100%;\n }\n\n .tooltip {\n cursor:pointer;\n border: 1px solid var(--border-color);\n border-left-width: 4px;\n margin-left:2px;\n }\n .tooltip a {\n color: var(--fg2);\n text-decoration: none;\n }\n .tooltip-text {\n color: var(--fg2);\n max-width: 400px;\n position: absolute;\n z-index:1;\n background-color: var(--bg2);\n visibility: hidden;\n\n overflow-wrap: break-word;\n }\n .tooltip:hover {\n color: var(--primary-color);\n border-color: var(--primary-color);\n }\n .tooltip:hover a:hover {\n color: var(--primary-color);\n }\n\n .tooltip:hover .tooltip-text {\n visibility: visible;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .nav-method { font-weight: bold; margin-right: 4px; font-size: calc(var(--font-size-small) - 2px); white-space: nowrap; }\n .nav-method.false { display: none; }\n\n .nav-method.as-colored-text.get { color:var(--nav-get-color); }\n .nav-method.as-colored-text.put { color:var(--nav-put-color); }\n .nav-method.as-colored-text.post { color:var(--nav-post-color); }\n .nav-method.as-colored-text.delete { color:var(--nav-delete-color); }\n .nav-method.as-colored-text.head, .nav-method.as-colored-text.patch, .nav-method.as-colored-text.options { color:var(--nav-head-color); }\n \n .nav-method.as-colored-block {\n padding: 1px 4px;\n min-width: 30px;\n border-radius: 4px 0 0 4px;\n color: #000;\n }\n .colored-block .nav-method.as-colored-block {\n outline: 1px solid;\n }\n\n .nav-method.as-colored-block.get { background-color: var(--blue); }\n .nav-method.as-colored-block.put { background-color: var(--orange); }\n .nav-method.as-colored-block.post { background-color: var(--green); }\n .nav-method.as-colored-block.delete { background-color: var(--red); }\n .nav-method.as-colored-block.head, .nav-method.as-colored-block.patch , .nav-method.as-colored-block.options { \n background-color: var(--yellow); \n }\n\n @container (min-width: 768px) {\n .nav-bar {\n width: 260px;\n display:flex;\n }\n .only-large-screen {\n display:block;\n }\n .only-large-screen-flex {\n display:flex;\n }\n .section-gap { \n padding: 0 0 0 24px; \n }\n .section-gap--focused-mode {\n padding: 24px 8px; \n }\n .section-gap--read-mode { \n padding: 24px 8px; \n }\n .endpoint-body {\n position: relative;\n padding:36px 0 48px 0;\n }\n }\n\n @container (min-width: 1024px) {\n .nav-bar {\n width: ${unsafeCSS(this.fontSize === 'default' ? '300px' : this.fontSize === 'large' ? '315px' : '330px')};\n display:flex;\n }\n .section-gap--focused-mode { \n padding: 12px 80px 12px 80px; \n }\n .section-gap--read-mode { \n padding: 24px 80px 12px 80px; \n }\n }`,\n CustomStyles,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n const parent = this.parentElement;\n if (parent) {\n if (parent.offsetWidth === 0 && parent.style.width === '') {\n parent.style.width = '100vw';\n }\n if (parent.offsetHeight === 0 && parent.style.height === '') {\n parent.style.height = '100vh';\n }\n if (parent.tagName === 'BODY') {\n if (!parent.style.marginTop) { parent.style.marginTop = '0'; }\n if (!parent.style.marginRight) { parent.style.marginRight = '0'; }\n if (!parent.style.marginBottom) { parent.style.marginBottom = '0'; }\n if (!parent.style.marginLeft) { parent.style.marginLeft = '0'; }\n }\n }\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n if (!this.layout || !'row, column,'.includes(`${this.layout},`)) { this.layout = 'row'; }\n if (!this.renderStyle || !'read, view, focused,'.includes(`${this.renderStyle},`)) { this.renderStyle = 'focused'; }\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.defaultSchemaTab || !'example, schema, model,'.includes(`${this.defaultSchemaTab},`)) {\n this.defaultSchemaTab = 'example';\n } else if (this.defaultSchemaTab === 'model') {\n this.defaultSchemaTab = 'schema';\n }\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n\n if (!this.schemaHideReadOnly || !'default, never,'.includes(`${this.schemaHideReadOnly},`)) { this.schemaHideReadOnly = 'default'; }\n if (!this.schemaHideWriteOnly || !'default, never,'.includes(`${this.schemaHideWriteOnly},`)) { this.schemaHideWriteOnly = 'default'; }\n\n if (!this.fillRequestFieldsWithExample || !'true, false,'.includes(`${this.fillRequestFieldsWithExample},`)) { this.fillRequestFieldsWithExample = 'true'; }\n if (!this.persistAuth || !'true, false,'.includes(`${this.persistAuth},`)) { this.persistAuth = 'false'; }\n if (!this.responseAreaHeight) {\n this.responseAreaHeight = '400px';\n }\n\n if (!this.allowSearch || !'true, false,'.includes(`${this.allowSearch},`)) { this.allowSearch = 'true'; }\n if (!this.allowAdvancedSearch || !'true, false,'.includes(`${this.allowAdvancedSearch},`)) { this.allowAdvancedSearch = 'true'; }\n\n if (!this.allowTry || !'true, false,'.includes(`${this.allowTry},`)) { this.allowTry = 'true'; }\n if (!this.apiKeyValue) { this.apiKeyValue = '-'; }\n if (!this.apiKeyLocation) { this.apiKeyLocation = 'header'; }\n if (!this.apiKeyName) { this.apiKeyName = ''; }\n\n if (!this.oauthReceiver) { this.oauthReceiver = 'oauth-receiver.html'; }\n if (!this.updateRoute || !'true, false,'.includes(`${this.updateRoute},`)) { this.updateRoute = 'true'; }\n if (!this.routePrefix) { this.routePrefix = '#'; }\n if (!this.sortTags || !'true, false,'.includes(`${this.sortTags},`)) { this.sortTags = 'false'; }\n if (!this.sortSchemas || !'true, false,'.includes(`${this.sortSchemas},`)) { this.sortSchemas = 'false'; }\n if (!this.generateMissingTags || !'true, false,'.includes(`${this.generateMissingTags},`)) { this.generateMissingTags = 'false'; }\n if (!this.sortEndpointsBy || !'method, path, summary, none,'.includes(`${this.sortEndpointsBy},`)) { this.sortEndpointsBy = 'path'; }\n\n if (!this.onNavTagClick || !'expand-collapse, show-description,'.includes(`${this.onNavTagClick},`)) { this.onNavTagClick = 'expand-collapse'; }\n if (!this.navItemSpacing || !'compact, relaxed, default,'.includes(`${this.navItemSpacing},`)) { this.navItemSpacing = 'default'; }\n if (!this.showMethodInNavBar || !'false, as-plain-text, as-colored-text, as-colored-block,'.includes(`${this.showMethodInNavBar},`)) { this.showMethodInNavBar = 'false'; }\n if (!this.usePathInNavBar || !'true, false,'.includes(`${this.usePathInNavBar},`)) { this.usePathInNavBar = 'false'; }\n if (!this.navActiveItemMarker || !'left-bar, colored-block'.includes(`${this.navActiveItemMarker},`)) { this.navActiveItemMarker = 'left-bar'; }\n\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n if (!this.showInfo || !'true, false,'.includes(`${this.showInfo},`)) { this.showInfo = 'true'; }\n if (!this.allowServerSelection || !'true, false,'.includes(`${this.allowServerSelection},`)) { this.allowServerSelection = 'true'; }\n if (!this.allowAuthentication || !'true, false,'.includes(`${this.allowAuthentication},`)) { this.allowAuthentication = 'true'; }\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n\n if (!this.showSideNav || !'true false'.includes(this.showSideNav)) { this.showSideNav = 'true'; }\n if (!this.showComponents || !'true false'.includes(this.showComponents)) { this.showComponents = 'false'; }\n if (!this.infoDescriptionHeadingsInNavBar || !'true, false,'.includes(`${this.infoDescriptionHeadingsInNavBar},`)) { this.infoDescriptionHeadingsInNavBar = 'false'; }\n if (!this.fetchCredentials || !'omit, same-origin, include,'.includes(`${this.fetchCredentials},`)) { this.fetchCredentials = ''; }\n if (!this.scrollBehavior || !'smooth, auto,'.includes(`${this.scrollBehavior},`)) { this.scrollBehavior = 'auto'; }\n\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n if (!this.matchPaths) { this.matchPaths = ''; }\n if (!this.removeEndpointsWithBadgeLabelAs) { this.removeEndpointsWithBadgeLabelAs = ''; }\n if (!this.showAdvancedSearchDialog) { this.showAdvancedSearchDialog = false; }\n\n if (!this.cssFile) { this.cssFile = null; }\n if (!this.cssClasses) { this.cssClasses = ''; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n\n window.addEventListener('hashchange', () => {\n this.scrollToPath(this.getElementIDFromURL());\n }, true);\n }\n\n // Cleanup\n disconnectedCallback() {\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n super.disconnectedCallback();\n }\n\n infoDescriptionHeadingRenderer() {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n }\n\n render() {\n // return render(mainBodyTemplate(this), this.shadowRoot, { eventContext: this });\n const cssLinkEl = document.querySelector(`link[href*=\"${this.cssFile}\"]`);\n // adding custom style for RapiDoc\n if (cssLinkEl) {\n this.shadowRoot.appendChild(cssLinkEl.cloneNode());\n }\n return mainBodyTemplate.call(this);\n }\n\n observeExpandedContent() {\n // Main Container\n const observeOverviewEls = this.shadowRoot.querySelectorAll('.observe-me');\n observeOverviewEls.forEach((targetEl) => {\n this.intersectionObserver.observe(targetEl);\n });\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n // If goto-path is provided and no location-hash is present then try to scroll there\n if (this.gotoPath && !window.location.hash) {\n this.scrollToPath(this.gotoPath);\n }\n }, 0);\n }\n }\n if (name === 'match-paths' || name === 'match-type' || name === 'remove-endpoints-with-badge-label-as') {\n if (oldVal !== newVal) {\n window.setTimeout(async () => {\n await this.loadSpec(this.specUrl);\n }, 0);\n }\n }\n if (name === 'render-style') {\n if (newVal === 'read') {\n window.setTimeout(() => {\n this.observeExpandedContent();\n }, 100);\n } else {\n this.intersectionObserver.disconnect();\n }\n }\n if (name === 'api-key-name' || name === 'api-key-location' || name === 'api-key-value') {\n let updateSelectedApiKey = false;\n let apiKeyName = '';\n let apiKeyLocation = '';\n let apiKeyValue = '';\n\n if (name === 'api-key-name') {\n if (this.getAttribute('api-key-location') && this.getAttribute('api-key-value')) {\n apiKeyName = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-location') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-value')) {\n apiKeyLocation = newVal;\n apiKeyName = this.getAttribute('api-key-name');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-value') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-location')) {\n apiKeyValue = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyName = this.getAttribute('api-key-name');\n updateSelectedApiKey = true;\n }\n }\n\n if (updateSelectedApiKey) {\n if (this.resolvedSpec) {\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => v.securitySchemeId === rapidocApiKey);\n if (!rapiDocApiKey) {\n this.resolvedSpec.securitySchemes.push({\n securitySchemeId: rapidocApiKey,\n description: 'api-key provided in rapidoc element attributes',\n type: 'apiKey',\n name: apiKeyName,\n in: apiKeyLocation,\n value: apiKeyValue,\n finalKeyValue: apiKeyValue,\n });\n } else {\n rapiDocApiKey.name = apiKeyName;\n rapiDocApiKey.in = apiKeyLocation;\n rapiDocApiKey.value = apiKeyValue;\n rapiDocApiKey.finalKeyValue = apiKeyValue;\n }\n this.requestUpdate();\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSpecUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n onSpecFileChange(e) {\n this.setAttribute('spec-file', this.shadowRoot.getElementById('spec-file').value);\n const specFile = e.target.files[0];\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const specObj = JSON.parse(reader.result);\n this.loadSpec(specObj);\n this.shadowRoot.getElementById('spec-url').value = '';\n } catch {\n console.error('RapiDoc: Unable to read or parse json'); // eslint-disable-line no-console\n }\n };\n // Read the Text file\n reader.readAsText(specFile);\n }\n\n onFileLoadClick() {\n this.shadowRoot.getElementById('spec-file').click();\n }\n\n onSearchChange(e) {\n // this.matchPaths = e.target.value;\n this.searchVal = e.target.value;\n this.resolvedSpec.tags.forEach((tag) => tag.paths.filter((path) => {\n if (this.searchVal) {\n if (getMatchedPaths(this.searchVal, path, tag.name)) {\n tag.expanded = true;\n }\n }\n }));\n this.resolvedSpec.components.forEach((component) => component.subComponents.filter((v) => {\n v.expanded = false;\n if (getMatchedComponents(this.searchVal, v)) {\n v.expanded = true;\n }\n }));\n this.requestUpdate();\n }\n\n onClearSearch() {\n const searchEl = this.shadowRoot.getElementById('nav-bar-search');\n searchEl.value = '';\n this.searchVal = '';\n this.resolvedSpec.components.forEach((component) => component.subComponents.filter((v) => {\n v.expanded = true;\n }));\n }\n\n onShowSearchModalClicked() {\n this.showAdvancedSearchDialog = true;\n }\n\n // Event Handler on Dialog-Box is opened\n async onOpenSearchDialog(e) {\n // Set focus to text input\n const inputEl = e.detail.querySelector('input');\n await sleep(0);\n if (inputEl) {\n inputEl.focus();\n }\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n this.searchVal = '';\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.sortSchemas === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('api-key-name'),\n this.getAttribute('api-key-location'),\n this.getAttribute('api-key-value'),\n this.getAttribute('server-url'),\n this.matchPaths,\n this.matchType,\n this.removeEndpointsWithBadgeLabelAs,\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n this.selectedServer = undefined;\n if (this.defaultApiServerUrl) {\n if (this.defaultApiServerUrl === this.serverUrl) {\n this.selectedServer = {\n url: this.serverUrl,\n computedUrl: this.serverUrl,\n };\n } else if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers.find((v) => (v.url === this.defaultApiServerUrl));\n }\n }\n if (!this.selectedServer) {\n if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers[0]; // eslint-disable-line prefer-destructuring\n }\n }\n this.requestUpdate();\n // eslint-disable-next-line no-await-in-loop\n while (!await this.updateComplete);\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n\n // Initiate IntersectionObserver and put it at the end of event loop, to allow loading all the child elements (must for larger specs)\n this.intersectionObserver.disconnect();\n if (this.renderStyle === 'read') {\n await sleep(100);\n this.observeExpandedContent(); // This will auto-highlight the selected nav-item in read-mode\n }\n\n this.isIntersectionObserverActive = true;\n\n // On first time Spec load, try to navigate to location hash if provided\n const elementId = this.getElementIDFromURL();\n\n if (elementId) {\n if (this.renderStyle === 'view') {\n this.expandAndGotoOperation(elementId, true, true);\n } else {\n this.scrollToPath(elementId);\n }\n } else if (this.renderStyle === 'focused') {\n // If goto-path is provided and no location-hash is present then try to scroll to default element\n if (!this.gotoPath) {\n const defaultElementId = this.showInfo ? 'overview' : this.resolvedSpec.tags[0]?.paths[0];\n this.scrollToPath(defaultElementId);\n }\n }\n }\n\n /**\n * Return the URL from where is served the RapiDoc component, removing any hash and route prefix\n */\n getComponentBaseURL() {\n const { href } = window.location;\n\n // Remove end of string # or /\n const cleanRouterPrefix = this.routePrefix.replace(/(#|\\/)$/, '');\n\n if (!cleanRouterPrefix) {\n return href.split('#')[0];\n }\n\n const indexOfRoutePrefix = href.lastIndexOf(cleanRouterPrefix);\n\n if (indexOfRoutePrefix === -1) {\n return href;\n }\n\n return href.slice(0, indexOfRoutePrefix);\n }\n\n /**\n * From the URL return the ID of the element whether it is in the hash or if used a router prefix without a hash\n */\n getElementIDFromURL() {\n const baseURL = this.getComponentBaseURL();\n const elementId = window.location.href.replace(baseURL + this.routePrefix, '');\n return elementId;\n }\n\n replaceHistoryState(hashId) {\n const baseURL = this.getComponentBaseURL();\n window.history.replaceState(null, null, `${baseURL}${this.routePrefix || '#'}${hashId}`);\n }\n\n expandAndGotoOperation(elementId, scrollToElement = true) {\n if (!this.resolvedSpec) {\n return;\n }\n // Expand full operation and tag\n let isExpandingNeeded = true;\n const tmpElementId = elementId.indexOf('#') === -1 ? elementId : elementId.substring(1);\n if (tmpElementId.startsWith('overview') || tmpElementId === 'servers' || tmpElementId === 'auth') {\n isExpandingNeeded = false;\n } else {\n for (let i = 0; i < this.resolvedSpec.tags?.length; i++) {\n const tag = this.resolvedSpec.tags[i];\n const path = tag.paths?.find((p) => p.elementId === elementId);\n if (path) {\n if (path.expanded && tag.expanded) {\n isExpandingNeeded = false;\n } else {\n path.expanded = true;\n tag.expanded = true;\n }\n }\n }\n }\n if (scrollToElement) {\n // requestUpdate() and delay required, else we cant find element\n if (isExpandingNeeded) {\n this.requestUpdate();\n }\n window.setTimeout(() => {\n const gotoEl = this.shadowRoot.getElementById(tmpElementId);\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'start' });\n if (this.updateRoute === 'true') {\n this.replaceHistoryState(tmpElementId);\n }\n }\n }, isExpandingNeeded ? 150 : 0);\n }\n }\n\n isValidTopId(id) {\n return (id.startsWith('overview') || id === 'servers' || id === 'auth');\n }\n\n isValidPathId(id) {\n if (id === 'overview' && this.showInfo) {\n return true;\n }\n if (id === 'servers' && this.allowServerSelection) {\n return true;\n }\n if (id === 'auth' && this.allowAuthentication) {\n return true;\n }\n if (id.startsWith('tag--')) {\n return this.resolvedSpec?.tags?.find((tag) => tag.elementId === id);\n }\n return this.resolvedSpec?.tags?.find((tag) => tag.paths.find((path) => path.elementId === id));\n }\n\n onIntersect(entries) {\n if (this.isIntersectionObserverActive === false) {\n return;\n }\n\n entries.forEach((entry) => {\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\n const oldNavEl = this.shadowRoot.querySelector('.nav-bar-tag.active, .nav-bar-path.active, .nav-bar-info.active, .nav-bar-h1.active, .nav-bar-h2.active, .operations.active');\n const newNavEl = this.shadowRoot.getElementById(`link-${entry.target.id}`);\n\n // Add active class in the new element\n if (newNavEl) {\n if (this.updateRoute === 'true') {\n this.replaceHistoryState(entry.target.id);\n }\n newNavEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'center' });\n newNavEl.classList.add('active');\n newNavEl.part.add('section-navbar-active-item');\n }\n\n // Remove active class from previous element\n // if it is different from the new one (edge case on loading in read render style)\n if (oldNavEl && oldNavEl !== newNavEl) {\n oldNavEl.classList.remove('active');\n oldNavEl.part.remove('section-navbar-active-item');\n }\n }\n });\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'start' });\n }\n }\n }\n }\n\n /**\n * Called by\n * - onClick of Navigation Bar\n * - onClick of Advanced Search items\n *\n * Functionality:\n * 1. First deactivate IntersectionObserver\n * 2. Scroll to the element\n * 3. Activate IntersectionObserver (after little delay)\n *\n */\n async scrollToEventTarget(event, scrollNavItemToView = true) {\n if (!(event.type === 'click' || (event.type === 'keyup' && event.keyCode === 13))) {\n return;\n }\n const navEl = event.target;\n if (!navEl.dataset.contentId) {\n return;\n }\n this.isIntersectionObserverActive = false;\n if (this.renderStyle === 'focused') {\n const requestEl = this.shadowRoot.querySelector('api-request');\n if (requestEl) {\n requestEl.beforeNavigationFocusedMode();\n }\n }\n this.scrollToPath(navEl.dataset.contentId, true, scrollNavItemToView);\n setTimeout(() => {\n this.isIntersectionObserverActive = true;\n }, 300);\n }\n\n // Public Method (scrolls to a given path and highlights the left-nav selection)\n async scrollToPath(elementId, expandPath = true, scrollNavItemToView = true) {\n if (this.renderStyle === 'focused') {\n // for focused mode update this.focusedElementId to update the rendering, else it wont find the needed html elements\n // focusedElementId will get validated in the template\n this.focusedElementId = elementId;\n await sleep(0);\n }\n if (this.renderStyle === 'view') {\n this.expandAndGotoOperation(elementId, expandPath, true);\n } else {\n let isValidElementId = false;\n const contentEl = this.shadowRoot.getElementById(elementId);\n if (contentEl) {\n isValidElementId = true;\n contentEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'start' });\n } else {\n isValidElementId = false;\n }\n if (isValidElementId) {\n // for focused style it is important to reset request-body-selection and response selection which maintains the state for in case of multiple req-body or multiple response mime-type\n if (this.renderStyle === 'focused') {\n const requestEl = this.shadowRoot.querySelector('api-request');\n if (requestEl) {\n requestEl.afterNavigationFocusedMode();\n }\n const responseEl = this.shadowRoot.querySelector('api-response');\n if (responseEl) {\n responseEl.resetSelection();\n }\n }\n\n // Update Location Hash\n if (this.updateRoute === 'true') {\n this.replaceHistoryState(elementId);\n }\n\n // Update NavBar View and Styles\n const newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);\n\n if (newNavEl) {\n if (scrollNavItemToView) {\n newNavEl.scrollIntoView({ behavior: this.scrollBehavior, block: 'center' });\n }\n await sleep(0);\n const oldNavEl = this.shadowRoot.querySelector('.nav-bar-tag.active, .nav-bar-path.active, .nav-bar-info.active, .nav-bar-h1.active, .nav-bar-h2.active, .operations.active');\n if (oldNavEl) {\n oldNavEl.classList.remove('active');\n oldNavEl.part.remove('active');\n oldNavEl.part.remove('section-navbar-active-item');\n }\n newNavEl.classList.add('active'); // must add the class after scrolling\n newNavEl.part.add('section-navbar-active-item');\n // this.requestUpdate();\n }\n }\n }\n }\n\n // Public Method - to update security-scheme of type http\n setHttpUserNameAndPassword(securitySchemeId, username, password) {\n return applyApiKey.call(this, securitySchemeId, username, password);\n }\n\n // Public Method - to update security-scheme of type apiKey or OAuth\n setApiKey(securitySchemeId, apiKeyValue) {\n return applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n\n // Public Method\n removeAllSecurityKeys() {\n return onClearAllApiKeys.call(this);\n }\n\n // Public Method\n setApiServer(apiServerUrl) {\n // return apiServerUrl;\n return setApiServer.call(this, apiServerUrl);\n }\n\n // Event handler for Advanced Search text-inputs and checkboxes\n onAdvancedSearch(ev, delay) {\n const eventTargetEl = ev.target;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => {\n let searchInputEl;\n if (eventTargetEl.type === 'text') {\n searchInputEl = eventTargetEl;\n } else {\n searchInputEl = eventTargetEl.closest('.advanced-search-options').querySelector('input[type=text]');\n }\n const searchOptions = [...eventTargetEl.closest('.advanced-search-options').querySelectorAll('input:checked')].map((v) => v.id);\n this.advancedSearchMatches = advancedSearch(searchInputEl.value, this.resolvedSpec.tags, searchOptions);\n }, delay);\n }\n}\ncustomElements.define('rapi-doc', RapiDoc);\n","import { css, LitElement } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\n\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport { rapidocApiKey } from '~/utils/common-utils';\nimport ProcessSpec from '~/utils/spec-parser';\nimport mainBodyTemplate from '~/templates/main-body-template';\nimport { applyApiKey, onClearAllApiKeys } from '~/templates/security-scheme-template';\nimport { setApiServer } from '~/templates/server-template';\n\nexport default class RapiDocMini extends LitElement {\n constructor() {\n super();\n this.isMini = true;\n this.updateRoute = 'false';\n this.renderStyle = 'view';\n this.showHeader = 'false';\n this.allowAdvancedSearch = 'false';\n }\n\n static get properties() {\n return {\n // Spec\n specUrl: { type: String, attribute: 'spec-url' },\n sortEndpointsBy: { type: String, attribute: 'sort-endpoints-by' },\n\n // UI Layouts\n layout: { type: String },\n pathsExpanded: { type: String, attribute: 'paths-expanded' },\n defaultSchemaTab: { type: String, attribute: 'default-schema-tab' },\n responseAreaHeight: { type: String, attribute: 'response-area-height' },\n showSummaryWhenCollapsed: { type: String, attribute: 'show-summary-when-collapsed' },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n persistAuth: { type: String, attribute: 'persist-auth' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n\n // API Server\n apiKeyName: { type: String, attribute: 'api-key-name' },\n apiKeyLocation: { type: String, attribute: 'api-key-location' },\n apiKeyValue: { type: String, attribute: 'api-key-value' },\n defaultApiServerUrl: { type: String, attribute: 'default-api-server' },\n serverUrl: { type: String, attribute: 'server-url' },\n oauthReceiver: { type: String, attribute: 'oauth-receiver' },\n\n allowTry: { type: String, attribute: 'allow-try' },\n showCurlBeforeTry: { type: String, attribute: 'show-curl-before-try' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n\n // Fetch Options\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // Filters\n matchPaths: { type: String, attribute: 'match-paths' },\n matchType: { type: String, attribute: 'match-type' },\n removeEndpointsWithBadgeLabelAs: { type: String, attribute: 'remove-endpoints-with-badge-label-as' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n all: initial;\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n container-type: inline-size;\n }\n\n @container (min-width: 768px) {\n .only-large-screen {\n display:block;\n }\n .only-large-screen-flex {\n display:flex;\n }\n }`,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n if (!this.showSummaryWhenCollapsed || !'true, false,'.includes(`${this.showSummaryWhenCollapsed},`)) { this.showSummaryWhenCollapsed = 'true'; }\n if (!this.layout || !'row, column,'.includes(`${this.layout},`)) { this.layout = 'row'; }\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.defaultSchemaTab || !'example, schema, model,'.includes(`${this.defaultSchemaTab},`)) {\n this.defaultSchemaTab = 'example';\n } else if (this.defaultSchemaTab === 'model') {\n this.defaultSchemaTab = 'schema';\n }\n this.pathsExpanded = this.pathsExpanded === 'true';\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.fillRequestFieldsWithExample || !'true, false,'.includes(`${this.fillRequestFieldsWithExample},`)) { this.fillRequestFieldsWithExample = 'true'; }\n if (!this.persistAuth || !'true, false,'.includes(`${this.persistAuth},`)) { this.persistAuth = 'false'; }\n if (!this.responseAreaHeight) { this.responseAreaHeight = '300px'; }\n\n if (!this.allowTry || !'true, false,'.includes(`${this.allowTry},`)) { this.allowTry = 'true'; }\n if (!this.apiKeyValue) { this.apiKeyValue = '-'; }\n if (!this.apiKeyLocation) { this.apiKeyLocation = 'header'; }\n if (!this.apiKeyName) { this.apiKeyName = ''; }\n\n if (!this.oauthReceiver) { this.oauthReceiver = 'oauth-receiver.html'; }\n if (!this.sortTags || !'true, false,'.includes(`${this.sortTags},`)) { this.sortTags = 'false'; }\n if (!this.sortEndpointsBy || !'method, path, summary,'.includes(`${this.sortEndpointsBy},`)) { this.sortEndpointsBy = 'path'; }\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n if (!this.matchPaths) { this.matchPaths = ''; }\n if (!this.removeEndpointsWithBadgeLabelAs) { this.removeEndpointsWithBadgeLabelAs = ''; }\n\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n if (!this.fetchCredentials || !'omit, same-origin, include,'.includes(`${this.fetchCredentials},`)) { this.fetchCredentials = ''; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n }\n\n render() {\n return mainBodyTemplate.call(this, true, this.pathsExpanded);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n }, 0);\n }\n }\n if (name === 'match-paths' || name === 'match-type' || name === 'remove-endpoints-with-badge-label-as') {\n if (oldVal !== newVal) {\n window.setTimeout(async () => {\n await this.loadSpec(this.specUrl);\n }, 0);\n }\n }\n if (name === 'api-key-name' || name === 'api-key-location' || name === 'api-key-value') {\n let updateSelectedApiKey = false;\n let apiKeyName = '';\n let apiKeyLocation = '';\n let apiKeyValue = '';\n\n if (name === 'api-key-name') {\n if (this.getAttribute('api-key-location') && this.getAttribute('api-key-value')) {\n apiKeyName = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-location') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-value')) {\n apiKeyLocation = newVal;\n apiKeyName = this.getAttribute('api-key-name');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-value') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-location')) {\n apiKeyValue = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyName = this.getAttribute('api-key-name');\n updateSelectedApiKey = true;\n }\n }\n\n if (updateSelectedApiKey) {\n if (this.resolvedSpec) {\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => v.securitySchemeId === rapidocApiKey);\n if (!rapiDocApiKey) {\n this.resolvedSpec.securitySchemes.push({\n apiKeyId: rapidocApiKey,\n description: 'api-key provided in rapidoc element attributes',\n type: 'apiKey',\n name: apiKeyName,\n in: apiKeyLocation,\n value: apiKeyValue,\n finalKeyValue: apiKeyValue,\n });\n } else {\n rapiDocApiKey.name = apiKeyName;\n rapiDocApiKey.in = apiKeyLocation;\n rapiDocApiKey.value = apiKeyValue;\n rapiDocApiKey.finalKeyValue = apiKeyValue;\n }\n this.requestUpdate();\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSpecUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n this.requestUpdate();\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.sortSchemas === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('api-key-name'),\n this.getAttribute('api-key-location'),\n this.getAttribute('api-key-value'),\n this.getAttribute('server-url'),\n this.matchPaths,\n this.matchType,\n this.removeEndpointsWithBadgeLabelAs,\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n // Public Method - to update security-scheme of type http\n setHttpUserNameAndPassword(securitySchemeId, username, password) {\n return applyApiKey.call(this, securitySchemeId, username, password);\n }\n\n // Public Method - to update security-scheme of type apiKey or OAuth\n setApiKey(securitySchemeId, apiKeyValue) {\n return applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n\n // Public Method\n removeAllSecurityKeys() {\n return onClearAllApiKeys.call(this);\n }\n\n // Public Method\n setApiServer(apiServerUrl) {\n // return apiServerUrl;\n return setApiServer.call(this, apiServerUrl);\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n this.selectedServer = undefined;\n if (this.defaultApiServerUrl) {\n if (this.defaultApiServerUrl === this.serverUrl) {\n this.selectedServer = {\n url: this.serverUrl,\n computedUrl: this.serverUrl,\n };\n } else if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers.find((v) => (v.url === this.defaultApiServerUrl));\n }\n }\n if (!this.selectedServer) {\n if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers[0]; // eslint-disable-line prefer-destructuring\n }\n }\n this.requestUpdate();\n // eslint-disable-next-line no-await-in-loop\n while (!await this.updateComplete);\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n }\n }\n}\ncustomElements.define('rapi-doc-mini', RapiDocMini);\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\n// Templates\nimport overviewTemplate from '~/templates/overview-template';\nimport headerTemplate from '~/templates/header-template';\nimport { schemaInObjectNotation, generateExample, standardizeExample } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport SetTheme from '~/utils/theme';\nimport { isValidHexColor } from '~/utils/color-utils';\n\n/* eslint-disable indent */\n// Json Schema Nav Template\nfunction jsonSchemaNavTemplate() {\n return html`\n \n `;\n}\n\n// Json Schema Body Template\nfunction jsonSchemaBodyTemplate() {\n return html`\n ${this.showInfo === 'true' ? overviewTemplate.call(this) : ''}\n
\n ${this.resolvedSpec.schemaAndExamples.map((jSchemaBody) => {\n const examplesObj = generateExample(jSchemaBody.schema, 'json', standardizeExample(jSchemaBody.examples), standardizeExample(jSchemaBody.example), true, false, 'json', true);\n jSchemaBody.selectedExample = examplesObj[0]?.exampleId;\n return html`\n
\n
\n
${jSchemaBody.name}
\n ${unsafeHTML(marked(jSchemaBody.description || ''))}\n
\n
\n
\n \n
\n
\n ${examplesObj.length > 1\n ? html``\n : html`
${examplesObj[0].exampleSummary}
`\n }\n ${examplesObj.map((v) => html`\n `)\n }\n
\n
\n
`;\n })\n }\n
\n `;\n}\n/* eslint-enable indent */\n\n// Json Schema Root Template\nexport default function jsonSchemaViewerTemplate(isMini = false) {\n// export default function jsonSchemaViewerTemplate(isMini = false, pathsExpanded = false) {\n if (!this.resolvedSpec) {\n return '';\n }\n const newTheme = {\n bg1: isValidHexColor(this.bgColor) ? this.bgColor : '',\n fg1: isValidHexColor(this.textColor) ? this.textColor : '',\n headerColor: isValidHexColor(this.headerColor) ? this.headerColor : '',\n primaryColor: isValidHexColor(this.primaryColor) ? this.primaryColor : '',\n navBgColor: isValidHexColor(this.navBgColor) ? this.navBgColor : '',\n navTextColor: isValidHexColor(this.navTextColor) ? this.navTextColor : '',\n navHoverBgColor: isValidHexColor(this.navHoverBgColor) ? this.navHoverBgColor : '',\n navHoverTextColor: isValidHexColor(this.navHoverTextColor) ? this.navHoverTextColor : '',\n navAccentColor: isValidHexColor(this.navAccentColor) ? this.navAccentColor : '',\n navAccenttextColor: isValidHexColor(this.navAccentTextColor) ? this.navAccentTextColor : '',\n };\n /* eslint-disable indent */\n if (this.resolvedSpec.specLoadError) {\n if (isMini) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
${this.resolvedSpec.info.description}
\n `;\n }\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n \n ${headerTemplate.call(this)}\n

Header

\n
\n \n
\n

${this.resolvedSpec.info.title}

\n
${this.resolvedSpec.info.description}
\n
\n
\n `;\n }\n if (this.resolvedSpec.isSpecLoading) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
\n \n
\n
\n
\n
\n `;\n }\n\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n\n \n ${this.showHeader === 'false' ? '' : headerTemplate.call(this)}\n \n
\n\n \n ${jsonSchemaNavTemplate.call(this)}\n\n \n
\n \n
\n ${this.loading === true\n ? html`
`\n : html`\n ${this.loadFailed === true\n ? html`
Unable to load the Spec
`\n : html`\n
{ this.handleHref(e); }}\">\n ${jsonSchemaBodyTemplate.call(this)}\n
\n `\n }`\n }\n
\n \n
\n
\n `;\n}\n/* eslint-enable indent */\n","import { css, LitElement } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\n\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport ProcessSpec from '~/utils/spec-parser';\nimport jsonSchemaViewerTemplate from '~/templates/json-schema-viewer-template';\n\nexport default class JsonSchemaViewer extends LitElement {\n constructor() {\n super();\n this.isMini = false;\n this.updateRoute = 'false';\n this.renderStyle = 'focused';\n this.showHeader = 'true';\n this.allowAdvancedSearch = 'false';\n this.selectedExampleForEachSchema = {};\n }\n\n static get properties() {\n return {\n // Spec\n specUrl: { type: String, attribute: 'spec-url' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n\n // Hide/show Sections\n showHeader: { type: String, attribute: 'show-header' },\n showSideNav: { type: String, attribute: 'show-side-nav' },\n showInfo: { type: String, attribute: 'show-info' },\n\n // Allow or restrict features\n allowSpecUrlLoad: { type: String, attribute: 'allow-spec-url-load' },\n allowSpecFileLoad: { type: String, attribute: 'allow-spec-file-load' },\n allowSpecFileDownload: { type: String, attribute: 'allow-spec-file-download' },\n allowSearch: { type: String, attribute: 'allow-search' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n all: initial;\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n container-type: inline-size;\n }\n .body {\n display:flex;\n height:100%;\n width:100%;\n overflow:hidden;\n }\n .nav-bar {\n width: 230px;\n display:flex;\n }\n\n .main-content { \n margin:0;\n padding: 16px; \n display:block;\n flex:1;\n height:100%;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) transparent;\n }\n .main-content-inner--view-mode {\n padding: 0 8px;\n }\n .main-content::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n .main-content::-webkit-scrollbar-track {\n background:transparent;\n }\n .main-content::-webkit-scrollbar-thumb {\n background-color: var(--border-color);\n }\n .main-header {\n background-color:var(--header-bg);\n color:var(--header-fg);\n width:100%;\n }\n .header-title {\n font-size:calc(var(--font-size-regular) + 8px); \n padding:0 8px;\n }\n input.header-input{\n background:var(--header-color-darker);\n color:var(--header-fg);\n border:1px solid var(--header-color-border);\n flex:1; \n padding-right:24px;\n border-radius:3px;\n }\n input.header-input::placeholder {\n opacity:0.4;\n }\n .loader {\n margin: 16px auto 16px auto; \n border: 4px solid var(--bg3);\n border-radius: 50%;\n border-top: 4px solid var(--primary-color);\n width: 36px;\n height: 36px;\n animation: spin 2s linear infinite;\n }\n @container (min-width: 768px) {\n .only-large-screen{\n display:block;\n }\n .only-large-screen-flex {\n display:flex;\n }\n }`,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n const parent = this.parentElement;\n if (parent) {\n if (parent.offsetWidth === 0 && parent.style.width === '') {\n parent.style.width = '100vw';\n }\n if (parent.offsetHeight === 0 && parent.style.height === '') {\n parent.style.height = '100vh';\n }\n if (parent.tagName === 'BODY') {\n if (!parent.style.marginTop) { parent.style.marginTop = '0'; }\n if (!parent.style.marginRight) { parent.style.marginRight = '0'; }\n if (!parent.style.marginBottom) { parent.style.marginBottom = '0'; }\n if (!parent.style.marginLeft) { parent.style.marginLeft = '0'; }\n }\n }\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n this.renderStyle = 'focused';\n this.pathsExpanded = this.pathsExpanded === 'true';\n\n if (!this.showInfo || !'true, false,'.includes(`${this.showInfo},`)) { this.showInfo = 'true'; }\n if (!this.showSideNav || !'true false'.includes(this.showSideNav)) { this.showSideNav = 'true'; }\n if (!this.showHeader || !'true, false,'.includes(`${this.showHeader},`)) { this.showHeader = 'true'; }\n\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.allowSearch || !'true, false,'.includes(`${this.allowSearch},`)) { this.allowSearch = 'true'; }\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n }\n\n render() {\n return jsonSchemaViewerTemplate.call(this, true, false, false, this.pathsExpanded);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n }, 0);\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSpecUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n onSearchChange(e) {\n // Todo: Filter Search\n this.matchPaths = e.target.value;\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n this.requestUpdate();\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.sortSchemas === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('match-paths'),\n this.getAttribute('match-type'),\n this.getAttribute('remove-endpoints-with-badge-label-as'),\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n }\n }\n\n // Example Dropdown @change Handler\n onSelectExample(e) {\n const exampleContainerEl = e.target.closest('.json-schema-example-panel');\n const exampleEls = [...exampleContainerEl.querySelectorAll('.example')];\n exampleEls.forEach((v) => {\n v.style.display = v.dataset.example === e.target.value ? 'flex' : 'none';\n });\n }\n\n async scrollToEventTarget(event) {\n const navEl = event.currentTarget;\n if (!navEl.dataset.contentId) {\n return;\n }\n const contentEl = this.shadowRoot.getElementById(navEl.dataset.contentId);\n if (contentEl) {\n contentEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n}\ncustomElements.define('json-schema-viewer', JsonSchemaViewer);\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/rapidoc-min.js.map.gz b/dist/rapidoc-min.js.map.gz index b6f5484779e3fbd17afdda8c53a7394731388e2a..4c2fe7632bcc133c63d2e6d77365ed01ed0b4af6 100644 GIT binary patch delta 80610 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 delta 80303 zcmV(%K;pmS`2@801b-ik2mk;80006L?7iD^8%dHV_$yiJ>IP5^fEP)10VS#_ilx$& zR8mW-p6Qi1#Uzj3?Vg(r@^8&n~*VBX=n_gdbHU{Z-UAZ@2Wro~iQGYFoedJ9GOm zfW5#sXOEo@oPQp8wWqwvI)K>=J<_Lc8>XSBYD!+(!{NiUo5Me2-o?3WzWNty*rwm_ zceb3KRPXwW{D;lyGk@v45vT=vA^)C#OC9dckEry&M(VIGpzy|HdpWK7vet!-Io{}A z_>22l9~i%HtYsswnnC;5?eD|!js(siEe-mQ0gUI1_iaDz&hk6E`r;y?Eu2N2==9UG50f%@LtN;cuyo&IPO zik0Rm|8D0OSwn zJSA$kSe(iVh|HM~zVlw%E5@-{V^M(r+uMmUtY?qCp*-{19p~KPTPcDPd;YUw1D`R3 zdcheamuc3$>5X91hCPpI-@DdHv$J=k5Hn#pH_XA7Z;Z)`{_bl)xFfMS{!j?E7Z9r-qz61WaJT@9X3#y|&*+ zz>{0{4+P%*FqY5+eY@lH4V-X2-LVg;XMYY+S6k?fAu2n&i}-*o;?an|FG8o2{_xV3 zWWoZcb@1)%9OA==$2NKs*wZJ@cVm4ze(zxq0C$17}iV+`V`n;5>GAU+!!PaQ6EpL5 zR1Vh79X|=_&3+#uRxX*bxAXVG{eSt)qvL!_IA>(dACGt4Q&cm;XU6!@dKRc&LUqp! z{BdCliK%?k$mrJ`x>licLm}25@7$htr2KKm)BOn==I@-?Uwh^3Vg26IFX5)yy?E>r zRlffTvU|^h^Yo%lP4e`51fx-cy&Vd-B9b*CVT4B2p%H$TXVdOZ2#ak7`+s{^{~k~u zg;g7Tw35#}6GBj` zV3mWk^l6wHTDB=B28YPz_bXzYQ^11zX^1ucap#jQ*z27;{X120R*tjk&gk8pkJ;fo z9e)_Dtw|?`wc%P-j@PQi<$pA**7Di>Y%vfI!u6q{!qGIlSf%_TJ)CB%RLEwNd6Can z0%~67)#-{*tx|lJp083opB)velpmi}i=rL;XN!Ca6^hf-Vm6?M`tpnHbUsZN&`Fhz z&&qspIjF`b*=aUVU)t6m7ZX^=6dto`^~&jVdI&{YR)q1*i&-{XRDWwfS1`~;nYFJ$ z<4aeovq+Bzv=v&{fcJwk`_oxgE!wP@1ggb~1xA8fsO?N=7xQ#B$tDB6k5*r31;ENx zi}S2J&$Ev!SFE63R<2wP_T^!^dbOhhcHB*-=-L&h#c{E6rIRe3w4NLfMJsr$TKAPs z&ePc#HhPwpm!Bv;9}s*+`LR2HX6XPPfMTkmJ@XKP<1Sv5rj zoa7Z!hvYQ97)-NS^2L+d1|9+GllcZDe{y}DUPAvc@XJw>&j6lma5yc-ALz?GolNrC zF%+F&BpdLLX{5^koT-lVi$Qe?hlJ>=I9p(AqeOH!1&!Y-O-;{`%8%jhi}!4))_5cQBS!(JIw zC+Vd42;)sQ0K&WQUwM3(cGvs#f5VNk@iQ*@e^#~Bn-81XeC#67zVEj}xAAIogoWfuAD z(kb$#U1FS<<7sB#Q8;~n{nxD6=mgIxDD`P)2o5I=iH~{6Ql?`>UDZWmRc!^N-v|R> zBx%E>p^?MmyMgf?skd?}!ygqs&kEd))8b<`5gQnGAn=-i(8GHYrbSUqfAO%^bSJbI zG|{*x=>^R3aXuTZ=W4nN|N>y zK^pqWAra+%GA}bZE!3ErXNMj(_AcbP!{eR>^oE0cd`*L+jvN9o6alXQm8SkEJfPdUo;`d|{`v3WgmhkG z@xbeOT2&tbX82SOAP7%I;843K54CnUW}O3q5GvwtoqhKSgJ>eecw0{%YY2(m-F4BL zY|%mjz`0`p_pF?D-`|;}i*!V9)~fU4-(H+fx5g)FS!IidXN#k+fBV0_y9@7sy}1rw zX4S9nKKb?L=E-6)|MlISUvGX3|Nrsh$Kl7j!=i*j-)^q2ufrdzu?dxEUx`W^o8px? zoB6xDd(g=|g@T*w6Y=52#`^FsJl-ANef}l<{c4E+ZVbN??{+ru3I1Eh|3uMy!>^|I z;qU#_{H-PFws)Gax?-SZ=9VJQ>Yl(i?wCgf5x=Raf+uPF<&`-QU}V0 zf-OuaR^M5QzRT&e8M83;46p`x-Y5o@uq8}4lHVp9!2Q^#f-{8CNMQxO7@W8-|PF(p<-auCSsZrNXK z28y4ifpb{(e`HoxH`M2w%=;?fkx;0KS7`RNIab1L58!|rf2i+4lyPN+QE&`NyrYw| z)5E5YuuM?k-1JYg`1GnF4*_jIu$Rdx6$t7_-)?Oc|dyqUXE{Uf@rblS_W6hXwJwoo5IYVXK~i(ew7S2?pJ*#@XEJ$;iV)p^u}f3?<(zq z`-~JJ2YRbC0gGZTR=~{vTf)1#1sJ7A3w0Ek@uY_^V`qzcZu>?P{k4`$Nb567Ivp{2 z#T?`&fBA8m9WBgLDW_kJUn7XY4826EO#ND5`|24UsRQ~1|9nL&5yIy|vWxQvqGj#G zj%A@*Rm5?bWwW@bsXqr+RfEw63ck#-^)qK+Y(X*V;O+KLq@Xwuo zgNiSx#2c2y$9^(|2@>N_>yJh`Y&j7{BuT+Ne=*1x*=aRm3@aJ%CV2^5q1d>^M=7D} zW_itOQD%$rNw6wZI6Iw*+BX=~sjzTZhXbnci04>WOti+0X*#cfN>j=ZrPjZQ5iQEmQC?Py!T2PfPLjo>U-R)qOn?SX&;iD- zf0&w+e!?G5+=H-=<+GHj^}Omm!K&J78InNnH4$I~-ViHilflNO12_L5N1*%JU}q^C z_Gnfty6>p3{hl)i);G}{R}$mK^jka$NFYbYo2#(UE6k_j{Uf^cX|`B!)Sne4)ND9_ zB&_a22$qE7x@1yXZV`K)wvz=KUhr>;fB#r`tY2Cin6S6)cBF+u3H4}-TJUT-&F57v z_yF_zBnNz%DRmAY=yT?iBi&X4d{ke1yG-=)ZnbdIz$2wNQ9B zTcm(LFkNtNX+963mcuM&)5`%V(21845cMwh0g=cPf1(9X z+Yamb5y90VYPAMvdI2;9Y2d>EMSsD+!H)sGQ=gzgjcv{-CK-%)70Sk$c!6n3f6A9# zDfw=91c|*WW&^1~4V7UY7SI+OHkc7Zm4^LfPY2&x;t0aMrT)8b3FX3(WJDX!=c`aZM!W?N>y*yIM4e^hnj9s*M*lvn-cf^3exVT)0L_%}Pwd|jVEa#pet zMA*+QVT6*+KuRvO8AemE3B=>9C4^A089*T+H^ZmPHGwzD;OxuVK`6>L16gL1HZZDU z?tb+<#(&y@NdG7R8*w59_PQndVA0kM7jtAwt9DJx!p+lqnW34l&CIfrf6bFS$>zXE z13N!yiv_BD3v{)J7y*8iPl5c5q*l4RKK!y5pxLZbVt=l*5JYE#_AXE)5Xm3P>cA*2$le^p;Z?hs{6uiY69h{Uir-kg8*)*-FOJDCnV0mtEuYFe$% zPEiAI$!1?`Bf!#>NQOa9JSYw+GX)4ln@S$CIif`C`&Qu>PqW2IF|h^7O}5i&*!)(q zLrWR&OEsny1Vb$sO6|gz4*76Z<%$XO^uiIhC`;Vbat{?IcJK%!f6dX^e4dr#wBnM_ zKJF>;Ij> z`7X0MZLDvi0#vMLts+LyU)<4264J#;y>5*b!!q3m+aYa;e{9I#l));e1K6t{fQ6ii zlcrCFgj&V>=rnDP6w$O#AJm|n-7I%&dRd^qTZtIP3JOxd9CMe#_!-};_GV-dd8>_< z581J!NmsjYL$Kyswe51A$L4x?!5e7+@hZ)`@ieWfFCM_i$G3toTi!pln)p7TBzw@)% zcyUI~4?&wp&w+E1vd+`Rq8!Z9Q`S8`(Ks21M29E78|yrueQ?`9LU;feYBm6o^1|SC z4vS)%r85S^+3BIs71)gi+9QhZOi5V)$Gf;>bBZhL3={}nwMhBWRF|iR%2aCgL09Bd zt1gowf9sMvUcq1%^uy{PU6f~22EvEz5;rHqnKKaD@>vW7Sv~^6qJ*u%#&?pI&Pt!B zF!|;k98TGVd4!H~VXsZR?zy#ISHSs5tuX_p=X~DJ%II{e%HhETCJ)6MCWksw&(c&~ z02Li`iIo_#M7($U5dhnM>nGWC?t%jcSm_Gge>5jIHj*RBou{*GYI`s+>oArOZi1C4 zBdPXXm#ZaZ(miF+x~7dVsb~DP73GrI?bz!JO?KlBcg~=q4s!Z*THTRMv~S;p;$HUl zwA|Ix!i^|NgM!5e$2GykZY>3TF_pun1~FpK(+p+OTEAgQ{F>L%T#{A+$SE79WAyj3 zf5aVsqJo~DNz@c;of<)(WYss3G}*f#e7!OQ5~KEN3?E+bb`V+-xi3 ztsTU6ye2-PyQqWnyvh#+$yZ!9Bgi zsvDtNN2OaF6y=dqUy3eR!xG#!(3>vIf81wwo$Kwi$49Eh zy<#TqpUW0uVtT<&DQz+$1m?rs(v6n4~eGEfc3mDzyq>#1yi zMf745xQF+Zk}QS2OTs#B%6y89&hTz!oC0ZkGw_1Fn##7LPLP^NQC6#-VMZ3|BI|y$ zKFN;d`QRLWiGM_`d-RIaqF5iBe_zEriBdmdlT5-y&pU}~FV#d=*+W~G0x|8;CXPI@ zfz<>yaxR*kU^mRMP{u{D5fP_=Ry>3Xx>xR9YaE*Y`~UiXJIt=3nF>XcwU2VxY!UZ= z_m_1bamU4WU6QV5Yiv)}tJMatt;~NLV_#)-f;KkYFA-=Wz6~^q?I-5Ge^Py8k*g#g zwQXvJ-4m%fa~+}{C**CFu8sGqHIqx8;rD`~K$NdF3MsnSZvI*4SirD)oX$xQ{d49G z%|zSa4A#kp^|aY{7)^&6bD7DYKY92Pi0c6zlbWQ_@}8hoEhrqrnk3?-Ry+6hG}TRr z88JhT2D`533vC91Ou<0DfA0m3Xc66jT5a#oXpaV$a5aQBDEB2tv;cZ?aI1_d&;s70 zK~AO}6SRU4XAP3HnEtkdl!~cbD@_rOjhbNoKmE@Ud z=a5^yyG@4piH<-a(c9am?kgf?-FKifb)RW#)O=Snu8Wwd4=EoUf7(z-$y+i;_B7F# zY$8tL@LV+&p$Tg$gtOLEhNiBmkeWZcTx=3o2r&{rEj@&{{a4ll^J@J4%tZR{NLS*$ zMIDLvl5``Vd~04`|MM#}cLwQsy}Q)FoI%V7L%S#NeVz<9SkwvAAyDPn=r98oBXii* z_jmsC{!Rnq$%4Avf44Y+`*p1B(gT2zuoy5B7TLjSO1HHy-p}5ik^_Aa2Q&Yg@ zy^CyoMrSjN@udx3lk5<1cbs*PW_@^o2Bel|n!$MT(+s47XHSxc$?QztS17Z^8Nk;a z4u^m_RWEtCt<2`*X_l66MWwE;tPJ^N5EB#kkVY)u^IocKq3U;e%Yg2)VLFGo>tX}_ zgu0duEEVL!f5@)TR}NKlo6pVx!6v&H&g6A=ymtYet-X8yzWUYZ(Qh7JE%(=sx01EB zghV-9@8fJn^lo;XP|f6IaXL-1X@=(3B%f5t;U&xkhMmANu)eB~gkq)u4g#+z?9xeh z&~xCC0p51z`S;l+z|#3izWE9M{PZEavN6hKdD?bs^LvX99tQL5Vod@rWw8O=Le2>H67K({?-ay4M%Vt)Cy*q!F{ z!y+vwT{JTHldPwAD2(}VG25HMShL{*{b3ec<`YtY9gL*#Fo8KZ!#N&~;dznmi5c&9 zRFHs>tucH8DmdonVrJ1=uc)4s{lzJr&ac2IsF!p6#jJ2%Bh7@cxdmGWr}+U zz763F$^lu{A{X|RgHZb}%IamxA#q;80R_?;&b$fse@#AYJk)^JBE}0;lqc?y0gA&VQunN z$t^~GNt2O=$E-BqHD76z_JoF6m%vB+EI=mC+ld`@6iCFdpx1k$BP01D3yuwUdTikm zzg4}Pb>qtwd!c>a)D4gk`yFoif38nGQ1#XglaC%z`|H7op(9SKYXK=I2 zhb$rmBX6@hJJYRdO%x3TJY^$l4O~GOczdD6l6*Tq5`#Wpf zX2Gba3gDic;*wCv$}&|nM!1IVze7iGoG!rXeb$$5gm&VfIFiAAp%vi*PBspNqC4z4 zeXsG(8-bb?6WCIJ`P~GCLCTxPGMoht~>P{cQ}Z`k`x@7b=2(ZjarW@n-_B@$gyr8y>sRc9D|raGK6O zbXFO;Q13cf8`2W*EKyDi0S^VTQ`&9PR66Qy{qby8rAOI!Z-Jn)B5Tq%d!AKmqQn4O z8U9>#qN*Ozk+iX)5M%lKlZT!BL*!cI|w1cjL+9jorI{ z-+r~XbN}w$$6w#y+x+IW4k9HHG$|wYjf}0 zbn%BLkN@TSS3AYMe>r~sJWYT9?Ta7BzkfBmzgxa~eg1r!7Kh)wdi%$*7$0hxzPy)Y zbj50ty!mctuzCMW1MajKr*QNYWqO={NrkP{*M{}9L`j8mx2qB;y`lU`z>`pphnZ5F zpejW~IaZHlah?MdP#q*;;Ew{@71<F*M*{mNy(>Y9kt9;zi zz0t;&^Tt@iKvxHku_o}jkI#;dvT}$h*ab#d)n1NJ7!y;zJb-frW1Dx7{gk8_y9R7v z9Intc7%hjlL_MSQGlNr_X|J@p*%*Kw`1O|41Ke{~c9KU)=P~_EIthjXUBckp{^U58 zY6aYmgV0kU2AW$*S#JdLk(~8^<9vcHb&8%z1X+}43_l#K3DWjrwu_deovG}v>Z-te zEiheaL(aJ>C9%DhREKvsP;{Xc8F$6Yg-HsTAUeX#JK9>Bt;;HuvyE? zH}Xnlw=+bg3XsYH7K4+3a6xJ%w%n!^(zIw!6^%C;LESLRAnh)?d!{fDN7EH=n4@7W zloSB@7C=Pa1^;7R_ri)+LcF;k0y}3?S>C~OBD8iZ5)bh|UFn^F3+R6GkYf|8Q`I%z zH%6o& zV4#(7Mu2y3U;hz(e5MtnNN3aswH{_NQ|gj>>?d^1lr*&u6~AyJj`Ak7sgB72{->*9 zZN>H=*Hd5RG#yia`4>C8SXh_s^-vkgrb)6%bqBgHiW!4931P7MPjTtQf)B)k!xCl} zV>&vL;wZs2E6V)O;!-_^D0n|}49-V*A$G@rCPw%p3i}{43e~3k^(F&>7DHxaLWZM4 z$7L#1+c6XtkGxWG$GP|NW#Xh#>G6Vq%V*q#fTS- zp~4q72ar|sCqiPTv&ZTgR>ykwNL7KKrP^CG0@y2ZF#rZ-6L!dg;Eg$>UXh_jDuRA| z{amP`#oI1d?}*WCD1SBtNjzomxjoNI}q#o zQ$FdK)mAirr?y5#tJbkGqi6H}2D;A>I$0A6qG~P&uAGirr<6I!>LFJ+_!Hn+$3jU5 z3WbzSGl8>ZP`F_dpu|t-Qm25Ez*G#vVFis>ufE^ivp@+U{X>KH8bXOE$TfF6))t1o zVlt;%K9o86qBO~!$~{L*oX&#$%_7yqRnSFIkd7gLCiNich7GZCAQ3dGp}4Wk!pyv`wk=>gAia(4@o?Oja_v968iz>9|5-JFj{B*x3-Xy>>ZY zO>c`24r{Gzix?6=DfZgD7f0Jq^upq+Y~G=ss|z>B-<$3^1Ev7iMBlO9THl1b8Yv|K zeIB5Hw{JpTlB= z(}@Ovc9v`z*DNaDnz*Zcc3z-<`6D{l(!L>o3=kZ*&t3^FG=3}KpECIf%xm#6InPtr zzg2~im@@R4_Smpu_ODd*g(yXi)!ozTn11xJ9bjVRUbq%><{v(dY?@q?3P1u7l`cnE z4oIET0kAm0JEYg|s6e3z@^CyYv{M|ex*F3Ey=aF=>4z-hx+L|%R(a2J^kZ7ix}Dd5 zATK>B#v{EyfmbFkUEvyS9bsx6Iu1Fv;i4_k)Y~2w!q6zNO$1(`doR|nZQN2c+ubVX z2y?*M2QFE$Ls$n(ruEbgL(hrs_0h+Mb9`McKj6pLGy{U<*i-QA6z#KkOtOKma@N?L z+UJe^%|CNo8JxJmu{H`xcYeSO#RN)!D52=vmrq`f2zue%Ke+@>1h_eM1po=b5j8k4 z4I-~LNyzgZ-Yd3K_+mIzM7ERdax;~!AQgruWw=Ja?LG0vl2vH)JXD2;;&0dHbD2ng zl5XDr^1HM;(foxVe8X{hIbRgR>g;d<`)86LgQVN-NTU}pF|;3uV-}mgN`9Pw<%_S$ zTUuT_kir&luun1EN6mM z;|6%Q8aJ?e1pgTwErhSQX99{9#2X`8)0Q+l*uL>#OS$IegP^}S=~A@CHZ6Y!MG0I{ zIU*X1;)5Jn?nkTEurz5g=8o7AU5AsBhX<>^4GDqX%|DV9Jhm zZ8D+g(aKe7K?$mD+DtiCwC8=0&sr~7q_zjD6r?#$iOhO$Q2g4Pl9M&wCX4sE1BXUu zNaET+rRY=n`8vIQzAPWc*{&?%E1H~<9Q-O^(imV92Nog4Kq1f+3iL03$XhZ6GAcY4 zrRaY5%igep!!PS@_LFaVOHrbAajUyoF&qCP-D%3~`cH_%B7AJcP8-Ie2pzIiyx}P1 zv4eI-aTUJIkMr5m|A5YobbkeoCSiZXbQRH3)3gF)pJW#=kLb!zZ@C5n7OHOvLnYr? zs_~+Ej%g~?Cc@V?gTudnz%YaiAOqIoq@i&d9W2lD;;c%DD^(0^#m@Ayj3KuOJ@Erf zWeCqh+D?JvqDjxjot)bOS!YYA8nnG%o>&2eBra|TB}=qsR|JbQ)ZORlnL z>X9*y)`|r5T3cKKUsP*@FyKtkV;Q%Ewi{WXV+|s8`>HSP-RD=L=L< zj|ejk693i}B$5gR=`WvC=eWR264slcT&#xKwuKF;d)745sKuJ={v;HNXi9y9%y^3x zt4@lKKTYyqZsf$uM!yr zVu3oCBUtn#O;B;5YM{DDXeCfX12SJ$q2pqfRL~u&uyWwvRC`sAmNp$v7gM5AI#^hkhnQ0EQcOleg=rF}J>Opz+boK7ZG^0{2ME?4PxloH3f{h(C| zG@&7l8dnM!<(i(g6%{1*Jl$B^W{u@4DJavrL?QFZcM0ex8|$7G$3C0H5O$gAO(TeP zC!YpJKgr&x4aee07ooBH$r)^lhqZUIx;k~=zNvyh)d$Q43f z&k>)EN=2zs-pb1%v|K+>&#|e953sLdpy-8qx8GO#f0}g1X~F(vuJvl)0p`1RWhaFXq09ow+J&2!QH#Vcl{Aw!3$bkWG zO1!#xItOSbnyr@#I1!9N###_!9FsHH3;`$gnKdx>vBzu+x&rzB$o5f;GoOYc%1YK< z`}g;M@7LD)>O3T*nQIoJYy2tt*x;%)ly1-n4g+9J`SLI2nYH26ws z{k#UFb<`Wr1s*Th9Ee&ECi!_nNkksLzhg97!od8g+ROKMw1w5mcAusgH;-Iy z5IBf5LnyH;JBmS|25nq1QGvO67yE{>|L-uh8IJ*+B+sc5B1N)=8$*9(l0`uCT zd?Q%_++4;gEe7Q)#H_=Z0MEH<19mp(C;7sL_; z=gA{-r`mr=z{s1E`&5jN2j>@&2ZLZ!59BAGpo$8;TucXYlGU3;{b17#r4($o5d%Kt z6L=f2LonL^`4!Coo&k@fTtam$R+t4=;IsE`eZPklNn{Z{IiHvDAy3o8Y>F21RX}uT z2L+ZS@?eL_jrN+<(gqLu$iCn>=hh(~O8e!;KJ0(OgJj^9-q=^MSj6?Z$V{!#R0W~1 z4@~pFgPzw|sHlVPobY)ON?ZaMpiXu4#;5$aaLIabsqFoL;SCg)5lz93fgI}zsS%-s zk~a}U=Gk;ghz##Z9AX=UNZ2N4eUbp`CEQeNHX(w6dr6z;3&7 z>}r3O>&MSZ-RAgtvznl5dQ1^kqqD>6USoDl?d>oguY$P`e8g`)&E0Mv#m=vCDVQ@|K?4AXx`Zv|b{agZlMj3QWXyT4eQ);R1-qVMfu zUhg)xap6L<@+P<*OB*>E>h=&#acFs?h|Z}-z{v-QWS}*lsJ2+gx(5B_mEKJCORSm< zE_0}#)mA>#LhCt-PxsvT`DSQrn*NgtXfOL3g4UG5UY} zs{2`3vkQwF{JS23zYW}w&$2ZYKkzSMuotO_4 z!;;B_p@wqd2l#IwlMsgY^zSGb5N&^#u8bq>yQ9|oPaDHZogE|VZ6(VvB}ks`y-nV} z{C@8TSUxenm6y*y(gWH}?%afiFG{PBm~=Ok!T@zmUSst-AXEOpi{T)g5h6i({%YZM z_-$xAMhXAo$0`X0nhAW0#4c%j3;&uo@I^-Nz$JX)isD?zHzCbexPHHEx~hNeq)cD| zQh4{;D9MBTdMgeemDZk|>zK*U#M(iC+oH=97;T0y)++J1OHT9AOF6Dd;epD>1iTrM z&rV1e$V3H}f&&#cs0UO^zv-gf;+aE)&|qtZ>76?A5zUH2%AGL)`uh1*htgEaM0p)^ zcFC#2gpd@24-c=70`NGU;{|`RR3t(ru7Z6^I?K+sXFTatXNS_dA=94_HR-_N{Nvm2 z_I`N#YQD{KfRyjD4}fG7)aeK+)UDdadr*0uHm= z4}^HL9c^-%$N&=*yCa7qK0=e#z;HmLjUc(b$tkCfG&s=odFBLm;-r5A4yEng=X*P^ zlbz?!X$ar%{qarc92zl8g#t_+A~1>{3U>k=eS~*dkddcp-_qsU#=scY($DG=5(KZ;vGT*Y}u(+VJee)~vjQIE4D zc8HYPk_K&hBRLQ}+)6}&^JVrE4TFPh?Y*0k5 zuPLSjdY#vW@sa_Gt~axFw(Ix=H;ycBV3Ht_g7g8pbJNDBP?HbV=oy`L&6j+p-XFvp z9eIsf`US6Hp@@G_uQ331n$J{bDiR$;IT1BUl{+e?KwE)BIE1rOB;Ta)Q>hHCAY2fK zQ8;Vyt<@S`SOmIZiD0xMYE4mm$g}1pi5IX`#-vH}ELhkfJ%vuSWfDC95-X^hty-i; z@jHp)mST}UDGhQy(cM!|;gfdY^t4?&))rixt5YPU z9|uO2v0dL$@bLTb)svmKdvxx-*?Su^>?(YYDMP#sYum1m%k)yRr8YA`tivdr&=z@n zf#Fp$PG_@XksM|y9*Z~@Cs~=PP#@RYm#duvtB}fe)SZGf{&KYa_DLuXpqYXm+A*cY zeMXEVAXrs+XY;@usifilTGLWvm|x*Qh*P@TqucR5RzFi}J%DaN{~H92 zo0HTBYm14~IJ_!7LvWnz3X9_krVFoiUl12)AWVOHDtWq0mHl-Mxz!GSl(P<|9f+gy z>N^rQz})*Fv56N*6kkv?U5Q7ehjrR{c*mXm=nikX23lrbxV>h|nC^m64r! z9glw%%l8l3M9rQdBBrv^R8~`90`V}G%0bfA;!A=BO|7IE-xevMgMr#HYQh_dP1@?g zUos0wD_v-yuCj_0rTTzM-VKx4P&7}0gob%Ve{C3?Acy>0II|*)7snDCMgse}1!Xa- z7ZYRN436IfmXQHwljsmx8Tf|R_A2``j*NekNz+q&jLwt>lAx(2q7DIte!#pm{ZNS~ z*%1_Yw;#zq=3O6-z-lF)WYF33rIHI$A$4i5)3MU*Nwez;k*6z>c)Y5@##R@iEiVJ1 z`uff(x{s*sAZWB~&r3*XjWS+QULEZxotk`ubQ#|3fnk+Ef{N>y?dB2>PbJIsu?JuWWb5wCn~-b?5$NVstB4pcoD3cNhZr&G!xH{+&MQB+OI@mvY@M8^XkMnX2GSwL0ZQ#o>HSr~u!ymF3VtIdp2CWxg zCmS2*gL~<{T6T>h4D5QGFc(W z4B}Q0`4lMo-3a98d|u_%mO+2Yjr*2~Z*-DRCfO{e1eUf;5m54VL6@bq$BH)2rl^iV z5d+=8M8GIktk$abAXQeYbT&RI%0&Db=rrR4wPc8hWp)H5eiZazhhIonBEXlGIF36d!?8-BhVu zYbp}Z_R_q6U90P57cPH;voZvH%NM|Sb@)xgelnKfY2=i`qhP^NQA8@D|NgK4(OHTM znev914!7M~HVkF0X&P&ENcBc*A^-{NKzDtNGSJQ+1S@vTRay>I*h3xJdaU45$G=lB0k0G@o8_b`Wnk_7tHN z@8@NX8KxEGBxe#2rCklMx?7DFjYHemktpNFVdGM060^J^&c@M->_l~~w?L~_h;^OQ zBZ52XlvW4J!SXsph|--gGZ-Z@!U!$QQsh~Nhyuwhk8ee+{~N7w`&DkS&YFGs`(7-a zsfn6&7j7mmueg8j$(7?5obKhpR`}C0rp1h~g2DGUyMBDo3*_Cfo8(Uip7$~-g`6~7 zGWrw?Ep?}V=Wi#|@vAbgPG#eB{QYxf!GKxP-xj+d`5YE$X%Zs;$J*HT>5(B*i+_HBB|L$70S`wIR-8y4dvbMmBzkICGp0{3P^*zOpu_pPWNh}Wy3 z+20B@w<~{CEi1Ms6*P961~{X8#dnL@o`@Kx9?Yb@)34aL=>TH017{G3Hgw7eXUxui zx0A~Fnmro;H5?m)Vsa@#xJvZ1$dx{v=uk+eXah7P4-!0-T)npy($Hx!z(c!3xq@Z! zG30PyG!B-3KHo6XDcaKJxHfaS?4*^^!h)PNeFuLM$2p)uCLJ{4PSe>j2FqA>wiEG; zH@eY&B|b4%qh8QWy$Q;2)F*>c33oV^bCa064c1_sWoQ@=Qy;oBRTR_1w8Yu6TpuDT zR0?1vRSP8UDYDUF4hIfp#ama!Svk&>a{QX&ny}w2?}iNOIT5TO&Og- zN@m-$T*b{v+FohmdKL^B;cMh9wT!uTVvi^?3JJLxiU@UG7uP8&G=$VcnsmhD8Claq zy~_lCgQH^rSo{_tk=y`h>uimMQ;hP}((W<%)4Fm(b>OH$Mf6nOt|PZVEVboaxeI^I zVa;t6GAU6HSn)T%y4d{Y-n}h#e}c*tn9?#M;|$PVKk~}m3J7CNp){1F6lC&CTM^r(U}g0SBtx^sV0Rl zdU;mk=_WB(K&Y2fhqLHMK_b(asAhkb!i2$yI%3T+R(!S)X>wVo8~cy=x8{cA%>RTT z1^lMuSBfv7+KM%WW<|A-gQGl~PO1T>l^bLi#2fMT!?H4X!M9ZMU!mZhC|A=3S&{~r z5R`f6#}%!JBLlTF0+>@XFQgVq2L@wgb@5(RkHSeT=Rh_hcr)FE4iSeRfxCaMX-767 zb`=}~=h@T;W{8+|^qu-8_<$ ze3FUF$c2dS+=vjo;>Qw=qq?Rw`tP8?zv6chI2tvBGnieG;+*;*2Ar&yb^8HBj}KUg zcxwaTM;02RrX9h;p&3-PfR=w;z0ZJuAGt63=$$)KKL)thM(RhOd+v_dZ}9=P)=2&p zFDS9jNdICliM)^O$2#B7e42@iF(dP{uObJHOP;Gw>$?ceJNuH!4 zQOj+efsH5ct(>1aou%;Iw@x7WVR`A{_`Nt#| zhigdHhgatrp2^`V;<}SpWB06D6sO@TWBSJGc-km&xcp01%-)t+mXI-LQnC4zd9^VT z$Cwh8&r9_DTA=R23A|&h6{rs#q0;+uo{glVG|LRcjs;UnT&jNtE?@ya4$l@D>D|q# z($Nhpm5t1SObpY5>YeJ=te=L2FOh!9)cV6_={eFT*2?`gD4y5p=H=@`;gY&$~5%sSUWW%bHbW(iOj%QRtyz6awom!m< zpSFDm1amEJUuA#8F&te81f#N3Ksa6*28!X&fLFlCW|rT))^8`;W7mA-z95O`4C0g{ zZBG*MAokbCj=yhwwOvO`limvkJD}JqD#Qx3%z>Z?LF|R)v<$r0xEls8`EBy${DQ;C zLL?>kNPoq^S23p&3OdCMPexakP<$$ee0mKqUm6Son81H*kzBQ&6|KizPf&@4uE5-m zX9dS)AEYiYF$&*Bna(Pa+S4mHDAP#}N9^5sVB?5%&>_%o-busom%-VCeGjN&XRC|* zCK)K8@^M+5VIWUdo*E03_Qn?S8LbC&sQ66@@qZ-4d{!Z26`f4!zUlUgPUx$57G1a& z^JO}TgKU4foC@W(znc?pJM)p^KqtilBYj?DexcMfonxx|-@0)2SFV9?qBCX%kqvEc zae@Ad&+IV}+*xnSz&<-WJ`&rRGL5CVk|7rWx~(l%-{%Y$6qj%{bDF?(xC$&ZYMk`((~W489> z6)BslMBT`L*Ye>~D%hCt!I#)-K-A5v=V^sE@JS-otBXs61xWbC>FjxzEB(-XST34~ z1ua8ZK$@}bi=+h;$??xL4Bsb1sVROwjWjr93{F4^x>msi01>(p)*U9R6)7+III zKUxoiSz^qXDV~)WpEXiBNHkJx*H(EapzJtlz$`#)qHkGa?eG9%>VyeCy9A^InW%+f z8%dgPE%l-1%cnhx?|gm*eZfFS!D}C(ErnpdgGwk+P|Mwv-9&WmkK67Tb-s{%NY<%H zw$k{26716wEIa6SBX+5}q|kSl#o100h5Rigs3nEP4(+I(6Ux$#aRgIl+9R(lOid(y zODk^(Qg++DO{22Ox(1CyX`M2K;s)Eq-nqOE`{=P)iM=WF9Ap>RYfmS>4?FIKcB}DV zb+vOl_T}POMU@!R)azq>G|7Wm*NZjO`3$gsn;c`AUt|atfpmgG4TnR4c~|gj*{QiM z-UzAz4`4Opy){rJjq*JPO?un4bV@jY>#OR133uhIL6?tpf~LW;$ML0W(UyX0gUd!&`4QpVW8L&S2w@hnrMd4aBz5gd5Zb_4X|q zLrg^d3Z!O6mXTd)X*6h2odKo{0|nTT@mbiqhDUDX%LCvolyu^MeVBZM|J&lM@@Mtt zHtg#&vQ7#1*p0*bAEV^2KC*IrKRa}?GLe$oe@awt}VletEyHVj1k=$Kh59)-W25=j5nD`Wbb$9qY z5Vr+9HDkgQSs?&i#pO1_3z41@poe+u&|*06t^?VSvc8BLtbCbL)&(gDW)+GW3W(!^kbh%eyT<6 zHb#WMl3E#+tw?5@9FBOvm`6r`^fZSBNsfU-gfwG*+*9i91lpKpJJadjIf{tg%t>ECzIcUO9Y$_c^FsB1XMI`TG(WC8 zV?tMEPZrNe!IH+P%YJm<(9a^_U!~u+`RjS|w04 z$FQFx^Sa-n$@((X)qrmmr+m*2z!XqhcJ!4im7AyI8X934#12a^tosojgNYx^{hCG_ z{8!pGltv!}UL2Qt3(v@Z_K9CSe~5S^P)P}x>wQU+*$WiBUzQ~L$U1rT#Bix0dr__b zq@8Zg7?@nech9{bZUG|FRi+aX-<^nwELEB_xl6ZGu?Mgr(gr9b47cpGyYvlLwNC!G zH*kXW(~LaQbad!U_!g$ETQCl~R8Lhj@{r`s;e|N;P;%0`=F#YX>s1dqDNzTZyXCHqM@J;TUpU2f4x*zRZtSIIJo<$oA8)D`HM0M#Kqb_?1Qu*kNy zep-v}E?y#rPo^ET$c&YPL z@{{2U-bjzF4zmQg3rF%!;G5`omPtlb9X<9*{>YkCvH!_`_QMabQPSm)zfCq2XlrYx zn`hPuXKzqT=-1X!mq&3*J+cnXkv&rkh))MW5WyARwT4d}4Q^+WYF+2(;>+OOM!x zksS^Fm)$7zL&bG5A`mG#o|8|zqZCNZFriDriW_eKufO5s__p7Dx@pAL zadK9in@*iH6LG_fuzNA}S4pw(nrGNQ>Y``9@gT8(ly@DB*XL|(6zhQ*#-~9(J1WqJ zDok$@{is7ZQT!L7{j+3V2C1>vboL1}Q%tv0qxhSUaK1|W6Tf|>c`(7?KfiL>xaIt! z$63^rlFFJ|_M?rk6O!yYQm`X-R*`;t8_2?>)lgCeammZLv}71$9EZ{@$st%@ zc3!`K-XRge*B?F#M&}(_%&3*+yLR|YvbB&duJAwrP^&U{Nl&AsMn!;S>4PrpBc+WN z?UC`n|JVQQ#6xMzSVwYNweYm|{{0u9uL;?leMavbfjeK&CTG*6R0XbT4My>WT4@1B z!=zE0$^ZBN{OA99&^T$j?0-6Cm!nt|op^?S#)jlT6bIE1{eXLEgoJbi1(9}dqx%&$ z>dtmZ0USyq?5UgGXV#@-$!bAzwQkh9+;V&L=TWkrjJQM!)NZTe7(7CL*uVLWXnlP@ zsPT!q2Cwh;T}b<+8s%g|ys_olz9atiRsW7MuAhWAp(tqW!`{+UIz>`RL>#g4r^?}f z6N$?8`4ueyQYJA-ZZ)76v^af3P-Q6%Cp|NTJ3X5Li{g^iCVC)VnIqbG>?nA{)Rm@5 z7TJ#&7u0OVibd3Pjkpmbf^A?5KyHj4)~A{%D3OjSYO;mYqv^`A%e^AO&w_ORKOjc2BRTdtVHezYnw{vxQj8X8_71?$nzYBy@^j8txg zeyvdN6QSL0pj;5$mW@#`4qDo*y#rnyxB87C>RPMtiAj9bnxeYox%UHKKSOh`|4|Tb||h)b=UjJy`CMj*V6A3jggKd zXr#jAGI~jAqq0TCXKPvUg1>ADV3#`%e)!TgcCn{L>J z445`^(QYQ%cK@HPy8q9H?)`btRJg@$@7q&eM&WxUe41J5=@4b@gm@ZHBZQ zp8pUCvj6?R{-?b;?GC~!ltv#0OYOAHnz3k|e#`E^+S<4{+)6n!@+8zxp)ULs+QQb8 zwj6~Tu@yPabys#W*~(^rZ_6x$cb@|k6_1Q};v(&GA93YCJ{)-JCV%fbS|`V8rcNWo zl~6ABJK843n3zX)Y(?}ifpu_|T|t#*Q2*8F@S{3Ekl?G+d})to8Bz7IF~(E~e#?}E zh}B$DRy}PydD7HvB39djH&8v0|2(z>mQ5b3b}T%L)$ucyc7nct_~J^D2t}37E-AW~ zj!ds}LUgR%+&L_!6Ut=S+1}M%R-;7U7B_$_qd6aOx)?9^O9A{ubjpC`VAO$Yvx>hI zyn=>^?LyN^oFoB3C+m)YsMnzJSCT`V*r}^R9FT+p4t9&u3g;kh+*Aup zxKuJnJ2G~cd$x@qU$Cx4A6-{|vTjqBIswvYdhs1yAViUqUXROSIu-9?K?+Qm3THL# zU=?NYvBjvQubEVzLvgAWoJ*}^=bC_c@nEzHw|MIq71s=Z`(XUAILC;QAcRjAJETS} zo0BrBqkobvCypAbOlacW>-18L9Y`schucw2Et7ml1n}TiJ{+!>|bRUq{k(anl zdrrCcG3x222dn12YG&MLc;0okyl5hk7$NEwlZX;xqEB2aPDmuC#oP3lg1AN_TC8}_ z4%IgcXmgQ&oxVMtPhG{0Z8jwue~yQ`bv9VlxkZACni<8!9B|ZjyCVIP^e{TNLlXVw zH_17WviuZa6e+FQ63PT2)lBk5QFfBw&C_a;dAA7DBbbU;_(@zKOnwJ{LKMm~CQdvR`5wencuOS?r)Q=4 zT+ANBGk&0*e*#QS#y+!`I=jkE`Ir^Mr7#fOz#J@$2Vsf%PN-(b?Kl_AW-v^LF1HIz z)-emlfhk=333LuzC>h@2uf=v@0fBp>eMccFY9Ky}HV7M?W;AO=EhOqY&pK}7yo=fq z2RspfU}UwSS(Cz%%Vr?PDsJKv^6Ud5YQF(g`3S3Ce6-(Nj0It|YQQQs1k}L4-45y$ z9DYPpqxGeG47!m=?4kYKaYtIxT$<*crEEjRoQ1^W+Pvr|@W|TVukk6hnqhS!OPvkp zWrk9LlncB5LP`?gNew_SFgYaQ@Wx#>mJAqw(PI7zc4&G`nWDS=_z(8y$s%HcTxZ#K zGubegb|3o;-XW2J2X?A&0Z zx7BiD_iJwcaVbNb8!;KwUH4nsKe2Ud*gw(rUV7}Tx7I7h=CQ--00WR*H3s6v#{p)4 zNE#*hFAvr%lOQElu!e-C4vYoju;MLL~e$|<6tz5 z^cX0kU~~detev>zGJoP`Fwh7zb#?7QMna4n^0+c~w2~wH(@HDQ7(2gp0Do)vI>`91 z#F~ZBFNpWPyirLZ!zymHob}Ly?%3Cdq&GGloJRav;geM%1b3veb5j?*I0u+fXil^o+ zQYnsgdPSV2t5|ZbHkvRvlYzN| zS!)PTOT`8-PAkqWy{#O76&WiaGFsNC*f9HZ&F3nEsYUK1+JnjZ952I@J=X+DPUrbg zcnPJpvx;jB{U!jb=Zl&FspOzFMLuSSCq+?L!r5-MD@O*+KwaEK*QzLY=e6pJ{eP{h zO&IFdGkboeYIPa9>vu>~9&j(j_1p5YO(5$M&c)!6 zD!9$vFfE`8b={%?9)sPQ3!-eApfya1n|ju7DL^AfmKKNY+`bhq0Z7?`b~jgR;Ss)L zAm}1Ar1YiaK12}2JL@LHqTqFq4x2hAArQT1^_J{+VAPt_vGG^t9>zbTz5k;`dzVSn zS)TL;(&MIF7fq>u#(;-0oB#@52?gezrBl?jj6Xno_7-C7P~a58_Phr05{k~#iz%To zs35YP7-lxDlGFff&h{Xe)WnDAq`)%qJ5&>Qvg$xn)e>Hfx~YMt71<91#AyDCFv*%X z%eu;B;@S+WfoShWIIfTNuEkINhKZQLi10Frt4&^|TLjR5G%>}}rw;XGVGGI^{p5?0 zILq)CnW0pg*8I;Dlv+y6@M??K{Hr8|{aZ;3OU@8NB$N#yZ<2!`5Kra)jWM}V|sxwd@f$HSw(HL z5VJCA`qO8J-4@R_N(x<& zTq3{)8yiZcZnm&ij2AAmQX6EB2FO$H) z|6mM%THd#4E(d!&=g9L>deO)rB&k7KY)G>Wx!Rfc+>I##C)koYz!N)InXp?W>%+UD zAtnBpSYitR0@J8O@J0_;>gAH?Mohe&$beSH<6~zD733SS`Tm{3)~+GG$yZ-u<`)~7 z2q`o}{o28V4bzoOf|39(EdxH|cnnD(Tn^Jgg)pL4T7^HJo{i$)OfWH~=_(9{*` zNPCNX27(WTzDYRKSXyx1eNv~pkYbe^OCDx3a; zNY;a(Z!#GJtIOFqIh#+Ar|$-G4!BBx+iEK<4Ha~QF3{u^bu7rIjgjy2>QfY z1xR9eU00gMgt=32K3Z-y0ZHD%Koa=>33Lzb{}}+N0L;_$l0!0qCJrwXbYD?_psS`j zBIrpm8;hb(UcSKgQ!XaUgDHI74#B9X|d`8fXOSZb{itUBm7~}<ixezKNFoNzl`a#SWm&-n8OwpJpo!i7dY%MN3icOsCzB zLbai#%@dL*I%r19K>2M+-b=}{H-9ll(6x8Dk^$NTx z6I><0nQAeNAO}Jsti90L2NVvOuQj5G1k}W#kIjU6Khk#?qs>uE^0!19;8N_{71n2r zglxTdH2k^9XEJmfCi9S&DD6fc+NlQ|d$?7$Pq)PT$tJeu^sR1x4KnM7j#BgYJPJRr zqiZY!YD45Na@BqzF3j76rh6c%3mP8`&fqSC-uDk|?GqAv*+tLQ*~s^XthhI#6@l{6 zF;>(H`NywL$B2@vB4QJWVQEyeb65_V4IR(UnthDGm~OYAC;N#-P!4=u(;J{7i*L!D zS+OVz2dWiln+Cmq5_gF&`bqA`KK}eF7gxMA!N5D>OY@nX(~8bsM4(t6^p=6~JTGR) z;o;y#_7z5yJUE+bDmsO_!udy9dV#DW+Mbo!fY5isQ>^L9pu6+#-D)c!)HL4?rg^mI z;5;@5Zr$@?C46}wvCD8)w6E>oOric3E4utmiErYu&_u(3%sVC6_&gXE-Ks|+(dVHq z9;{gtp@XA7SUa0;TdT}wR_i?UgjmzWN+LtEA6{jXwvMlv86S_y5D1>{nyml}6yA;e za9f+l_t=^BK_`*3$^Efn9L6`)WwSXJ3PqfgULE+C%r+v_+GJa+m2C zRGn8lZ@)`k?Y!Q3vG;cG^_x)WNV_Gejtw;R`ycmS|8elt+@Bh(^AA-fg>IWj%36}NhKXGIR~ZQE_*>` z42C>$?|iY`16}`GS69uk)b#NQ!jPa16$L_@(3u-nW3{-)Ixk7V1+-~hyIycQ(4lTmy-1D3QT*}#LyVNyj$OA3l~4x zDS9!>@7vz>0%YM$^gJYicmsm~m@`j*GeyJsS#{F2BWo>6ra2PZxj9%j^Q(BUm|(m+ z6jB=1dmGfkCd-WX{*DUQZ4G_7<$F}tBC?h(&PajPHYJ&wD02G06CS@ui^5TuDOMk^5D5gRBPsH-;^Mnf(AqCY9!Ye68>}7g zgSEwEJ4qTmAqXMu_=bV>T8P;SOMPraA4HAx9A~AtJ)MZw6>YGeu6g$jEahAo3@~|*i zHl0jFoMi;#H@~{r+(^IKid7aW^oMn@(gvIromfV(M+a*)=j-** z5;a-=+kH}S^}+x~razdt^nr=Q5K6!~s%L>~^0Y=$eOk#w(nIOR3dEZ69P-|fpfT&o zy1H!>Prd3jEACKL$ogRP&w8tsLnwJjH<%pMfZAD$q@+q+bb57d>2T87NAeoNSO|$S zyT>CYEVt^KRE@ne)Nwz5Wa@%>sBNb)Y=i2krj=;=+GSm)Tv#wMd-j?wW||*}L1m8_ zmqA}-e59@+8y=F#%|e9CQ02Dw{%z;QtLJ-w`2vPd4drL6Kq=I6o$WWf-|fBFX#`R6 zSK;p}`-i(ZP*I334`SDaCdqRxxY@dpM*QGxT zJF@I`cpc^!VYQVw>{eZEbmy=uYlvFZu3?~LIPo_1SL3FlJk<*9(Cslrx62ycI)n7d z*d)nq&$H>2?)_4Gq_wE8L04&Z#qMs!{3sj!b=Vo#^Mq@@TDhN?3PB$f&KQj-=Xt|) zY20$}Lo(X3r7m%Qt#ok)#k;Sy_69Fz0u8H&=6A$WJ#52pSU!n3@vo34BL5kgoObb= zeds#3(jo^tE~#7w3y~qGEE$)aJXbvFrgZ`LQ=5cZnXkBwsv9$e^_r|p0TZH$ zVG~L28XA6E=T|=qXP~v^gTrzyY#sF>a8p?}K@iGB>9w{J1ZJ&u=G@@tl^V72#BnFF zKB_x^2Iwl^liuV(?|QqlTzY4BWE!@1vnR8T>e)M3hFh;Y;nTXSN*w!`2JL2divlz{ z$Y3lY7mfJm$bF;GSvfm9r7lzkr8D{l_LIlzpHTM+ksJ@?T+Bm|0-()JiG|W6N4?=mQUC)s4fhM*%ymvpc zh!Bf%oB0oIxAC^nq?b8Wu&74pQzSa{a{OAy*rsR2Q`O`7+ym*zL$^$n`;V0rz0;xl zCV?v$G|<3B67ou;vsPYk7|zV467DDH@?3ONW9hiE1m^s}i+|A&;78eUyG}95wOXHV;-}T_I7o&xNuAFOB1Jfove+X(qGuJQr!%)Yb9a zzEW?lQhfmrq`_w38Yfyie(>d$9?Jmv)D?r6SCi1oys5=@<`jg72{6)q?0L+lS}nbV=Z zDB!%tlM=YqQq6Atb3jD?LS-|SyvZtD)s!}o%$LrMmO9GkCm)TINY!N|2`^yZi)SzP5-MFuoKlQ$ z4B5O%W;nm0`gz2(cb>iBf#@pg0q*j@I)?FKu~-zRqrrx76aSrL*~l`=lZ*$>lx4>e zGQ44s=0*-Xro4Gj2=PUKCtam>u*OhL^%CSU9eh7nf@Z32;T%{symmjXyeUB2P7ZpJ zU=|>2QGdGegDpmefEFari(;M(k{3YkH5S;Dqyqx+iMrx9Jeh^sy7_673{49-+SkpA zv4{#AyNQU}T;bw$x>9+vV69T&XE-=J_N7pm(WmkTS+d8oE|_zFdqu2pR5t#6*4G+zt-mZgH zb|4YwBfEL`Y$9x0u{b(Om}3Y~SWW0yNte`V4GeR8mCoqW{d@s*Y@VXu$b9g14K;Pg zX`Nx*2-N9>{OjX?H+^pRgnQ_nZ?2RcI5J{Gb>rPwXPVTP>t#iQv_8%rTAykOmh5er zY)9?ctT7p7#bDdlh;HW=cDaRl0rhIc>ntNZ>yt8|$qgQp=6~K=FB>t-Z$t+|5o@sG zj0Uca)J8B0m>HF^edX1}eW13RD&@Gs8$*7_#-lKP`Z$1prnUyWFm8rwds%_?*HPi^ zH@s9j%b5Mof`(^WcX0-W-&Iy)35LyzeiQYNOC zN8Qd^hjOO(;vP7wxO98&|33E~?IxhI_ne}6dV|P?F*q?aj(y7G#=Xts{a|n@XPdZF#wi zUK(|O6S0hsFGwY8??Tx585kSb^P2Nr01krTj7$`$mZ}8`)_hh12Q)4w6brk(T0#eU zc61ZBp?*+yy-%ulaFq=8pZ}>(xS2k|UMX*5`ZfbWiQyS7&DzZ3EV#eMNjJNAx4uuV zv2OGpp+@L6rfgyxsk`>?>DeSN-oIb_%fIJ;r|EGtIm&|Agey+g07w)gmM;qKlixUctr3*FJX#=X3TR$AY>3$)|jsq=?F@?Z5;_Z0Jn z@;Zpg8AaZ^{qk#J%;_#b$XtHX+p=Z$3+&jy?O5(Qep7`^Y|9!)%3IsBerIaa;z0PW zjpE!tx9vZ-t$&;IpeDL49l!B>G)(c_iFjrS&Pidv&Aw@Ns@CPeVhfvmoCAD+q>4lS z_~ny7I_W3Ll_wITQR~wSkZXuhztcKyW8(Xz8_K}%&WKRGTgt|!!T<=>eC@0R+|!*a zI@9c8v;i#z9oZvJG?q_>o9Wb_xk+nVgvEVxd*a3>4L4+nsO^umy+Kn12l?;baijUd z-|dDzTRr62H6okw7-2egMl9BU7;qAis9&w(XtDNh64$FHX4Z;ee2Tzbp=&;E!=BWJ zIH{Sv0E4m}_K}eLbotA|M^GVn0#FA&#yN(;3q&c9UKOs^RkvxWLzb~ZQc1N8U$Wxb z0qYKnQf5)m8RGMRfN0Iu5n38V9vk|pax5s0l3z`ED{Nq*rZ$k0bycf>Wo62Y>ZCZE z;x(D1%4QQxx0)s*08`S%e7*UY#P&5LpZ$ct0s7dpva&$S69N80C$Weq0jv=i4S?T} z@eYb9dU;doofGgp;10%W1-!`GRWRlMI@;d9j-J=i@N(U5Yfh3MW8&1|zDhFC*5)QT zE6Ib6_@?AbIMk|Qnokmc!J196;fGFpc$`;%0oDbyb z*Xem$dgWJ-N82)R+B=pr(j26R0V|wN`eUq;{ypcRMxu^ylar}yBohY5$K!>#jAI&g zFGvsd(B7#7T8J*`VdRFi=!ASxSPzsQHPQ=aMr9p=bg<|Kd+Qza_L~PKjnhp7V@K}w zhQ|A89v%}lIolH~~@xXG2=0v2y8Oj}iyq4e-yvo)B`e|n|kF0^C%ub8* zjDeCYd(jpREWuVi0Ewdsw787AwtjNf+|Ea76FrA5)@c39@#iapaJ#&@&6V3vUL1^D z52w2d>)sSN*Vbo5+@E~6Cszx#szXyKF@QSr$-yk-t>Zv{<-~?pcDXLxP`)+;zk!_>)Q|sQ2t5Udg-#+ej-Rz4Nc64#X zujOs*n^r+RYly+>;X55YV9X}L75ToPYtpIz+=$;wEE0`CQN+6uNPZ-w$&3w}GaISVGM+ViS? zniN}YQtt(G(Yevxw9dc_7{iC+;aniImz&#*Pv}a28NTdHNY~8QRhO|V4p|^?S3tLE z4o{F(D}~p>lJm%{s4muXu~HT8wN3d|o17~cX(^h8%MUKL3?%V#(^`o&3Ghf}so%P} zRB%E$_oVKCtZ#Kx4(GbiY22NEtFsI&xXT5y;Db?!HlgW_Wgr`wQzMp!j4vapavoU` zU=MSD)Jd(90n1t`<1=RLn3giS!<9&+!2yZ^^XY3(q<`?vWb&FML#-n2Dow3W+G;&* zEWZi2v?eAVZ}UN4eW5z9Mkqwvg#|!4^DBK zEH@uj5(_~ZSwBa1Wk@NM3@FDU$;PBrUv1of->T0%6LT03b#+Q2^1RIH)*I^>lVwq_ z%DWQFsj%Fhg?F?$zeqOkqopxfH-rb@ekqQMohMJ~>}pYv4_3SJs#8&Yiu7}z6#Z6^ z7;7X)I~uda!1WX{)pv017|hnUzmfcF?M7Ae86;P4-01b~43~1DT{r1j3#5&rZ0z8F z45vl2T-}4#K^~m2(NMT@SoU_gHUp>dgPJ`VSnu13ZGG#>aTqD!TuFc(Au^CpY4gX5 zHpi}Sofv9`IPq~RxKbjiPka(zlOWy-SqzYeHXV9=L%haXEQf*{Z@k5wvPgK?+7JO& z;L-L}$d5k}Ar=pu=IcU+f2xS-jbcE5L}+V>dtNt`Uo!f62#&u-4D=8jw-gCI)buBg zhpxK(lu^+my6pgR{mJwYb@j07wWnX}0?P(G+HOd@gwfb*i$p`Us}s4m;$`uF+SExQ zCLs_I-VOe42OqcNx;JwG?)g6oCnYJj1N=a3Ncd3s#)$CRk$zFkM@;9io}e1yYxwWJ z&^!c|?ONgEZ6$WAAo7;f)DTLZNoy-dl8>-;-YQ${;*t@pr4u67voqAhdk+NG2t|Q+ z8BW*0VdJKC-|V0{9zJtbU=|yHKRC510d});pB{@@HLzZ}Tvn+Vk<2pOWZ_aEJi|w;4wquYNMeq=9vt^D^sDd{~ zUZZ;{kdY*KGeumPF>aBcU&&u+>MyEXxM*h3J+MkVQeNWc>r_frX8`EudkfUU)BND=CSW{2H&wD5j>vu3n6b`Q_VUcbd-+i?ozCX3Shkc4=5< zq;~7By@&sOzSc+D1oQ*F)0UmEE_XZGg|B`HXD!R<{_uTnR+)-_Mjl^d~|scgg&hEVJ<37yOeoubEe8Re!`NjMe5um87?Ao5`ED;`lF?TmNH@7Ph z6CZC3?0T1tucGUJUmRb}8?9b_D1+F|7x@ND_bJl_IGLweydt`=RV)j3_Um7k(m9~y zwEi4CKm(&%p~@@o8^_{b1wWC-1^PE#n@z>Tb|1(fjS*Wn1!DU=D+;lGi32)hoSB1^ za!ZlBgo?Uu&6m`HXMtcjLNIqyr&dUN=&J~2j$SAEE(~vfyB&m+#lSS4yx84&o4noK zd-M9$o^SB$Slix~TO@Xb@n=LYKS^&$#>>|7k@P(qO1&tw4+TEEkaGmnY(lgR_ff}; z7um%Yv)Nw4VmoLoZ4I%BmQ++wX)kRmZpC-;=5U-5feV6R!J#V}Fp}?gcb@LP-3x-F ztRc_x%O`?=Y55K_K$U5_qB8NDO$<1t%EiS>TM%PU&*7+!GdE{amiILddusY@bZz`W zPTuw@^)0_F&;f8Gp}-(pal@a-!}C)s3Y7G!Qf6Moq>Ya`DsCnBSILEn1RsJmo^|CZ zwVt!RDTVWfHJJAC(MOVM2$+%V$s0Z8!w2E4JF_~2sN6g`f zav6sQUf8ea2wp7ed0pHFF7V5|3Kjlxk{0J}^$EyuOF|V7AXj?QFGOJ~{x>Q)iSi0% z{EyNjI+7hNT&cz0*!$dc+&Ekr&J*!g@`X2lwh!!HHWip3iX#@xc?tk*B#uY6KluMNH@F$maD%DLM`f0||ExKF>tAO+W|auO4yx!(Z6aner6RX-kvpcF;Lv(sLS zzM#a}l+k_4N#H5I?q2&RrR32NhbR>9U|C$9&&~wcQtas?mBvOvFNU)Z+bsW&`}zu6 zQKh=0NFxtCqKN@JLP{1;mll4Bb6J74%eUCBSFQuhSWh z7bUi2M`2(V2~Z0tpg1nsAks%zbcLQO;IGK5?g0DH@%Uu5(QMK_3GJWh2bWKT& zVk5gt&<*LVEPD4UpCuX^rICti%FA54og|2;8q8)OePv0j%;UraIIF%$svaeO<$|}M zoxXJrJyBdfer9ZLr6^AOm%%4U*CM8*Y%9@~wJ|(NCes`OT@RXp%k0_n7cUa&x$oX4 zL00(_=Z*5jr6>M`q>y~(-b_#^8JR-#9yGULspm!M^k&l!L7-JC0swaZ?LRu}>E(UD zWf^rnUNOcdHo5+ngBliCQ>Qk6^BL3bxk}|ES@}u@H_FCn$pGg`2#EE6-1`&U9qWc+#7lp>s<8 znZCPoz^q?V=pj9Pcc*FRX~t%s)-!%D?fUicA3<*TX(P0y`5Yfet(8*F!z4F!q&^+> zU#xgCF9gq=yb%==gh}Rq@8b(g8hrN%voX}4+ScOe`tCJ5FldgnSRAzya?beS?ei!3 zxuB+kFg6r+=o}akqRKd>fJ%{ww zm@K*XyW7(YM`v(Ak)9_oI_eMI;bnC??ilIBw;47difeTu-qs#0Elo1wc~Jt?T1A2* zo5pN9#E=OXaG~WC?p{qskf3Q{QFd!Epg95tIGPPJr!T*BTmTLFf_Ipz20nf^?6NDn zF%&{O_}9&nsh6*RYjD#nGPVdJrl}KH2iiK60Y1$}!}H+`Gc0-b)phm=K_FwCBxQD1 ze|Yz<_$dCnyK>s{bK6)pCs7C|!^y1z_|XCIqX6(@1%Td|KEw)*tm9Y`-*O~K-snSn zc;Y{32?Z1xxsX?9t!akC!NpDImt4D+wRWwKt=PJGDxgJwRZ=6D+6pdjkJ2Q#aUMN# z-x0tD;5K~)37TG~MdXS}8c)e)Hfbk)!Tg9@5|e>Kmb_-@f-rY@)jh##1~1ebT@~WJ zW-k==0?e%I=&OtGf;N=y`An(P$Yu{zin)N$F@U{*A~ng{8j{EHICC z(Y^`_Yl(xTi-os(pM3x!rQKyLqU+?h8JKf}YasHW2Y0VU`^DkWMu@-zXPuweT_1@0 zhnBBO&=Crn+xNTQOEcm^^@;a&Y(HS`t-xf=y&d*jB)gS6`i4M#tNwhY@*AE>&FMbhtyr>Ord$ibm$I?bnz z^lfi4e46*W$(-bKkir{oqU3LrEqoaPSd&M5Du1^yNKj}LqBKWenr@nP`bob`D+Gpd zcmW230E;h=N_Q}cY+RtUBk)qNO{=Y>z2+c*x4W{1WK`jS$yrq<(GdWvUkmdmv-01j zpc`MJWyN+XDg_2w90j=ToxvdKSz1|Qz}v*~G8GRsv9yW`ROhkWxDcQbohPZA$#7Fb zp?^PZz84)rox9foq1J@}aNL7*&*&@HTrewtBi^zBu+1VkKfEH{mKbQdLuuJyNk=`= zsx;h*iC2~MxR{t++(zQ8Vz`0{1DS{E@O7=E;}@pQZ8&YaqwHKPMe*H-eG=h=1JY2N z=cmnsRa-7f##x^xbEQ7g!&VX~4oONa!GAd=KrFTjy$eDSaJB zbO)P?YtR}-9cagIi0UvP$~xpNA_T%V+mN&WWZEFHqZV=SCqM^YFl^4*4xMZ{4SxwY zmtNag9+m`fDQZY3rr81$pTWj(=N4W0DtYqy)sMSx_nr945}JgBmWUt6nYfo#HXc;m zy1ZC`wR?9*Y{1&PJ6-XY=xfc1vCJy1L!}_!N}qo+z2M)ilB)5(Ockp?{8g8+jm_Ym z?(m-9*<$0J6B=m$b+WbP>Gxr|Hh*EITJY!k<~5r=pS+pqwKXF?p~V6_xwnZRv4KG4 z>^_ER!v&)ak;^u#1TkYN>65;+&43u`WH>Em7!O<=h`kJ6V1hQ<3e&1*8QiR!c(b=r68E4WC@OZgHOkadO=4^)Cxb$sB5K{# zUG*|Jc(|d4D3ViggI%|R?>o;i%^8HOPdHb=N%|MlXj(=Ssm^`@iO!#iUMZAiZ#r8s zsniAn)&!#U!aXnT>ynkphC=&^=;rP?4PQFisE z(xAT$V5cp25u4>Mtfs#(cM9FS#+VJ29O`Fe(~yIfV1UeAP3b(Fo#g{*2Sh(?V-$H& zEH?h~xaf>s8Z~j?qnh~EmLCD_&b3ZN#t~^IZ73248c0?mUIiMREPoz{Evo26yh@}_ z1zcNp1Ws1(nZwreI3~!xyGaNl!!$z*;tRY*Voiwdgf2SWK(0!)a)v}Of@SSzXk!4E zo%eZmJ`wj$NWtsfDxR_j3$eX@mtWXan2W|5*>oDXt_+Z<*AJ%V0wLOEZ#rf&wC7_n z)Nnxfpm=i-olU39Nq^01>Hx~X^b|9)a~l zEZ1-(7P;vFVX|sZwV;4PMF3Mk ztiKDi5T)=pg)I-#J+nBa*sFT6esp}rxwUB}XJ?6_g9j&cjaYVRWoN>_Dwcx99HhAA znw5Jeg8OF7P^g}jKlFd*gJJ&e-O9&5pu0K#1$Qr%fn7cPG3!n5e*DvLa`)pmf4ci| zIy<@h@f<^c-~E_f^|R64kD}IOaDxBlg0Y;nA$4u<{O(F;2Et#L&kvj;02(2M93)FK z;}l?)2)D!2IUR4uur;)VPFvkH%92c`*-18q9Akn<>x);5xY2)aN_C{=#>bCIyv~&h zrWCJ&@r6PwF3r#DGt)ds#ZIOJ2Wmm4MSnM8C7aq~uEPLNm~Je8|6> zTSGfOHEL+}?1O*EF!ZIN)~CfFZCP_~B{krqU{aV@ao+D|MG=IQBFnI6fK$hh9^z`f zgYi=gf{S^HuNV3IjKqzw$H68WR%UePD<5>>jEyVvWSW6@&=Bo_ZAGj)S$$JQt-jmT z9)ZvW#2nLnG(w#da5g)~`4q!>QmJDkf1QAxo_HC9iJyOI%l!!yKxZ0D9Knu0iP`x? zN+>{(0`HP;V$ee{PS%N7@C^q4UwEhPUVs`E;C?bMX8Ae&PLI*^3%u0CBU7)}@%&g& z@8*bs>i`&&Jg!{%E zL`B!-4ev=_yl^XUOn?3_|3@0Gq1^)c%ZU5f{(vjNUJNo^gt&xe`$NnrGRdZxk7eA? zI^+D3)wNbh)a+gMhH~v1d^=j~h`J*Qp0sit&`6?Cc$R-B=lNiG@ne~N{%ztazF}25Km`tdXv$xn8Cea1Ap!e z@J4n?=qGOi%?~cVtTatd=3|WPz?d;Z(3({!8QCYqhuUyKXzvtq zf;3cN2Y7N5_!A>rCt}QI8O^XIj1iI`laAOED3FIi%Ceo5d|hm(G&jY)yywQw*wBu|5y2Dl?{tcXQ*6V?&aR@7q4K|#h2tF%&AEb-=!hJ0-K~~cVaC7rUVIwleWo!TxjUf3~6S*;@BCuJp3}j z*;wg=eQ7q^Jov-AJL%!qD@_t+@X2|C9(9rS^8r~}@=@g;s(!^*uDJ#RQW!EnIYEXy zG)ENHeTOv~uFNW^*-@O0yb9sZry0oErws*YvopYw28|q3`Yh9RI-i}iAEi}2*MuL~ zHCs2OhW5pO#35vHG%TviRx+MLy!Q3lGY)m`v5vL%P;6?Utp?=u_xO{ix3ILejvQ+& zder*0IcSQDqMa4}-XseitCd?26Mp;yBLd>%#dz@UU1z28yoKNLo_aJAWiv@tFwt}) zGBuQnettM8)@KX|6w*owtrX9GevmLkX{7~@KK-?Sh;dRvhy8HxF~ zeQN;_RfA69nP9J#6f5IGEL9;58spKoy%_`=InAzKA~DU0;Py9YI!HJPS|4SItx`6kT7IRercz@*gP_F{O9bnDucWi~n>1MWJCwU> zP7#%Ta;fFtuuH+FDx-!4P$z%iDi_^EY`m(48>sc0PCJwV86J12E!YK*$<%*KR_v$J zqV=E;GzYVGB(|?5I~&>C1nkUOE@xhUwcp&bf6g%E~{R z6~0l8Yu8&8Q={8BO|ugweWkS{w`%-m zdpBPD6`df2+IU4S`Vs!y{=JHSEE;kbSYRei*(F51eTV;Vd}O-?fA0#&(U1l`y=?h7 z+K^}Gk{j6}i$L;GQi4nF(c@QjN-UQ|FdZbDYZ1wal` z>5<7UhimxA}={8|@4ykE@u&Adw0r-VqNo z-~nLdQ>6fa-CT53v|()@562Kq_%|U4&@=wVV@vx-XM9PF+>PeFK%BC{yq`51z0*_i zyan&KR^n~Gqu3y$(D>vu*)0l2zr1U)7|-xH10HSuM&c1o|J|LVL;D5h8uF1>7iJNm zcJd7^-p#GUR&(X_ylJ_UlkSQcf5GAA-D~jy;B7kItC3lYpUz0piPl;-b^NRqTeKjA zV&pi6?J)Um^yQZ~^riazPFkPcinF#2=gllQ>sY_KLTz6?S=Jpg}q->RTXbXZKX>@|{Cwtk+0?Z-qU@|>5NHK@WHK%n z{OX<=ZZWim>JoX^(&p}iwrG7HVN+TT%FZ8SeErG|{nTew% zHY;nSxcb0Y=_P?Aqc+3_+7MKwz}N)IG?8v7(h0@?ta56ll*wj&71NW+tO}4*3sP!@ z+F6q$mm5@(sMu8Xn#{<#8UKyC%~Bj7rwqKNn6pu>;m{la_CR{>f7EJ(h^AXoOgp}5 zbULQVcX%e9jiZmsNItfC>Np#CSi2Y=MUHN`kKtJ0BxDBHVM;nTA)INZ^j(_Am^=1GH0JG8IkS;sJGbQ@qChK zxU?lC=y51>jhG;GLUP$LW;Dc8HxO5H_Lp}`DCU!F+6ga$!ev}3Br&I8$4fKJh-y%- z9-K0TnRqwulLT7^0qYDfZLJCchRma&8#|Cz1%JRWcUpIbf9I%Ye%l)lcCRL6K%7n? z{MglmD1?CEW$%5as|+9m()n;KV0t%}g`LSXpXEr#q3v_b#@>L=@c9FOsJ`|^Uq#ZB zF~~`^1(=(%4Z;PP?HkqakG&D|_?MFpju?L;^sCxG|1bZuQ`tnmp*F{P4p>jQaGh`C z`T21+^?Ickh>Ih;V=o?l(`^TV6Y=$`JihfT;UdO~iR<@*W$gj*p@<1WSOD|n>yOFT z7{a_k=#c*Wum3ANt|sC@HqNDSWfQ&gAjmnBLY1$H8w*H>DlVL$MJzglTAS+x-@V$smChO>&ciq<`e)gBPlXAS zJTD#$xB%ev;OwWO6ig^iay0%9oB+5mo{R4d>X99QFRT)aE60g~+!JW4edVC&S`BTA z#Yu-R@{v|ZUIT`qQ95@)GHmZ0G-rQbJA&7lJ(r@*bj9%wq>8UFu9elQm>&}nXpEDu z6CI(GL4I^Sh3tdH@FD|Ir0Hp~P>H3CxI=brJ=9oV_HnW*Zzt?0A+;=E=EUoOTcD6b z^!oW<{u4$7U=7)YElZ`Hj6fGzkO>07e&YJDON>FQ{?zE1(o%`T#`_W=!M_=)frQpv zl;a=l0|65VgDSrRxd3__f(HV;lfI7^f5RQ@syF^%brh&_eLgI}eh6*N+i=Vlsl|HY zGU4&lPH0fIt9y|OTv|3~6^R10bUq+)&yKr#4P*fb+P+|$#qdnk=$c-@S>yHechli4 zdp#a~FumaiQ38AVKmOZ4|3|i^m#Vh>_RmE5RM@3KHW9}MSSj7Y6ya^~fBu)0M#G?J zfUd3zI0{pd9^#}oABp90Z)`mtem4*m{poN*#!b44F0+l=NJ6_V3D`}Xb!~SWvHU70YOgcYrTfy&bO1J zmzXx#u7#d#M=$d!x`?vxE(nXG=$(DuyQ(>xP{pd*1UpBsJyU&~SRvxL#VBl=)SRXn zZSo>RSIqGIRS)s`OIyvsji^E|wj(9q~{%s(lI7qib9QR(B@bYF!4fzsl7OJuQ zbU3oTklCh_1d=oX|C2eA9e>^Q1dsnEzd;>qa{ZOq zu&ab*cp1rg@O#oup5tqn_^( z&qaQoac(ljO~ZcPBIJb(E&Y`V%>9+RO442GTy&&|Ol~x0%XGW2=YK7q|CeW(pzm3) ze};*frm)x`7n5?e;XwN<$OesJD@)FLM((B-s~MY&>|pIyXJh(ZFX?wZ)^9GbVOrYz zkfLLX7SOxXhy3WS4IojD637qE;;`*cmcoR8D~lJH9iF-|IQ-{y`cRz4F>K5i&Od#S zMnIi&O;>F!rXYGb=ecLt`K4gaT65f^ik2sqAiD{||8_>C-vADAQEl@fwo)}S{XVCZ-pw*iKS*Nz-k zkZ3N3MZts<=I_epSh6dYs5W%zf^w%PZtAsevL`qm`;dCLW`COxi1m`t!qRm*g5whx z|H9_-)Bx*UeTUezbm(DtFEXxn)DqWbHrO4{Af~qwJZDq@YoIMT4}NMv*JKnY{s^u{ zEM%UZz;igDiq6YnPax(*ORa=$*P~AI(3loTpDqr0SU#3`M|mR@a9qwA^gOaVw|gbA z@Kq2TN!0e-lYh@aA`(NFNH8n=D`SD!?@OaYZYrziAwC}*Ndy6wMN|Mu%Hrq{LuS!V zEF6;*Xr(6HO0E}8OZI`F-q)z=0Lu6sG1Rt=o}LeZpaEiY$_lH?VL1|f@sdv8fU zNpgk+O@I_4Ho(XS7EUt@;2Svv&qu+Vp&o4vUX-dkflpiS3)CQ-KsX_dDamnuCH9S= zI50#?wu96VaQD!{iEc3t5%i2YR@RS<<|XI`ILwP)n`z7K4Povk2aFU_$NZtrFT)9Y z-_JAmYcW4R2a_R{8-L3Z6-&W7*RQCGuEI^@s99PjakSP5Qd3)j#Ppj{buOO)^FAg8 z*;Mq%kzVm-*CdP1m+q+<&F^!NUbSVdc5#+pwuwL~&8L!F2 z@m$6mE2L{W*j$YBOO4$wRhLMl5l>6~H_e~h$$|R&(4<{o7{RQ@>fr5kJLjiN2<#l2 z12e)Qo5x1{Xn*Mm1do9{1Q#0AN-S-9aS)f=^*Hun5NV^q-tcPIn30+f>qn`x>P<{d ztJb6zA?8&)<0NGUSEfBWx38y9&B<&ybXZ@~a$fLUYBY#_xKby7n;lFz+E@In^N-CK zU}DC5YA*BaI~3zfag@n~U@f>7ql@oaX=ZCq_!qH%N`Hmoebgo#hN$pgp%!A2Hq*z> zqp@RQ#xdSq#I0jgJ@^@^xyq`oM(QYUG#$JcZR7m9%(>)gZ)UX5g<$EyU)xNVxF*}o znu`H}#{*MP@eK34EL6;dS^j+QwKn~bK4AMi;iBqjHax#kM=WH5QjXT^Bq(2&HQ74K zk_}D|eSal7;Atr(#@)4sG7D`Pe84kiJb*YxXzul7IPGI-3{l6XYKvHRbW$`<81;nx zaW(b0SwZQGOJohhXze;gA`RF(9=5kT4{;* zx$d`mlXX?4u=s=0n*G67o7tXIuTKQnudtGU`+rsMRfB#o;7wIbpTbkinC&BX z29|q?cKBKfCeN9SZajYA4gS`o8JX3`8Fwl)I`X-(2=4`2iq|8Ffc18Ts1 zihs6Chk-6JoM%59jv9f^S6Jsw@mTbs3c=(g5tfTmb)4jbh>lV0?(>_$NwwQJ*RS8C zOx1{ZgCeL$iXg*<^_vXbqtSn6pv9Q_TZP zHjPBZuz{2oaGr-esqldNpuo_ECtiC9iGQUjR;++JKX*T_9x3xs@k;}-H1DFAj`?)N zc@9-LL7I2?@I-X{YYc&q-VbSKa9 zVuqeu!LCDJP4AbNmz~nihm(u@;ihZfKI%MJ>#VJ=cJ8kS8$Jv-To-pwcXe?5sQcjf z+lSp%@&D+5?yo;Q=|0NVzUe-^zklBIyPVHKFBo#Ro-@O{)mHMT*-CiPqn6kyQFe4+ z4AXve_nLoPyC=Si6MJO0S$o(@)*m$wrO{D4^-=2hL*xjh|MdH_v*X`?SNzjIY;F=N zDfLg99E-LO?;D$@-mql8t+lVbRH_rz?4{Sh={@5q}r<-=H%a zko$rQuiTe}>+8U2pBth>aXiwF!eMkQZh)#(^HjQ~v7D? z1TWPv5Nst6#Rw1Ka@S@2sqA{STHS6Z>5ex2XCE*NoRk=QFEpw(u-Hy-CR5Vb2W z97@b?bLLWk@NNvQ;pAE2__!W7h5Yp6fY$C;9rVd*-S&MtGS^d6KR zBxw)SvB&T~{WLk`HSR+VjUj1%Ox<7fM(s5tjuYkUx_mu#r~7!C=QEkV`!T|}RSW_9 zAFt3a_Gw+``F^~*)qA|MYJRV69Y0=KGr!lj`j1ysed=nRcXiKH6@PGVAUt>J&)M8$`eY2DZfOlKI1F!4 z!Hq%l#Ze^aP^2s0Ob~jpUP#@pbYHq|yr;`4_<0XPo&E0Z&Ks{cS>M%KEZhwv z5BYsqm||xxTyGZoj&q*Has=X24TiQ0}x0yewLC0|(%6J^7BHge&qZ%K?2Tv2RAyq2(SO2`(c4lWpYgr!&!X2?Tk8WU}Lz&8Op;$t7!pqbbD@awOwKuSXt0NN{M2{n$zHoh+r z%~W*2n}2&GU(b#C;XV_~+du1#5dpxos!h}%Qz9j#(~~9?EpTX`NLPL7vfB{VR3J*D z`G$ua+Q}%V+Yrl0-}ZAFLkyws7_r+Y!&BU=g`688T+VT)j!!S6z`fDvwd;{9`U4JU zXEcISSE#-{9|Ua6HA8FMO%cBej%>Rl5ds*2&HIuyp^7AzuByF)So1vUbd?M1-4>iq;uIDQXuy&Y4q3@%dq7x@c~b{+<_qXTxcs;2b^tk(z(lnGKPWF^~cs^Hq4hnA?eT*#AjNB_UHB|klGw*lO?M5Z;S zE4Ft()UUnIx(35w7w+|63~q%MA*kFuq4ujqlH!-Z6ayE3X4qG7|A2QB9<4SV#sCGC z55FLdX9OF{_q26rlxAT)d^Lus6dSg%UP`QYhk%N?t#^{=(vTj+@rf}YLv~FtjiP;9 zOqY1hQ7+ICuORpC;R&TgN4xAD%WsIljm>CiGfc`%b3U1a!o1G7MU#?YM5=xfmg=!J zL9^gNo)zPN6r%BpjsGCtQ}4x#CWCyhf(h?qhT-W48brNxexg(S6X+)lCr)0RQ&A-T z>*wd^`Is$U3lc9~W+@mJzaLI8ewquCBTp^QyOdb#Z;aa&BNkqjR^UQwE}x~)89Fl9 zMl{_~9(<2S5vo)WX&sk9$4?l;K@|EuiRrp;iCX4 z=+W)m@4+WW86T$m!nd(foVHiNpKif~7`MUZ88b>J6O4v{Dq0I|OE0_t$W=TcbF+pQ zwEehzsy~9MjXpNZj=^8AUqqj;H}BsB81e_uj_uJA`1*zgg1Uw)7Q8t(+}wyUqZmyX z1Wk&6Bs!u*AMxq_2v(-|a=|UV-5WW2yV{3Q$DM)F8h0z!i`=cTo0a$Noe_Bpncc#B zN2|%*tA~w2P2?E5y?0gRaoMGAbfEh>#3=e4VtywsqM0hgPoKcRk*>ohy_|6Ky{I7E zoNSlV>Ln>D>KY97JmgR4YWVb8k>1uC zA|z3(Y!s4d)VV*x_ij>0X;rgpN2&FSg*5j>b@isX&7g)mgIX0T?yb5SlyjXFbaUrB zkZxBm*wbi|qI3qy66Lvm8x- zHUiHY0_X~BNh^=4(Y3-_S*)l}ULN&2NE=je`w+?+&-KdLx!jMgF^h|t2jsH?hw@OV zm*9i#hfSfu34L+oCx}-v+!DpB8MNgC@Anvcv@JOjn@M1ddhbLQn9m^T!J*fk&vEh5 zLsQ{>;yn%>^Tmg9EU`q=@Js=*SUW0Ns1N{wMY_ST>$fm$T^`fp z0_?kyvocu&SeK+Oxp+tHnvRz1%J;XEIxOR)_Ly=i_p6< zeOyd>;(ZMXWj5d4!EW2xl_(p3v}gILK=F5XwtoJ<{^jus)Z0o;poyqOVuh(;!sjE1 zllrwt9v^Sn(FGUX$1BHMCa@z9Mfmu5x)L=Gjg8=RZ}$-3Q`xat z8HjL+m7O(FeJmnFsLif3MDHp*gzUo|f^ZcgAviITw}Y#OgaLJf7dC-W(W7$oHng?u#Y|@ zlO9F|7J$osI5e_oEN5x;NKWhvNuzb2f&ycSRhM2{0`&RG$?!^4#;{v(&r%62vksOB zuS;B%-bFqfB!l^6gfS7YMj?J)r15(UO*rL{g&&RZ=YP-09SdQH?Ed?NpcJTQO z25)38SYa*riyI3rVWnp>@bHW)%sLN){JQ6#Phe{M+SrWhI7!9puoSR#m4@X zm=M;6z4>c5Co}<+~Nk*)0mvAo6Mvi61=1B13H($j)R%ME+Qu#6bC z)uO-zZO9bUeSeCc`(_a8c9?k+8mRHOy^ro&$MCkg)+!OvGtW&}qMNMN!9a?-;nWIS zuZm1&P|;~K^f0Bg)?XbR#!r_oh9do1$&ric{-i+f76%G{`!bMq(ms%R2(pN2YED)J z;_BF*A+y&VKy2^wmE!NKD~z{eoq=u41M~Vsc>;^SHu$A+fUORhZFn%g>Mv^|9;Til zlB1X7;HcYujUHEj=J8)4fFwn<-%gJHtbbuRNr+pIek>Y*&oKa;HP8W~nvM=7x&4cU zZ<7gM!92fzp(=1JSUt(dqYq^;S!W$PJdu5-pLVe+J27b57EO;wdH;Pf2D65w$UyLb z+%@Y z`EZ!Zi=qV;KfqHHx;W1V5Eh*IsLcy}XQHJmOS21U z09dUyrfZd9Ux;WaFdNG zRhI^nq4Pvc% z_|dc?YkG752RYPsad=e4#ntQ&Gw(RPm62C}gLeMDJERMx`*2j=a8Qa39%O>U7&HsF z5gPq%c^iy96znFFc+`0K`j9!VJ3VyM^4+!8Ad*mkOGg3&ZBzauN-uO&;^rF~%U++# zw+;(M3EjM&D7S0|tm>faUP~sl_lEKA5a&px?M=jm(-s$wy6fR_#9?L@%Vr)HlWo&~ zrG!%r%$e$(5_cXp=VFo_q_2K>@#4=P{~Y|k)IT~ftO^3zN{FVkq_0makp!icnr9jW zWnZ+8+^3p{u1+dy&`MqKG<}d#dc!eQaLNC3%C%a7o69VZ*F7R+cv&vu#s^BAr$o&t zc$7i`CADMEBFx~d;}cLL%HB!%<1d3hsAFbh5rVxMe( z1_80n`o@=zViv!DiD?Ut4s=R+T8hIuOW}5E+){$j`gRo|!$KGB4|?MdZRj|yhA3>P zXrzQUH%*j82~YN~mnKntHl}KygrnCx$Z_7@Bpl5!#Hjo!(r%!V63Lnq7`JDRnjFSJUd0A2! zwVvB{qrsWwX)&YX_+X? ztz_MP$M6+EFe^lW9Bh9iFKk1-nRzcrCtZP-3n+BD$_9TgmY$+l1|jK4!Fr>y(l~hc z?(*>KW~19&Ic>I*^xd7iYvRB4w8?6v>RakN#?&8w)@#bwi;3%kslzliWh6>R;kJd##V{bC%p?$(39#O4v4aHSA7*JJn=8{DYKm^zeXyMtOC($ zAX}Xq!bLiJIYSi{_BCo#Zmuu4x_3z7wj?K*&jQIg8-Eeh%hv`$;97NEd56@h`_;;S zS9PmiosS%TU8aV3o9DAVNKIfr60GmL<3Z@FwHYN9RI)+qd%czO!A@MD-DvS()ALxn zx`<*dWiD5$sF;BLiKs0K#^BNxuCaJ`M_My&;lGq_#J)bPbqWHs;zK06TM6{%t!%9q ziqpt&Ct*+Rx(=ePdNT?1%Cjs$8WDA&+`az#>!D@Vrn=+&b+k)6<$|q<`Lq+2xF_}K z@wTX!Tx969B#wr-f!^JrEK-7x69qr)KWjgFcV~MG6KU`xxnLPQ0yAmp93JL>&^T)n z)@_!hCJ1fqM(GTLth+d=t~ps~0wAsg9vtL_{&yF3EX{PqWo%u?rq5Qej=qs4GKOne z7c;}NaP5*i+95El`10CH$}(%Hn%8GuWDd^WK3DS{B}&_+L}|Yik0aG3c$$xY|M!#Q z)6LDajN>6hE#*nB|4lQ0>CLA@AAX!62X3UxQ^hpvr$<9tE0QVt6vNa){L$vpl95 zXOHE)T&<4>te3-%_tJG|S<&032JcUpIb=eWDq$&2A^ zm;7K`38<=CNxvw61f@W~@N_gp-dfk5kBi<(_Wl0L7re^KU?})ou!kvDs74#Q>in@F zH;t?q4aF7>h6SiH+an0@NnNgplb4NwlPcIK;9W1Mj~an~GB}=zRlt=iWQ{+s6!>%H zM0{z}->g32ZMcOL!gy_-%!^rm9&XdeZ>)_zEiw%#g#wX(I`{q-|=TSH?2Q5yURB-oeT4axXl@K88gp9|qgEql3xND*k-FADZV_t%;n8 z25r!Fw@H_O9qLd&=j!)}+HtQ-Faa=q$gmIUvkreU*=G)aJDZH!(zi1EX^_yfwT;7)DEoHhFa9Kw+UF zp&BtcmDGjeGB{FycVpT+V3p=iX#M^w1JpEv+VDT^5m*=1+^6$=oHxUraRZ`ozc_2v=aeUGX0LlT z8MO7WW^@K55`~G~WDNW`_YRQrU3(CouNZxQ)SDF9K%mu#E(kz@?l_+{I_g5Aa*J0x z?_Jfzw(y7WEc4?(${Q)T)2qpP2)m}e!Ej!5L*EGHihML2B(rI6Tu^32R!=ZglTlCH zNW(E6A@m#G;1h*Ri)}b<-K4$t&>DpHj%Emc8sZ7&VsQdl84FQsl7r96bR&pS!go~6lve8g1fw;|1r}i*q-RJRbQhV*&UXAu=efis#yMBU$rUG2X|%|atX z=PVrUO!P6zc1EM!3y91kK8ea(W~msQ=`7C$(=$!CxKPBN2-Rp~*doc9fl7hMkend! zW7{2O7)tJPi5R!4%46~Hxv++p4XQa`wtBX-aNFJ(YhHM%i+P=lva9Zz0MG}2K-UG2 zd{I@-8hsCtMyPm%&MI1K=40KW z6H!pOttn`uy-sX+vqa}@749tslrV4L2E9xh4wBfG%ZMw@CSVIje{_%;_Z0X!N%RfP zk8&9Sj3>-U6(s=#*|2CRr+&wOr|ZoPeKS200}3L&;qW^(;Mho=z2K))-1eygixYiD z^JOd_0So@Tq$~M29}PCF+v(&KhDx5H^+E^-oN>vb_;v?J@ll!P(&oz!0TE zfRVL`i>$BgM<9e?!$0r3Pi{odya2ZC8p=YuYl>U7I<2b3t;W5&%|#V|K}eDqNuXcq z`w_olt);=KB+8VZIXB6$;i^>p29})uvh|oyLL}#fi6Th1HY-3={3*WrWSe1OjAb0N zYH3^>d#`F*?1(wdG$KxgP{{%W>S@OSM_p>=#SPhqnL)wqL~W_%h!F4J>D~8ZkH431 zclyTf;WN!YGC<`5d;vXw`tAsL>Mhm?q`~5bQyhi5IOrj?1<2VeC z70Fl0+QY@cl4Z--fcM}f_Hk>h@TZGMCK06Qua7&>p#;*nF z!J$(ag79%lD&XTkJ@^2X-w-b(fLnVgP}l|;RT%3D*+fxSs8>sRGfLd40@nu8QsQxp zMencU<-_7N zM3GZ%xC0r?Gq3~X?A#3R55H{6HYqBx&nBu|e7w)Ox;&k@v?WF!CxS{L z5ft3v&V96hwMk*|fhQPOykacL(A4ki@n%e~#e`S3$SMWPSbO4&6zA0zQ`$_C-r^dG zV)SE1d6vbav!%0~bj6^i7J1LwlCF?Ai*5zMcGVdI4YmjV7&R}Gki4g%=?oEgq-0IM zX7r)ybATxmoBMlqgDs0~&{i0hL>oU>581}CzV_uPQi{_Gb913rXe3Eh;vw7(m?Yzr zAHV)e_RQu)I9IM;3;Yq#emJ=jll-?ie;>!6|LecXbC{R~>lE{2GOKN@w#;lK)7S>1 zU~5U``Q>sVRK2BJUzIIX@LBN}pFCl%k`_U=lx=Cr&M$d(QuW++FLWCv)C$CvV`9=f zZ{P0xqk>G%sE(-GxulSqOIfA4J*q__ut*@+X}^|%7ivfmpbg3|bffTngH+yGe?<~t zb31wS5X9ZG*oe}7DW6pGKmOZ4|HmaJ1oi(}&E=-+PikW$;wR0e7T|Kzgtg8$@W}Gz z|DF$U6OL>^R!nbkUf2y?lwm|R(M_wx8znce%_yZI%}!{cQmJgJS)K4Ya_MruR!k?( z@5JXAf7rV4y}mdKdKB>?nHo5?L|At884~3wDdFm2fCUZ- z?q%(k7h@9z$nXva@&zw(DzSO4mLvQiaa$df^~D~T8wLLSZT10Gybi&yWe~SnUE4DPo zy4Hax0JqW1Sf5%;4pYCr73U`u8_;g+yY-axZ7Ex$%^V~zsm5`?HW2)x+AjaxEt`Fq znX;$LxT;7$o(`<+4boi>?S282TL#^3ifUzOX7w4>=m(qDK(iVs_F2&D(@`scR?fwH z)U*mBH=)HCd5Q@L0F_S@e;r{nc?xo*nThi33rojfS&9VvB+8Cj z(I_d22L_k?Wi+{#VsKGC#6O3Is8E-N#*jX`@^XDr6f&5L7TmA=fBY~1sq@v!sV&Z5 zIru}b{imJwKdrXE{rXUSwcf$^o3_)VrL)2FDD8}&%!)ZR;jtzHskL zi~YJw$bUoD3QRy-DcOni!aC=?GlpT?GmuJC*QC~#h11`HY`^dJ#vd-hCteH4rzk9ZG`RxP zP3uH~foB_?f6cd^=+TR=g4O~`3J`;&%HnP~@Shjvr!=gF*9N2vV4MB=kPQ|?+8H~8+La*`U-f8lQEK!!Y!Wm*3*e+6%_GB47` zQf>_7zlkx>@O`u-#DV8Uz!+&Z-34Bj^^_M`A)b((*)+A&L_t+2cI57e4NYS-QrjQS z3TTTh5OX`{y{qq0*?}fiP~4y9qY;(G;tjw*!QHe&Yftmb8nePzE7S}wpVs>GHFK*A z9k2H`;F4L? z`M8ZgtY(5lp6zA*xp-WC*w4-dT^3JI(|RV0e~OhtR-%Xlf|kfHtTzaNL^0qB-Id=F z)N0ERRl#1Qw|-d{vP!7As0bNq@-b}oidd93r0oy~siICHeij*pt0;9D)FEHa#Isbq zSKgunVK!~ddZ!Y}o)4^G?o(MqAm})|lzZ9H?Fgq;rHXdgPAPvl|V@162o6Lwttne{PB@Or0hN!2nz`#NI(rXTjQkvLKL zRDS0|X981?@Vx(NT@U-ZPrO51m_atEe@1br_^@DCr`xcCW-}6Ry5U!~+ns+Y8E5&D zv9;B(9=eqTNwJ>f@{Qdapa$$mh^S62cE2trS4T@t&p_2mLN`e1^vWBv+rBf;e-J8zyR;_8FU!@Ze|6FqK=b)S8}oQIgKnBsl`MW5xA$QY6%in$sX zM5|qBL^mml?12LoE0B*avccXYf9rSDWr$1zB-2C?RD$2eMF(S{iRSbO6$AsQvwxV#*uCVfxU-(-eKluD{!s|HC`Yo4YMseAN-+1~ ztVk${gs2JOv(G+E&a!c%-K5yqQo|1^mjN>%Ya{?%use)KlprlG=+u3-z-?NS$byiVSI9Tf?S$$TY)2d`Rk*8{yvF>qdBK zPVzpeD^q#nBFRL|ppfgM>}O%@RD$Cll;L zM;-87m5q3F?Gf37CV0iY!l=?gX|{U>);C)#E>5j!0uPhuOH9Ctf6-#Z$MyT-2bt`t zUl+sd^1J*>{Dd$+>-Q5ZEoRgFeb(0PM3EqKBk+zCj5C`#RSd^Ufk?nJL2*Yiw$Ut~ zY&c<4-re!15n;ypY{?q95Z6aMxfS$j0Pm)sNoweOiKA!|CZn_H!}iL}Yw zvXbw$u|(IQd>}?p0>NKSM)_s;Y&a0_87*EDyVAw@H%TPSf)&`nKN$h=j9i|o+#|7~B2d$J4vqwzom^J=eS$cq~B z%X}MYdje$TD476%3okl|QZm!HAS)5uzcdY-Yz1u7X)1uhj`SG9m+7z`fZ&hx94)eK zhn`x4*i%U~e^>~`{kVHAC$ebC^5J+g7nkj+U|_6}6{co0de~SUe3oByMitin&1Qw^ zQDtZt`_OP1`Pq8>nw0Uw=`0h6dnTSjdnQ}dk;PwhX88|rZ2)dSk-w77ism-pe-=j| zd05}_PQtMGU3Pqy=kEjfZpWzcz`K+U@6>Qy2w_4A{_7AWFn{;o?SA+D>({>xs@1yD zlUW6Jo7PMR+7YO&oZJ&Rya9;Kkwp^3K!S-BMdsr7Y-)}G;D55}MpU^MB=6QjBQ`R4 zJvcdZ3Gzt^)e-$ChECe7C!#tpP-?%WV8N%H?g3?|C8@~@aG{xtzuo(!9v3QbC z1$!`sEV5Z+{hQT6cG^q|fnr%>t@EI{5sA5IImbOf=I`hK{NKY)NN_fLwYWN;r>o}V z{HOmS5aiFio2S`-K-~b78FPy-re3gevuHyz|Ixn?dpyYO=ZT7P_U;bF^n`G%8+H|W zDacOkn}5-H>=6CrH8qLl)$nD)Dj~77t7u}u>!~ugE{0;y1QHc?ud39oFW2oSlt{1^ zvK*wQZWFQGKfNcJ98`CNKR)o&3kMom?R2Lz~6+eT%}n@KYpt-y5`zz_2756XPm!_7m{-2H9>1`@%otBTt0?Q3bY%rL}u z*nf5(R^MzM^O)FX95$f|Sa_6-Z34W92X_pEYmH8ZCS6s>J#N{of7b4c2e{zRhN6ab zzTo2%^UY~XS{xPUMo?n$FxE%+csB031+4^1)gNs*zFqYP73K38T!LNpH+>LCuq*$i zg8nG$O}qLpR*1Jx*Z%2vpNIi7dT@5lpMNckD1Mw@b>+Xhpp7KCYyF~+J%KG<^@k~9 z4b0D$!*un=eev|`(myTvld39W*9{f60tc+?7qw!+SG&;=t_Hp>U@6Q^y~R^&Nn)=o z3Q+3r7$A5ow65G#9Jt34klyUq!xI=)o_*EI!V-!e137r^|DB}&TO{e_MD=r%^nZ#A zMehcxtevKaV=^#l*Ndj$*<={%aw>0;aMg(%s~aeziW;a;i`d8LHPO!}bREDS zt#U;De58?J4O+vRzmJ^sS1O@T)b>H!J+M4jUwFD>Namq3Z>gjmt^!q)Af|Gj^-iUP zS^VYt&_9-vHD(26Yb6~49P0eSGJh;p6y7VM2y@0dw$8R#%Uv2J)e3?akUcU@u0bs( zX^CrOjd;eAX?m_;MmyvSXIk_s8;(zMMoqsbGrHpW_*L)XyWZ3`RKC{MY=7O59iLf^ zX0i~ZNyidx`p#!fPt0JS9l3W~4puIKXeFBJqCHgFYO@D00W{yBvjKnN;V3gqa+w_M zG2%{u<|{r*T2N*m|8LHSmMG@)G2Jh(av93hwWgJX)wQOz%}OB;q2TbdxN)lDed^Rf zE9DK#?2`Pdlgk^0<%y>j)QZ)7GpHI-r)O;Kc#HTH0pAxg0 zAR(>WZ4wVZMG82G1YapMwN*U#S65MaBa?b6zdgMaJ_9Q$2<`+;#ZkLH=9^{cM2BKM zCaH4Ga`B68TSsqw3)q+ilX-p;(|fBd?`LOtU(XdrgISxVO$!~3r3I625x&USl9m`9q)w=U zh)KbE(+Z>aSTjb@JGMR{4TzpnB7^vJ3C#&!Fk8)0tAF)GI z>zQj9w9os%HRBK~-#6@?^Vo$Q!-uX!K+!*#MWX{q}JS~5X??FJ9QQjN86^C*@?Po2tl~%th zy)19)N%$-B9t4wNnDgzq4aR7y8p)-oz9)q(*;DNTQWE_|`;U9`jJjn&Llj-J1Bz1W z$bnthA{dvHZ-1kFs@hcnrvwsNDb|b4Nq@K45M&+ht)qpF=UL$0E&x#n`&qb^zlhWZ ziwL5M7~8lc+>g%OSIN`33{*I}emOva2*)8~*+qF~IC}?h!$J!jOzEmDLLpWWBz5Js z_0s*L=8mALQGd4G5sdS2R2GY9tEvwq+9)O6g}xw?M}NTHs;7*}pw2AsR`!a3F%dc` zc9qiC9J{TWJ%Pnny$!511go>IB?fvp<_~XQblIv@PC}a7eez;JKd=$y zZ`LoUPB&TN^vQlhE6R-?s}_=V^GOS-`jI?jZz~uxsYYYZoc=SQqu|}ni`OS$L?%Wq z-I^LpXn*%sXBGFM1;h=PZEgeezzOw-=}1SFp`5Wu&*sALqqvc=Dkwy_LHO#(LX`SiwF%p3i1Ek1KXO13y~yikS{9SHE*nD2+0{ zS%te+tu-`Z#y%#IbISbKT%NMQSFV+$`9v_z;(z*ql2o~~rCWOSUW@PG_Y2=2uMpS~ z!(QI=wsgI=pMor!A3T?<5`!$UNVGuftIIDCXR)2dQH$}TsA4Td(s(6G_It-oy(G~z zA7N*r#iux!Rj?IY+saO$qh<9u5G&tuD2J_22L>_cQ5`_tolZYQ15p^!4!{Ly-fvm8rE1 z89+f13N*QfJvUwIU;tm}4qbV(NyCU65wO=zHVrr%x{kCB{9!V{r>FSx;F=By>Y+w~qhM2C2reOoz zHSo#?3;cJ{wBFe=$D=Lq&&PUee(X)3AcPGtx^&i0My~MJUC}QcI9NRtFO1p1ZSOtuMb))K z0qgv{My%w=G!6H@!km2R?E{p|L_tl)|8X7+gJCG7|79dIz23csaROW&1(=CeScwK>t_|F+gV1bx z{@k!|L^=a9J&p ztYc8!4Gs z2L*YsN*gCJ1BAOy2!JD_@*#5-sq`^Q)GEO~;Y>Y6srIq6?>O;4FT~q-cRJ0db#$pr zLjWRZc}IFti)8r{&ht#DOEEI+$Qf7`(XLuL2aNiZsQ5-E!3*ACk?3q?}*v zUql(42xcfJO`b%aYgsr>2dHCEQ=?caQl8?ERx*s`Xe08f=xGXW>A5Fi7|UpX;K52g zdQ~Ks`2Xv8q%Lc4G)!x9KcjP%OdVG`|928rpWC zao1?TZ)k+Xv80;_zZ;3-cxum-850~W!lo03y-t+11>NFySbq%TJA<&Iwd?MS-6#9I zPrFHQGc8|c)Ei+?o<-EEflIbDHMIp>YN_~J#~@%+n%*dB$!$tXs`dNgRr?Yi_u1eL z*vr>Y=!b)Ss;FcnsoL+IHpab+7sK)U-BAlY-6*W5ifHac#N8R=@EEdIx7%hxYeixE zSl}MGdw@|S8h`g&QE##22e>x&A=obkpVj?tdtq)>kJzp~M}sTT!j5{Y+gAj+)%9)? z;1(X64Yfp@W|1&26)RTp&8*nw&a|r{;)VcSE}$)PEz1K>ecOTeE5NCWURynN8GFg9 z6pp7`Bb=?maFFt37ibz}@LJmHLS|sj-BHC3OELknet%pX@6-G2!+e5)9_fqt4S_ZB zeh|=4CqdCw@ytqf;E@YF6<&8(u$qFLw!{Io#soC$YG3h zD;sg~7Mp^g9dEpYoQ;+|y)@)aa4HBw7_)*^x1$IqC2Uqy=&EJOZWOe7ndK^>7Yl8W z96S^>{eLHb&*BvC0tfOvCIXofX8($g0oI{{LcCkvO!G#kNh!tTV+e5zN6+^H?gR4?fRc$$)FmuFWM9S()_H+Z#^stCG z;Zd#2A1;1<-&?3uDj$x$p+%1ZgKzTj`x)Jp-F-^;bjmm3!REcO!f;|Z`wbT5sArJ-Lh}k8C>+nePE&8 zdRm*#-=W?sG?W^Nh3PaBh-rT5n>F+^AU+!j3N6~hS$1A@i`f){otP+VV3!ZF33{ND zC zR~EPwe{H*KGVPQMlDoc+8KweSaC+m@6J1>=avH%{xKjF(y7E(KOLp5qBLodAi}|58 zQHC*H$4I{1!@{gTO0QHrOCGbA)r1gEV}DjF9HcL_ry+oq)B`hc1s4Kt?X!GDnP^jr z)gN9nBehVHhI~w@K;qj)c*(fbIfyQi(9itXDf!hyf!Ys1HsOcBjYa@Gjra~f+2pFrFoTE|6dG;NOMjw8y`q56DOvwx6` z@bnuiw(dh2%2Azu$LNQ}Hj*b{D{QIrXRqSoJ#JA6zI5%2jN0w>=B|mvF&nqfo)OBtgY1fI#cBKWj^SQkfF^6LCM*k*o`OO z``8?`K&zKL^vKHFtMYp~7ruPAiGK(4F}fXYrtP)Z#UiVEMrCn!-HseD4#;ni1;1Ha zFQWkj*Lyxb$zAk`nAbO#l3X{Iw3@1ytT$#^=8OUI@o+41KOn5ly`f#b8b*}upw-fI z!MMBx0o_zOWC~L8UYo0?q&Ad1PaD2FpNMDQG_MtgFRKxB0cI(2%5=Bk7=QQi_1Pv* z3T0-A!qeBPvqhMU1K3>1I?UDHWxXrRnQ1&MdAZhmac^LDPhZp+mm+HDt}L0 zSgnDtyRN#y&B(ZFzJ)2W_M{5gS-^#RT@&Lshm=@g`{gcCA zS{Bw|4`~^IC&Otm!?UC=P0=0;;Yi2Uo|DeH8T7bsrj&xVQTJ3zkgA?HC1*Ksh9~9x6eB_vHOmfe z=-Ra7{Mc__hYv`IJ+_S$ARGfE;BeAS6Y_Q?bKF?%Jka(8k$*S`EEyz20GS7iBW8G4tu(8ToXoLh4j}DheR9=Iw`2m%a`Sn%+VSIB z9=?K4F1*iP)PGAb^`BUYB%^U9CY{10KAl*pP-_RA2&AfH;R>p9Sb8A}njtYA+%8XE zzkKuh)$XhPy`(~hU_wwDw_r#aW{MfHR5fbIv`PY?5xFu0M}>#1%9el02l@RP5*f2L z)hm3Hu$_%qKu6*cZY=f-KfXWl?Ot0&=3Pv60+EI~GJgnAr-K^zlowsJu5PR<@FuY* zlX&3GN!e2;#)sCIgUbb)P^e;e-KaSHs6 zLyx3csInFPYm6~kmX(7!B+X<|vEm20R^OsoBv|&diaL}Ah*k1K9S1-%l|rz%kv#() zn6Q?9b4S~MIM7%+r3agG)m&*8RFNXlXQ95XW9Ht$O;SXa^-~h?bq3xOI^)c*Cip8p zDR(XL!0p6<)e8Yh6`v7rppDzrn(gPm6O&%r8h@VH3f;k5GZxv6wTUS2|cd-0&L#TVBy> zn`9KKy@a~q3@bQEr_ZK}Iun{;-PA@-pDky$Qk$h>8-zwm(V#+CzxJ7`>E`vL`whpGSwGb#1K z(56y$)YXuwS2ZY{)v6DIV=YrMLNI5A-JE4%2p8W&+#e}gP3+Y507ZkO71tMc_!#NP-}?H zt{p)bMQ&LDTc^>%=yUkyDW;5TjgF^T@BN1JkYD&4@3#%`$Cp`hK9hRf8-Ko%PSNsE z_XK4{WnIWBVMz<%!JcG`N@ZcSMqq%Q#=qHm`X)LMPZp=fj&a0+vR%s%|!y6Rjm57OFQY4@B!81GC<+a~U#tt| zQk=T{vNOtwW$v6ohagCoom)3dbnf;L&EO@psEXWM9r?y^n{b2J!JYibFM%L4ZU>=w zGc4Kn4Wi6Y?A2PKRLaA_l*MdWVvvfkN_K1v7PorWkLXdp+TLzi?wNi}Aog;YioG^~ zd(ngkSwg;}r0^hJ(9dzQk49E&*E#&L%*;x8ES*Q-41{9I95KLFy4 zwv$WVEdc|QdEO)jN$-3(`p}c3-Z%kylic1cf4>t9^AqRy=Xhw4U>k-l18;Zg*fhJ>2fd zf42?~{O5z%=?w-AuULA7`fnNzi)1VOJ`X#86sy&MTbFtetR4klL61nm_ZET|>WO}) z87TbQVo7Ho5_IJfCB4Z++(LNg&2oIb!GB5}CAmLwNkb!Iql-v(0?RkjF-&b-fE=PX z63u_a$hKd8DG^6D+wK(kdDdu53RU0ke-Iv=V&jS?L`D->cW}5thE5<*I7xcRTfyl+ z&HHN3@H~Y;Si_T{II6(Vi&-gA0?d6lD`b#e`H(&PFcD|6(QeXXRt9PYnFHX3ATM;u zGmR~cDBl+K*2K!(;LQ*?KKsQYmPux=Ku$RYaiQiDEdVs$Ih)m)%!@Ops^Y}Ve_YIK zaKCr_rZ>i@_P9Y;Ps~FRQ{;Nj#)em~siK8PQhdkg52Wz^MD7K%fZvD{NVfv{EhMF~ zw8fkNdRA_J=Hn7>4d<)kaoZg)JVW@dPiYY+kUq` zLZ5i~dpj6ZBxWlZP6&rl(?HbLe}(_qsOD$_sW~}J^xBc1&&YH%FD^lEwf-)DFtdzZ&_?O`6=9AG0CBiY@j!*A34c4p^)~Nq9+xv(@ zwcD5@JK$wamnSYW6^JiWbc#way$G6X#+EMTzS|2vlNfyf1Mp^9{5PT<0uOX%&M*XU z9g*xoRQl<7)EmF|SE_sxe+!%1nTJd=%~ATb{>|zjJ8dRKzc!^{rsQ*d)zUycf<6D<;IOAwXi&5- zhqJSGc7^AScLjCdQq^Zz6O0{psh-mghWGPUvysU|oX`=?D4!$orI@uF;RUP-tKw#!}f0}_JVb~j4 zBpg3JG2fiFq@My7m0H2`MxVdq*|_T#v>;+=SN(x8M7!#b7LUn)+GT&!2XT(N^52$; z*xJ>9u|m8myY|nP%^`>ZGkQ04&7Un56}c<_)dg*&-CgS!ee4Nr>8d|W5o=(6wj3sl zQlNL~pO(sqj#U-K>V^tifdkg{i*&VfK{AKPbJ0oZM#}BY-2!gQT=gvO4`U6L)*NLn zj*{JDhIHko>riQbI3JJCASvc@jK=3=DU4usliky@$Rp;<-DSzG(fQ2?mH&4l|JjIq zIhp<3M84vR(TTT6xj@6pgsH$rIywV*+g>l4f{UY9ZUx=H9ikqg$$a3?O`mU0k?UVR zpPzOc%1ztp1#t7chGNG3nQPTQEM5-BLuENoZcq?T22v+~TP9pDG}5y9D%=OKo16k4 z#9~&S!j$BlzNtgR?!z+oSTKobnJ(Ii%kN2fP2@sbeu0um3)(No$HiphBmMJ9^RUy` z+;}Fgn==n(SZ^}QORk7`rr0WK-+DP7-Ot6PxcFX5TbR8Q%2~ZAnei}%j+arbs5Uht z+BgvoH%eoF3dMuj=ukEa*yo z7-bd4$J$K3;J-J*mX2sA77oW63J8`mm8Z-RoS>V3Yz?w?qo{vXAv?-xML@Fb`A<56 z<)E&@+H3v;MgIv`WthN+GE0xlk_5W7z)B}U%}3COvDvI2#Qm=&@K-&0Y0=Dx#*SRr ze{IzC)+y@ermAI>H56N~IwX;$3Zf1dw-DCjhI#cM_nYRn3(B}IjziEsg--h2Yy5Yi zGs|6noF-T2qcPBpv)OFYU0J!jyzE@w>*UkZmG#xt)fG`ipd%=MzRRyfwKcFJTw4?W zt#h|VREvN+x){^^cYrXZ=^#uM~O;*?1_a1=t;ri-5{11xm-MiObzi$<-eUq%; z|I@knQ;Y~NLebsd^alO4hY#M}SqYAH?|yQB@6k8*SnF#K+Yi4@c$p|l9)A0$^KTv{ z_tw9E^q}`Bc|?^Twc$_tA^twQxBiX(_)TKIwZ#t?v~R!d^&YIpK>J33cJI-s{UEuw z>Hv8E5&UP(ef@#>d(9i-S`j&{&ap%OlNJ>e%M}r zZ?E55ga7no*F@8`ktj*l1-yFN50W)+OR|&W)%EC>2;5lv=0Sfo`Q|}#UyKX?tzsDm zR6q$h!Ash*n!g6$uHMTc!`)w77ufc#wV^+<4PJYYtX|w(f7mPA$n4QK_xXe#1J<** zFA=ZXi{HZ!Zon@HK0CozZbTo5`*OX1>^<^8)eQfTL#USFSTb);ECct-qDnq1fu4qdUhQ(VXZ0BeFsc7^is#!EJbjv+j8i#zdx%jJa3CIx+>e{OL@9N*R&Adu`Fx zR04euawL#Y82@x^5mL_ZV3fLZ>{P3LNvTWL28jSh5psn;lF_0uS#WrXxt;8cZ-+BVm}%VF^1Yx&x)N zBhsdPj$mRUX61eR|JwWZ^(K-e-&ZN)RI;m) zRa%v7{ee|)0bZKgihU>vu{Gy zs>6!enZ>yd*y33nF2ZboWEr|mLpF=Y?5pI^qTvB+tx5c>qMdCGoI^`ZYG^_IT708w zHH5=vRmMxbw2A+^Efv@{EU0SDp7VECBzmf+_n|!YwYYZI*+K=a$Xy*My{QQOJXatW zT^zt}GA_&CJSHZ+x;>lIlj%#aa>ZA=1B}eG%ARP;j8!_Hq|1qaSllwrbLW>Yc-oy` zRom|@EROHa63MLQjO_oP6*Al? zgQA)MH|F64>^ZGzgl)tTBJ)B_?OP|UC2zy>UFI#QO!U!GGFrh!;Os^b;Pz_3KP@@M9nE0n zV7(3gPBp}ToMgIf=CIO9`mEq7>V(p1>ugZt_k?7~^WhB&p zaGJ0XC&Q`e1Ad{+Xe^ULO~9kja)omZGIT4@h6}HM3+xf?1X!|QyFJvj4U?mMGMVwm zF72tejbc0M@?0U?Q0@ykP^_6HM_Q|hx6IqmpX8)S3uQ>64cAEA?wsAPJU2q;6W%nc z!hHM%+SrLzh`aavD`_T{Cn9++P7nBZ#DJg)0jWOF8Zk2PpnuK>3iOL6hcrLyEx?N? z*yNahhp96Q!$F{a4prS{W0X=7f2LKB&Co`?^M$8*)B57YrcBGjta{a~Kk9~XNl+$! z;0%k7T#rkI0lU#|AaS1ANy4DPP2#r3yFmr6DxjntCxp`~pG)^;e592QUNU8!*yd@~ zr1l;@fBxv<-rtkgPu~3a>gAg!NKyY-`__MdIv|Nxh3d3@@EXK=05Jei9lXLEHSAiTcRo^>*Lzcg zzyBnx#%%UN3hZ1wx7w*BdcT$LOa%=5gSX43U}JUqG!%(2UXVcZR@~cQXoFYwHtVT0x$c6g^G>)Pd53o^g0YdGU=|%M zfaQ}Ps4w){HWBue2v)Nt*DpI?P{=M5Wh*L}pmvPl90#>%;MymCcVqgNdC@zb&$A5T zf}s1b9dzo;YKDIS8JLWZzpQ38C`RXh*8-IQ1>nWM(28E1&Mh`pe1WhnY4!nZP8)&A z*mqZLC~ov^+t|}253R-44O#Wek9JNBY#@mc*m|oKutSHWbuFHphZjZdKwwA>eo%>k~lVR5L57&#;-OAx(fW=lBLN1bW@1-|trpw50ccPGtR% ztOL?tr51&g0uE^!vSXExD_0x}Y!U5P7S6t$0;e0Xpbbgl z8aP)~hQ@FPQYvN=_x(A;vcf(5{rAgk+Jfcu<}`(nExo;24ktIMX_B!JELVb^s*D9` zYs8^~Z$lzYT(9P1kpu9c5SMv>Rmf6C9hCHN9>5Rxcs5B!;^aPi`k0L&=ugo|nW$RMDXI*-9KJ3ecn65!m^iM2I;L|?p;s78K)QwrBD z)P5d=f+E};7wWlbV|7T3$k+x$I4f>C_^U$+(zI>` zo>ny)7O4Wfhddr*7RmI0P{HZWTdG;yvP!Nsg1;Kn-GG-;UJxN zbZoKVj9wLlK#ig$TKd?Xr5IXqWQ)^r%Z&k^vG`z=_VN+1-hpk)pw zS~B%v!=cOa25B?Y`muNyl)^s5!-IS9jPA*P`CXIa`z!UVk^9ugkkr%h6k@K%HFg@p zr>D+MI&{Od7>xfMgr@bDm?2Nt#NGVxAk(9FuU(~sPM$u0dHDFr>o<-C=smQa5N8lo z3VP!?Y3Z2ZlX(X~FQ%amQ=wUia&UvEkr>RQ{hHu_2PR?kK;vrYbdgyKTN-pW)*PbK zHxpYeT`_Jo2^rh(crSM&ae%_*NpxOAX>V)}OwYqlaPFSvp0M zbeX3;^yU!vYf%!dG|HA`z-xkSMAREvutw8z8FIsay0k0anDh{$_rH2*>@eJDS$s=3 zow(MKezZ}{>s~<%giP35ri8e&K2QyVv)Fv`FTO8ynO#;V$ZkY^_alF6q*C_SgE2Ft zs^^W&2}vkteNSOzVvw~!pcU)YTt|MfXgon2G(fWViH1VtC`qlO@ZJ+fsXryD!t;U_ z3l?U7OF5*A8c*~kNkbOicPBcaJMek&FV)gx;Or#y0jelmnxC!isuXC<+>8Q1B5@jki7EdUV&+kQx}ssgCnr}C5Y$6ABCRmj|NQ5qd2XY4 zxibhNHY@&43P1u(Zcbi@+6a4eHzM^o0+1a${{rrdyz%~7c)>O}=+BX^-P6{_NeFnr z7=?y6N=R3X90CuB1}(-Y7D4r{-k$chs@<%iooV(Wrh~HbPEgN%QQ)v~u^@mj_`~ym zcS@4od&ZpGy>Sh%Hqjqt6Tvz24c6=K1-6uZwuG+kAFEx3i~{W!?vw}Z%2OqB(neYbZwG5LJZ@c>19$(OZb;Mowfu-^AR9+2bDW!fkVAw5t6k7}`mAzzL za5O_tTM^))lK{UxxeTs)axva%wdD(V%P}H8(x7RCUIX&Pv_uhu78vFxaw00uW8hO4HJ?3 z3$AD`sH;pT;Fn0F7R@&RV8eoi`|ph3a$IFF>&qY5cF z;l&6JrBPvh({WXmt0k)g#{K@sRmXcOCTG9W=-N%#O=O_A1mK2$|7e4)Oum1$p*9VG zftIS|i?RyGIoY;1cP{^_)fGYmFCSFFbi)iXA5NvoQ+8aQ5!)e{ob*PP)F2fkTE&M} zN^*b_HA3oHTG?GRGI9w9{wAomVX;WZ`Rc4afEcREfrKfJP@^jiBYR*SyfETI)Vs?An0ihd7izhGg@vFkx*53A9d2KT&JxYXuX<7*et=&XyO^h2c&rW&l31|gEsVR22@p zA03ZI=!TBo{tk{Z=y6Iw;0k=4pemDm->pyUPA3F^@UXU+1ud{0773)Q9_UoHLBmUsFvg8KO$gqn1z8 zEvD3ejCzlScUN#;Vwa^I8#E~Y( z_^nQt>Qo^(?iEKuyie#8w!G9>n+lN^dx~&>HzHHtN_-GXBujQ#8?b~)y8MJMpWjVy zZ;!U_qI~|{bb9OVhP27`>w7i_^LSCK8RtH>ub<y=Vge7x-Rg{T_NoE zZ?-ySa2|_xxefX=)P4mR}Q!QT(q-!KlF>E>v2+_KE8r>xABm6^(a zGNaL`r7fscHJhxOO;*jODB_L42=&MFtSsB2A>Bk=o1n{L`o7z`1OM&V#J3pnEk=B+ z3Gt2FhWgE$H!ae5)q8aCHRQK$b)3=LWTUsqMz3xtra-Q@!3HB8!GAXOEk=EdQQvAr zeRII5r>Qp<`v+e|ew#J^_U+r8d_ISNmoq?CVRcxE4?>Bs;6y|16JY(L6nQbYR!Rk{fW2`d+dJl8n9~CXVzMGZA+OMH(+adFiP8Z2HiycpE%1p=8WLSzZR;* zVm5zovcI?V-;z7)-&0m*%F0aLGW(_sXC?-8nvZQL5zp@67ZME|P-o;sej2M$50_41 z>zO6#Ipc|Zmw4&H5^Uo9WWNM|<8+}k>T`Uhu&kX>c@Sj)b0z;A~WZ5LL`oW0D2vJIRg6 zZ&?F^Zy=8jhWg;epN$ChR694P@Sol)@M!-OAMF)YmK3C{&K;B>#JRG6)naoGE8Oa| zNom&14K-mx(iQ)izAy3WhBTL`%{PC8%&|Y%zO_AQ*?i@-DWiVtf;wUNHLY6Y^G|x< z#NXzU13&2IG7=)Y)36^|F`dwSfK2@d5c5P)!XIe#{N3$rynXksQ|sS&W|Q)j6Em6} zXL@^rDZ)V#(!AZS<+WFV{yDh3`@Br@t2&QJKOvF8>SgxrKXn#{-Au1 zZ$8``JZ`ZShg|Hy;%Nt!e4;`7fj15Mw>w>4$-Y&|{sA=z?iN;mHff)B=CNAq0~Ma$ z8H;nkF8}xJ3~=MU;yj&7kH>fKjwg2MR|`jHWkcbGQd#t*-=R-pIG zsRi6wy>;1_e$jznkaFV(WtAc=Q+r9i1oL?cWt`L7yLK>k*ID5QL}|p#FN%3O zF1pG4>ksFXR4hu7P`tkm39pM$u_|=Jo{-auSz2}x0#%$62q_{kZ66XZ{q zf%G@v)j*a!WNC$FOAwE*rTb>*!$9SfYm0J!wKi_@w(<(C#Z^(?R-^iEs`_rl>T_3F zMU^)jRe4KQxouY|t?3kSrkJk5K;J{`SfE1)j3NF5mk%aHb!D>Xx@fJsy7ax;`BC(gukQ-b`Yyu3!*Hd#S%W?95f zcQl+FN@`~91A&(}N&I$+xOub~Y%-F6Tw4lqD zAjztH`C*Dn%FoB-T9a8yvMd{=xa9nNOpIm2PJ$~RcuZl#fC4KY2S~6u8sVbTu3?*o zZr9GjWLIvs)F|gPmXnkUUVbuKo{+{MT$0oYk&+TmK3tMEo7K;k>4{+thFybyTrxWF zcZ$*4tSuP^aj!$UwX(&|uN)SGWw^d4R4iJVtq`({rl|V~7Gv6?V3}xrjy}m7Sa6ko zf&OuFjLkv<@&{Rfti2^68*oA|o4esKqY&QxoDR2uj1zILtTI2V#pH0j0lCJ@W_G9U z?T;iLgqD&O`g<4=DcJ7i*?XjaVT+Y=_mEu{g_>bg83v=~zB!w(($CZjGgowo9e79A zfpgAHy)69PCQWQ8C)d$BB&CzyS@`g@ZmCYmPjm|n7vxt|r(7X#py7hn{gmBB?~%LW zu5^*CbKO8}9|d<)YF7@0>-1zkL2pl$Lpye?RFNAhYcG>|d+Hl=4UqwV!5ffMp~I`F z0dqOY#c0IIs4Su4S%Xeh)GqFo$lRiZDMPsE_;{JG&Je*$W2<*Dn)Dc&{A0E(!P9Z_ zaFL6pQR?Zk=@S(~&dNd+(NR;;MtM{PiVAKcuE-TdDMP5J?OtC&LS|GL1p!iTq!*9l zNrY++mhC*r%YRR2`Q&MT_L(Gvb+zwN+;8Y8&F6sfps}Cw@J;k~ee* ziYgz;XGB!~n&0T%CiPs?XkqG)g9#L0s@;)eAo)_ul$#MymF*k7HAhjr}QWdrG z0ckjv$K3-J7c{%QD?fJie>U%kP6YGem5gUx2QkB1He?tD+yhN$sUz;O&{&hSJj^1o zv82ZFCTN;Yv%mUN~mHB8LJSX4n<~v9ifA*D$jhGc0ngtHWKE8lW zxhFRw>u1y5sxZ0kw|X1DiM^{{lM4x4199BMUHsiqZ&?(pmV!lTxncVb#XWPD zJzZu~kq#mHe_D}v&DD#(G8pss=MlvW-}Tk8k!xb-!uEOwkR4`kiOO9Cj=N>nHB<=( z9Mvpu)XSV*gRP|bBKmM67fT}_ry=qoMNZ>tGy`R;0RkQ9MKZ$n_l~l7aALWc696>w z2!%mz>Y`25uPWrU@fJOZDh}Du#ETC-)f_)&={Du)e_^83B4gh)=yp8pwnxFS);w9l44CvoF#)G0!wx83Jv{^<7fYT)7NZfrJWn7%C4ja-uT&)%j zhw(67e=fAjo(#csIk1unqZZOtTjLeV{LkP8KU{zw{Jj$Uvn+y(2zmoQ|65p|;Q|=^ z!Y`p%M!1mH$b02*VTKFQ(1qF-ZJD22NQU9u@Gch^*=Z3Q*lFSCCzP*n2?FY3WyHkm z{Ysp6PsTJCjeI0T(DXoW;J-Ff*`GUNe;3dme+d|O0&wUhPuSCovYRZ^MLsFUq>k<; zy2XJniyaFQjDL>fHk4M)*JdR|~D(Plcdl1qR8> za;1#I_76c{t#o*L0WnNw6}A5(pUsjK zOkrVd@a`v4kXj}fuZ65{VU3YY4?t#ze}butKhoLRe`T7Y5cXUrdYNIJW@pr z<+ZT)?rNekV=p~cn_9Z_%!RNcmf#-fO{z%<*#m9j(t{pqS$y6=(4$J4f9BD?8cedB z7H^WhP-=$E%j2U_whWTtf!Ta&fp}_-8W)Pz=2Pd<&l-`n!>NS{>PTqKDVpGF-c*4J z9|>A2F-7U^rMOR5R{+5#K4oV;xOwxIQu*fvDR`REn91Be9Sr!{j0lDz4sZo6O4c3_ ziZK91I=ihYXhuZJrp`H2f53iwosBagl`Lzv7i1Nyfbx1X25aEP8-T%nLvlu${8`-c zP;c>AzOSeBfy33)n@Bxqy)?IV(e9-(zd`vDR-E7uE(N&4H7E}EIcpjCO2eAvfZ-2Q ztAt1J?eeS%mDTdh?Z%#%*hlDjR!al>Bd$BM9=WQyQ26l3{uvY6pqI zseK`8;+V;*$vrMk=d%lwoXAo>S-cZBB8EBrVpBs5u!R?B;o4%P_C*W~S_XtU0iZ@hYc) z+k;y&r}V3dTL0fq}(o> zCy$$Fb5c$>VD&P{RZiEoQEIj9xXeHe)Qp_SjM|_GEs)*Vc_&p?Wi#5S$meIB)LfOa zGF=zjcKg|Ce|(ro1)FAmkhr(Z;0Z5JXEnPTbN9w3yI%am{2C4i`Eax> zHigM=u~dC&_--@jBe9{hh6gkWkJ8CO_8j8*JuK@OHWX$WAJip`pnMMl0`^kB^Qh;X zr?bSwa^~FHTFj4%VwRWI4`AMe;4giCg!9fO9>SoFL0a#F;pC4 z@RGyKE0dg}s`_|U9D!C<2v28Hr35b&qTS0JRM<*;Ed&ZlApvU}zO_Q}??V04a$YF% zp(*f+Vz2Nkqzuy+m0B(uDNIo|PnEhd_8O_v%zL9wVo!=X&3-i0$?Q##7k5(h%N}cq zdcEU^f36Ao!%;c#;?8ZSO)@@-PK_U`<4abdD3Y4C4-&BZ{=uKj6XTMWVlh=Zq>xz zf7uXOXXw-Cz~ZJ08-sgU9p>Th*4SH44IGbSCt%3g4_Qm1-ytw;K2>ID80<`JoQK2S zX*T+luX?(XoR$Y)!v^omsDq2{_!Fp{BEf3MO5 zi?|g<*A1c@t-`OM8%mVyA)DazMzWw*f1IX23C+J~6FN}DtB3ar8NZLOprXw2I05t_ z5aBuhl+lFe006|9CaV}Qdy+w**JJ&%9%#W3FGjo_s;<(lD>PMAgxEq5><%E;fa!}R za{!oC5cY0WB#1KBO(d!({@3Y-rqjvOxlpr)3YjY~-04UxAt9K0CohHa?x8!3e{<-e zuhXV|vagDTkOb1%xP5Ezr=*tvz)&Z0*g6M*eNe(iOIrW$|NifmwTK$d=WnK`m3z|e z>Hlekwo8L`8|ZC=VQw&(v6C2LAqVLQ`Mlr-B)i_)4oH7aBAVa@?BW<5lu0?wOd z^Bx?o-T3z=ZI@+5cgZKqiY*KJe+WDnrb1{OCK#@IoR(Sagz))UM1<79F0s9#@mxC9 z!i{Nwa&~t+VHPkhR@XOC$*IX-;85-C1h{$RFh_Y%Rf|8uC#%&V4mfk6zBBhse%J-j zXga?1<#(!wEO+Q^b{kD_t68syLxv2+M_!^z4hQ|4f%zhb5T2hqXP^*hfBxbLJ%%u}$%Tgk9Hm(xMoaA(#AIayzav|>co25MXKrNNe^HpdQ z`7j&Af|39qPXZEx76Z1)a4*C~B6R=<;QFqJm?+0cVzg9@x5f7^IPB0F-FewKzR zNnZ?8CKybwI9}~stnK;Oe{M9dLG!S$tw3k+Y9bD~ELMOjv2kZG$qquo=OjPLaoH!~ z#kko>m^FI^HgGbi<&lQZ7sYIqF9M<-b~ju4EGOA$*e00{N0_>e-He`bo5355YF_Fe z=IZKxuxYI$IHD%mxLC@~7CYaFFsj&_(uQ@Z`Z2JDAF~Ss;*^4ef85w%W2 z(5XyUMjpzsF({Xt2U&vBBZ%awgwdvBFatxe_v}Cm%IEsLc-x+f4skk=~T3Y=^?EFwbak>-=?L3j1sZ+opy6HMU*q|G^7_+j$VM8bN#Vs zRNa3}6ENGn7xfnV}Xf5)JGQ94@`Cb3^kr)9SK2doC1$^oE?$Zz;y-apmf zTCI+K7W=s%;K1PIv=z|7xOI|aNTkw3^RcQ{m5r)BtgcqvhruMDh(3Dt_&;pIh?Hni zC;9emf3XnxlJFO(deE|j?HHZc(9{T}*Qy&0X+6SMqzEzkcmZn9#oabS3qE<2)*7tL ztT6+60!D?&HG|^A23bbo6giZM6UJlXicflzPg**phKY)jkOc>rccD1||DrA?z@>Ql z@jM5$&ua>t)B5QzLcAOF27~?mZX$kcY;DlLf44S!;{R>okIhGqdgA}>(T}}t`uFie z`7fq#0-4Rh_CEc%eUtuuNFO&gH|gKI8}eVIyeU4&e{aFR`%kDD`}_NkO`{FNG{f}| z?4IbG^s8jnr zpRLaO>s?!WZ6;WMFt=qpL;qCo;%zZ|(e7{mD&5bQpMHt%>lwvO)9wKD*Sy_^Ptr?v zB91;_{d_*29Z#~d{n3ikv+jQE zbd-OuEPbCM_h|0H@n{W%3)O*wJJ=|6m33LDE{^rYE3_bC49rlVX68mmHLrwV+f5Mt zAygyFZ`H`@AOugAg{mV^H>_wzZ^rPH5~>Ju$|{V7zQKh{+Nb$^Qk?eDwDCnYf5}rg zIlaVos}26W*;3wVBvQbT!hCgF9m)$1*$)&*9EfZPD`!Jdnr^rbqSPblN7ylO~6t;bU z`+x};Y6Jt`Xf)6)zctpJPQ`FDm<}Vkm^3K*U6A`pkd0LfH#x=?O zUS*0-Reb^cjz;wc%31Y?f9Tfro1uPC8%Q%uxPC&wA;h09zC6Xog3<8CgVVnc&Y!Ep z$O7j$5=zWMr&VS1)kRkeZu$^vkVVI8j$H!^Sr+}!5IJ!ou~{-sWH*s0NF2_Ht8Jn@o z*sR8(S5!4z~W()F1v{}8sT|!Nw|~eRRKC-SwTd6Qu6F3MQt0-}tALR&W= zRj&LO7@jIJfx)V*f3;Hl;`rOTdDJ@AI5(@kR5X5fd~j^kfhIMX+;(M*N)<<_@i1*P z6*V-hd8n(es;#acDmAV+%2yCd`6%lZ%lsfmS1W8`kYPA9Y{ubMpruat^2zZSs2Sx^ zQGj3oww~czCokh%I4yFbQXmpuhuYhfYE{($%0TwnT^~BLf2qrqzn|#Rp*|X~T)QkL z#RjIvotA0mD)U9hJ>pSnE&Nah4Os#=lxbx2FrJ@b*5^&N%Ob*b}+V3>zC)$Uv$Ei39-@#uWI`$i`bYP{dnzSSw zBp~Yxzr0Fve^A`KqbZ--j<)HO+QxJ;d2%9l&2tF;C4}vE3jiy}hw#$U>LzWwQ*710 zMa;yu!uM1z$dC7z#nDf%pSQJx%({zknjPo;6d+RP^nNqF z_Y{zCj}H!@r(z;L-aGvM96zoll>7VZ2Fv~Zb-;XofBpM&S*8#Fwgr{W`u+7?!OsNo z^}QRK#_mVc7F;x{Np_SINHcvDb7$pldx7l`g}tjbHaNNh`YS{s%uW#GV!lGKPRL-M zE@@45=qMsjhr$kH11|T7z zV|sXmM;`@-YgU-9*IiMj1O0Td5Ix>I%x4pmzdxRd)0&`dJHhx*?)U^k>%l*A9+g5@ z2JW!NT}SjlixEC-vhXVz_uvU0fo}V)VSFgsf6(f)Kme-oJ}DuWFQ262L$NwRpkKit zd0Zj5^CT@(Zin$9-E$4iu!n5N>_Gt3>n6o)^6%*kqu+>sExs_o0C1?~9XSqB?6B|t)rL46CY!jV~Ge_-sk zy`FhOu2>}(8DBXeUp}^M?4si<$G^52zs+&=w%6qhs+q3fxT=o-l8g3>=H;S8YqNw< z>G047qds%{swD}urUiZ&Su3OzyhqO`?e+;C3@6UlXB6(tios!b952;YrC~XtvI&dh z^00mG#yfJGGIU~rxcS-hiNQcNf6|f=nPqt$Uctz4Esq-E1GQ*P_@C#925nZ1mjOH@ z?KSCTIUyuxwzR!0Vsg@%0ey~VT|45IcR1rkgwIo-HZ|+RPF3!FuJfu6RpvjDTa`7r zGQZW+igIgDc9D4SKj9{7cOv`EyX{}>wqf1S<`SZqN}8(~$$A#g(DxDVe;&-VC6CUY zO<2|r4PKy5xZ27}v)Wn_)w5x>nAfUTF%%W{Kuk&2r~4b2uw>=C!G|4N+d&~l$)r={ zc#R26%>h5b0|l;8_dS);^33+qRF%IP{Va0-+nZM}`xvmNEeQ#Zay(mEj<}ZKEz5ct zE-(YOY`0Fv=xF4$vY2K4e+)u$w_8%1Fk~?up|MG^Ot9$*h5+mAz^%@X|J?(}GI5#f zNs8{mHJS_X*l(J(gW||HSV532&Hv0kZpT zNO_$gU3C?)NO zxZH~rPS)P@Z?Y9xePd)RU{wgzV#f~?2~TLFPqI~-&m0AB3v=j6Bkc+XfNN_#1gup_ zh^s~@rH?JJmHnp2KOT?7xFuxyVR~jAAfUA2ipFbhqSEf#e;VJ4Rm6`uZ%NtSGo_64 z{sc}J8C!^neO4g&A+<^QS9i+_D=Pp9Xq_ioXa4i;f$~-d!*8~58STZ zAu)Je=R^)#cj+j&Zf;}vR+&Yct3`9!mpec9Q>VIseH(0+*IYcC<(IeYnwFdJDqc== z>IT2SJF@$sf97d7-~i*SCwsw=@dkjS!2A>cGrdElh}9MXmHPlw zS%I};{RQppF?<&0E856#AA>R+mPV-yq60yT`+W#rEXwr71-48Nvh~O2avf(x#B^#0 z$l~lycOZj(e32sIjf&)VERGa$zse>%&Qoe29#AJBe;x(0Q5bZp%`X{ih$S2yL);*n zMAuem90@L-O@6A(x84cpt3oOVC|WjXW3;TLDQTbdkNGHsMzTuPeJxOVXy`Ay6L4#b zEmLwb0y9*M|9QM*(G}PJ`4+x+`?TkPkEHei9vOgN507fn0^ty@m+fop^@J2+ATR-v zgnuD@e~yUhB(l(jlRULCMc!2iRlNnz%_Ln6>DXFZGAMYk1IwY34sBy4fw=Ga3Q^NT zF){HiF8+j=KySOiOVEr>0mbXb#4)@jE45Uaw2zL_RdPv|lN3r+1vJ0VD+^mkp$O}2 zC2{G>dgrNrAA*s23-9+DalWTbSFmepX(lR&e*-Gwl&`+yCDJ5(spRf@US7?`EqE!$ zYn2~m7=#mtx2s-0MZNg}%-hO5l~OcTF*r&)$QM|qQS^-#*f(q0;dV&6NO%i7Ll4jC zEq@b}>@QgV--=Zsq-%l`GqlNmhFj58Ji}SeUh0!{p#v1l ze|GW_yk@^C`zj(?_K7=b+O+pU(ki44gND2C^ap}1J|K00QEP?A(ycGdZs_<`sUcB5EsZT=4UF5@Pq=yCKUIT>bL>_h_$Nk znUB&k!?kK(pU)GpnGsWeKXKmq`L=qEe`28GVkO07_zqNAH!M3HFyBHqnWc7lalK%~ za3eft`$qe_f4+Zzqx1cZF5o~|Tj-ic$-84=yZhy0mJ1&LU8`fJN;433vz%m~Urk?I zjyPC&mX@n$^tJ6*Xf-HAMC^#(Mz~#WOROe~duG-ibOQ~u&EfQN0XCx-%hIf!e`k+j zHh2VVv53H^0}dXsl5)z1t3*td=m$piNNKq&<$BR^rBlplFCU-P*~@1{tBNs4f5Gj< z_^D@D0>h)0hobx!Zw0C4!Uk4TwQbap($icB1Ix2F2#Nn#= z-Gu)C$M4T2)wObMXG`aw{{&AkfANKyv;JsJd_C(|JV=FVr*qKOO;o)QhO`u*^}&jh zsptWyc&J|FFM=ylE--1xOUfvCz{@Q2^iwpZtD^k0II8YwoJGsSecKoW){m-fkf7g;MW~5hTJELS< zUlQSu20kU-C`Bmbfp$@%6gJ(WX#0{iCuof;;9d7DJ0L9wIZX0_#cc92JqfZQ=QT$m7eZW%J_U#DYB)o@O8TkbaN(yO zZUoXcO`4WuN}1N`cn9b_JB_v5VV~${(EI+J#zj6!=Td~TY{(x@CJ9wYUKvUp2L+XL zSZMQIY((G)z7$sJG`SPEq){#TVx|w#LovdqU5TcP0|MSfe~4Gr3d{@3ybx@F@+pW% z3U|q4inbg}A8RJ$?bVtLymN~SkZAXD>CXoQXq?Jx)FhuyGsI$?s*4!Rp|~H2Z8JFl zAwUQNLQ+A$7Td1w)+JZ$9XX(lpwIzJAc%G!MVoR@mn zO-nF#ad3{#e}rr_J``dvaL8mVIt{wLV|cei2PX(|4n+>}A^EAe{Iu;`iZ<$y_>KKl z@w_0RNkVteJSTyA9f1A{+f=9~H8b z43}F>XRh*Z_LDbS706T@>ibqdd00g!X;bVa(FlmUgK~Svw38GY^vtF&0icwBi&Nc3 z1--gpza->}w>V3|OE%^2uh0V*7AqP&O?1>kp+?ir?{F8=5G#W~yy!F$4dA_7W@l^( z>eNK6ZKYHDqfCf7nOV*I)S4IQhqqJldSxkfBV(vE?t!&oEQw;bvXpCmXdEFcB ze~ngAunj8x>K$#4E_aCsrmuLa9fq~7)3I~Ao}+v@lV`Ei#UCw-eQBpn< zj0$}wgN`NjTlW%Kdo_EvSv;QZbsXNif6%CgQs0}ml=26gsz?Resy_8`p0zHeU8SG0 z77?if6YanBRK3f5!G$n>9So_>A}x_{F39g;eG&-%CETJ_8{GSI&3!m@2D|g{OI>2u zzLT%R+<)I15&MGb4eLd3qOrT^g)%q1xW?2NF?9p1aI~%w$z*zix&gXD(6V4we@|bh zlrYW@7j#jI$$vd23@Pt82?mYN!f^2bbaW^TAsNJ*huSMpEz9mvYXZHoF;Ks(8?6@oAE&ib zV?Rzy_u*{zMv@aH%eLDD>DnN&e^EQi2o6Z72I@5_?AvL`YSW;y@Xz+sIj6!$!6F!R z4>*+W0U&?4>H!Rch=%ti9vEUM$Dc;UXF4>Bx$TM|?#f+xRkvT}GjlbU*IxV13sxIT zb>$*7b^2jWH9HjyWTTff5Q@o8{~5UqSW>Lj7Iv?PuG)vLMMGWIRmloTf3&h3K+2SY zZHR*+m4hc8S$Z;>RjU(pnRo|Hy$`MY&-axWT*X(g(D*YEegvUe=}SFH-%qff0liY z)F8h2`QL&;b+`bAyYNfk0t=U*AqdqGt-;SNM5AzSkU|3^G%aESG%Z+uT|)VxgiGll zZC*|1Hduh(f&YEuc$Lp^DI5t24u4p~rG1&40%%i?Uc5_|-^KLOg_QEByn#{a@xrgt ztY$Kar0dHDtlfs9eGDH9LIvH1c;WZ+>@yZu2Dv00OCIk>oMayPI7!l1Tn$8mRjs(jD`6PAnmDSh0A04#|R5^q+duGDw~LxxhOe-Rl)K^s%NhJfd-hLl*F zetMQX$Cy3(&Q2kGT)M0UXxyMo{HyE7tUYCw#k=7KWvQkkbJI#r#XWe$Y54&rs;Q~` zy;KyC@!YK;2De$legDT{Hs6!*=rw&sY<3A3-#ZoMG_JbU@v68U)fGTVr6cQ2u`I!s zsaQFDj!g89f0`Mhj6E{XaTW*7j-%6I@sDZ-geHps$@uWPL2?Y4m&Zq=Y#AgYvFZ_t z(x(;(anq=A3=GCurfe9%neUBxi?kqss%x?F$xNedfRtu543L>iN20zoAwr&_{yyXm zY0b7GP^7cLnvG^em@g_TYz6bECSZs8uxCugKdBiJf5_EaEq#_KVKZmNl5VIV-D2EdvH8U zmoQ9qd>1ofV0cbINLWREX~^Xj)v+h5%R)9RTY9s-4_M%dyaejeZ~($Dd5eK}$+Q5PVcB(Cxwf7Rc^LyW_2^h1#V%XmASd{vP5 zf8R(lPp)gujGh130laJp4-bhjvu?o}w+Un`XCH;mERFjnbhMk)PO z;y3<_2SfXPMpFFE#PIur$772|+NzBof2EP3JPGA0zEWj;rK?ax7aN7Eusl~`d9K3p zT!rPi3d{4a84_RXCo1;cz^^aQJ}Vd60n0b#N6y;3|T^RRn=cj3993CV1s0 z_?vJOyb5J;70Ti&l*Mm1l*JXE+c&{;14PuK^<@xl^**V+qkNtl$5im9a-CBVfBPur zk$OBY(`okf?ThC;%MEEvdXkklC`S*d^uZl9w#SI%4fF^r$;i6i?-l(l)eD9xp)hVM z{ODAckh>ebBv%xs3=vN`l=Gj>UyXhiL-4X#k$NCemx?Fa#APKmLAspe|E1DAw?gTC z;<^=z@67iUd}DiLEfmS2+@b6|e{ZtYTNHTgI?*`D>XAe&dYXMk&w+sRBNzqgMv6K4 z!I@!~PgSNGpvx4|{uU*Dx2a<7~fE7bFdJWys<92D=bODgZL)6d;|e>WhXDl^GX z$e>hYuuN#t`d3;#Z*DF=?`X^BJB!b{PC)@3cawY~D>bnsMb+FadI{Y7{dI8T7!{ur z`7d;$N5LN7Uw3R=F+a1$Rz}##<~D0jZ%J(gBW}xF8YmwY4tf$f;FYmq&% zZu+wsq6lCSysxDl4HgL_Iy z(URqq98W=SC^i=Mw!$aNRszt5JqfPX6RWxP{rQQ3tX{WZg|{R^ll6fgeSbx$OL#o{ z{v4zL_s!8kR5?$ z*>+AmUbwI9J6nkC5IPL4?22%wY0i!^VjvBsuE&mcWwl7&6pXPS>kS5UlD`=;qd$>! zwn)T1+8I{s*dCEP3y*JkLWAe3tR=C%;DX0a%yCDu?cs*te_3Kq^GPDzT^KhP9E#YR zNL>jDakz!&mdvs$7DHrt(c+BHc#BURejD42q^u^{xB%70i@H1#TcRTwv-Ip3i33E? zvnK$V0B5>p(iZ7lAOCz(*vnIL)Kj;Z1W6n5w@pH+wHA3vh}a|U1fp)J$R0avPLf2& zvwG5(#pzCRe~>O{xWgkD?$=ZtFZOw31Q#GC4m|va=Fy`JgJvX4_gj)600Cu5J?T+01_HSO z7rlx_DY*y06BBEhq~&22W_W=G{QWs&@-n897=R6b93K#uzemS}5fQaJ-v;&ODE({_ z{v`S=CDr>z%F)s)P*P`@IHUOCx^C_IZSY$h7v7wWN)TK0D19H6;fXoUKvaI9j=%e& znd}=%e){-0n;v8=K2yMbXE z%IOUsH%a8Y;m6JG!9X3UL%b}A-e6V0?TVmtJ0{qJC=6X6pIW#Gj#);W596@S4izdetIX!VneRNPo&1BHD zOp-(CtpON`(R%BR8BcWRJ%!tAZS#08PL-#J2sdc0ozEj4YxhG`an;afnK)sV9HhFc zZ#88MHrx4RYM=+dO66m?E{uh(N5Nc$;;X|7Ds!;M{4fAroB z@k4(A4;6i_K-@#Aa0~L#%-5w-uS;98mL5e6SR(5im*pNLXC>TmC;9Te`m#t5vd2n?w%#?C`q=z8`2<5&*t{(G zCTTa*q9Os}X#Futzq?hcz%i7;<9#w|v@b{x*bO?eqMeKCFnoJuwJ8hAe_(}frHW?; zn6`SzQyNlcONm~BU`Po}Epi=?Hq{$s6Bwhn6t^{0|G+C3s$A3~m%JQs6PTT3y$-0S z{FN8>*z82~9loj#Ifi%D{TQ*q_ZSg>HJ^$O%E`6Xo#apa#!Gv*!JYRC6#WVm{R$NQ zcLIujQFQZ|Mk!!m#UBw)e=u_sWbuD{#hJioa6p9L>PB$T&4PR zp8|DDrQ!YLeEqA!kze6Nb0Fs0cfTfR#C0!?-oQT<^6U**ZbFzJTL`vh4K_e6mk2v9 z1iBzDSX2|#b9jUlOv|MJEUQ6r;9oxIHjD^3X)M7wJ0Gu-X_ksLe{2>QjX5n`xV1JK zVY!6SR@$FH@pWHFrWc|%&B4;OirnMkbUwQ<$%!oGlSP)%h#2O)0=WK{2DrY0U%rB0 z{$s%}%eQV+2-VL*c+`RetjEY1B2%X{m$lJ$5cGL-%bvktYnUdfZ|R55lSUJ&EVkx# zz|qp`t8NrjhkIwke+1l7LZ3bdRt(whg59v}y^vSK-!0v_^(2$5mg!uqIU!K50wWz# zYoT8Uh5|nijLjgqv-n&?X*leiW}{E}s;8S6n9DnhzykU*>OIlR@h4t~*)zlDBM_u~ zD5T&p<%(gCRYWpiB{`xdePrxC9>`#Giokv|4Nz`3@N!~7e}L@_iR7khD}1okiS{MAW$`R- z$?Vdxq(6W8eT0E9ED?S5>hXX0fB0P2Eb6r9-WChM#0-Cdss{$1 zvx?4Zg*6=eb^%(C&?O*3j6Pm~+VgB0YZ!d;D6Io9_E#|}u3}PL#iaNH#H47dgTE*$ ze<XUh!*7Y7e`5EYF1Mb)#Jiiv#d_k3|YRW8u=j6v^$jD>yZ1b5eyb` z6*uDxf8u5^)$Rq*yfJ?Owp+g{MVG|CcHD_?gJb_Iq1gXE@Z$f)VcKJl=004zbjOhY zT!FV=B6$1n5mVHL!(cE=fS6NEilK})nou^@9xIfE#ymRFV69i6rB|S(mjznN10giZ zijfg&ayAQBZ;Tm}9 zU88gwn~@MzGm6hqb~Yp tt%96uwTk$QAG+5;sw}S$g=BKQERL7s4ElS0c>VhN{{z>9%N$l=1^~lp$+7?d diff --git a/dist/rapidoc.js b/dist/rapidoc.js index ac60a694..9550b0ce 100644 --- a/dist/rapidoc.js +++ b/dist/rapidoc.js @@ -3252,10 +3252,10 @@ var prism_csharp = __webpack_require__(651); white-space: nowrap; border: 2px solid var(--primary-color); background-color:transparent; - transition: background-color 0.2s; user-select: none; cursor: pointer; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + transition-duration: 0.75s; } .m-btn.primary { background-color: var(--primary-color); @@ -3281,6 +3281,11 @@ var prism_csharp = __webpack_require__(651); cursor: not-allowed; opacity: 0.4; } +.m-btn:active { + filter: brightness(75%); + transform: scale(0.95); + transition:scale 0s; +} .toolbar-btn { cursor: pointer; padding: 4px; @@ -5157,7 +5162,7 @@ function securitySchemeTemplate() { ${this.resolvedSpec.securitySchemes && this.resolvedSpec.securitySchemes.length > 0 ? ke` - ${this.resolvedSpec.securitySchemes.map(v => ke` + ${this.resolvedSpec.securitySchemes.filter(v => v.scheme && v.type).map(v => ke`