@medplum/react 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/cjs/Container/Container.d.ts +3 -0
  2. package/dist/cjs/Document/Document.d.ts +3 -6
  3. package/dist/cjs/Panel/Panel.d.ts +11 -0
  4. package/dist/cjs/Timeline/Timeline.d.ts +2 -4
  5. package/dist/cjs/index.d.ts +2 -0
  6. package/dist/cjs/index.js +97 -40
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/index.min.js +1 -1
  9. package/dist/cjs/index.min.js.map +1 -1
  10. package/dist/esm/AttachmentDisplay/AttachmentDisplay.js +2 -1
  11. package/dist/esm/AttachmentDisplay/AttachmentDisplay.js.map +1 -1
  12. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.js +3 -0
  13. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.js.map +1 -1
  14. package/dist/esm/Container/Container.d.ts +3 -0
  15. package/dist/esm/Container/Container.js +20 -0
  16. package/dist/esm/Container/Container.js.map +1 -0
  17. package/dist/esm/Document/Document.d.ts +3 -6
  18. package/dist/esm/Document/Document.js +5 -6
  19. package/dist/esm/Document/Document.js.map +1 -1
  20. package/dist/esm/Panel/Panel.d.ts +11 -0
  21. package/dist/esm/Panel/Panel.js +35 -0
  22. package/dist/esm/Panel/Panel.js.map +1 -0
  23. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.js +3 -3
  24. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.js.map +1 -1
  25. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.js +6 -6
  26. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.js.map +1 -1
  27. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.js +4 -3
  28. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.js.map +1 -1
  29. package/dist/esm/ResourceInput/ResourceInput.js +1 -0
  30. package/dist/esm/ResourceInput/ResourceInput.js.map +1 -1
  31. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.js +4 -0
  32. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.js.map +1 -1
  33. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.js +4 -0
  34. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.js.map +1 -1
  35. package/dist/esm/ResourceTimeline/ResourceTimeline.js +3 -2
  36. package/dist/esm/ResourceTimeline/ResourceTimeline.js.map +1 -1
  37. package/dist/esm/SearchControl/SearchControl.js +2 -1
  38. package/dist/esm/SearchControl/SearchControl.js.map +1 -1
  39. package/dist/esm/Timeline/Timeline.d.ts +2 -4
  40. package/dist/esm/Timeline/Timeline.js +14 -10
  41. package/dist/esm/Timeline/Timeline.js.map +1 -1
  42. package/dist/esm/auth/AuthenticationForm.js +2 -2
  43. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  44. package/dist/esm/auth/NewProjectForm.js +5 -4
  45. package/dist/esm/auth/NewProjectForm.js.map +1 -1
  46. package/dist/esm/auth/NewUserForm.js +7 -6
  47. package/dist/esm/auth/NewUserForm.js.map +1 -1
  48. package/dist/esm/index.d.ts +2 -0
  49. package/dist/esm/index.js +2 -0
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/index.min.js +1 -1
  52. package/dist/esm/index.min.js.map +1 -1
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.min.js","sources":["../../src/AddressDisplay/AddressDisplay.tsx","../../src/AddressInput/AddressInput.tsx","../../src/MedplumProvider/MedplumProvider.tsx","../../src/AnnotationInput/AnnotationInput.tsx","../../src/AttachmentDisplay/AttachmentDisplay.tsx","../../src/AttachmentArrayDisplay/AttachmentArrayDisplay.tsx","../../src/utils/dom.ts","../../src/AttachmentButton/AttachmentButton.tsx","../../src/AttachmentArrayInput/AttachmentArrayInput.tsx","../../src/AttachmentInput/AttachmentInput.tsx","../../src/Document/Document.tsx","../../../../node_modules/tslib/tslib.es6.js","../../src/Form/FormUtils.ts","../../src/Form/Form.tsx","../../src/Logo/Logo.tsx","../../src/utils/outcomes.ts","../../src/auth/NewProjectForm.tsx","../../src/utils/script.ts","../../src/GoogleButton/GoogleButton.tsx","../../src/utils/recaptcha.ts","../../src/auth/NewUserForm.tsx","../../src/auth/AuthenticationForm.tsx","../../src/auth/ChooseProfileForm.tsx","../../src/auth/ChooseScopeForm.tsx","../../src/constants.ts","../../src/DescriptionList/DescriptionList.tsx","../../src/CodeableConceptDisplay/CodeableConceptDisplay.tsx","../../src/CodingDisplay/CodingDisplay.tsx","../../src/ContactPointDisplay/ContactPointDisplay.tsx","../../src/ContactDetailDisplay/ContactDetailDisplay.tsx","../../src/HumanNameDisplay/HumanNameDisplay.tsx","../../src/IdentifierDisplay/IdentifierDisplay.tsx","../../src/QuantityDisplay/QuantityDisplay.tsx","../../src/RangeDisplay/RangeDisplay.tsx","../../src/RatioDisplay/RatioDisplay.tsx","../../src/MedplumLink/MedplumLink.tsx","../../src/ReferenceDisplay/ReferenceDisplay.tsx","../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx","../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx","../../src/BackboneElementDisplay/BackboneElementDisplay.tsx","../../src/CheckboxFormSection/CheckboxFormSection.tsx","../../src/FormSection/FormSection.tsx","../../src/useResource/useResource.ts","../../src/ResourceForm/ResourceForm.tsx","../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx","../../src/CodeableConceptInput/CodeableConceptInput.tsx","../../src/CodeInput/CodeInput.tsx","../../src/CodingInput/CodingInput.tsx","../../src/ContactPointInput/ContactPointInput.tsx","../../src/ContactDetailInput/ContactDetailInput.tsx","../../src/DateTimeInput/DateTimeInput.tsx","../../src/ExtensionInput/ExtensionInput.tsx","../../src/HumanNameInput/HumanNameInput.tsx","../../src/IdentifierInput/IdentifierInput.tsx","../../src/PeriodInput/PeriodInput.tsx","../../src/QuantityInput/QuantityInput.tsx","../../src/RangeInput/RangeInput.tsx","../../src/RatioInput/RatioInput.tsx","../../src/ResourceAvatar/ResourceAvatar.tsx","../../src/ResourceInput/ResourceInput.tsx","../../src/ReferenceInput/ReferenceInput.tsx","../../src/ResourceArrayInput/ResourceArrayInput.tsx","../../src/TimingInput/TimingInput.tsx","../../src/ResourcePropertyInput/ResourcePropertyInput.tsx","../../src/BackboneElementInput/BackboneElementInput.tsx","../../src/CalendarInput/CalendarInput.tsx","../../src/ResourceName/ResourceName.tsx","../../src/ResourceBadge/ResourceBadge.tsx","../../src/DiagnosticReportDisplay/DiagnosticReportDisplay.tsx","../../src/ResourceDiffTable/ResourceDiffTable.tsx","../../src/ResourceTable/ResourceTable.tsx","../../src/ErrorBoundary/ErrorBoundary.tsx","../../src/Timeline/Timeline.tsx","../../src/utils/date.ts","../../src/ResourceTimeline/ResourceTimeline.tsx","../../src/FhirPathDisplay/FhirPathDisplay.tsx","../../src/SearchControl/SearchUtils.tsx","../../src/SearchFieldEditor/SearchFieldEditor.tsx","../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx","../../src/SearchFilterValueInput/SearchFilterValueInput.tsx","../../src/SearchFilterEditor/SearchFilterEditor.tsx","../../src/SearchFilterValueDialog/SearchFilterValueDialog.tsx","../../src/SearchPopupMenu/SearchPopupMenu.tsx","../../src/SearchControl/SearchControlField.ts","../../src/SearchControl/SearchControl.tsx","../../src/FhirPathTable/FhirPathTable.tsx","../../src/PatientTimeline/PatientTimeline.tsx","../../src/PlanDefinitionBuilder/PlanDefinitionBuilder.tsx","../../src/utils/questionnaire.ts","../../src/QuestionnaireForm/QuestionnaireForm.tsx","../../src/QuestionnaireBuilder/QuestionnaireBuilder.tsx","../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx","../../src/StatusBadge/StatusBadge.tsx","../../src/utils/diff.ts","../../src/utils/blame.ts","../../src/ResourceBlame/ResourceBlame.tsx","../../src/ResourceDiff/ResourceDiff.tsx","../../src/ResourceHistoryTable/ResourceHistoryTable.tsx","../../src/Scheduler/Scheduler.tsx","../../src/DefaultResourceTimeline/DefaultResourceTimeline.tsx","../../src/EncounterTimeline/EncounterTimeline.tsx","../../src/auth/RegisterForm.tsx","../../src/RequestGroupDisplay/RequestGroupDisplay.tsx","../../src/ServiceRequestTimeline/ServiceRequestTimeline.tsx","../../src/auth/SignInForm.tsx"],"sourcesContent":["import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nfunction getLine(address: Address, index: number): string {\n return address && address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport interface AddressInputProps {\n name: string;\n defaultValue?: Address;\n onChange?: (value: Address) => void;\n}\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'billing'): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: 'postal' | 'physical' | 'both'): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"address-use\"\n defaultValue={value?.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'billing')}\n data={['', 'home', 'work', 'temp', 'old', 'billing']}\n />\n <NativeSelect\n data-testid=\"address-type\"\n defaultValue={value?.type}\n onChange={(e) => setType(e.currentTarget.value as 'postal' | 'physical' | 'both')}\n data={['', 'postal', 'physical', 'both']}\n />\n <TextInput\n placeholder=\"Line 1\"\n defaultValue={getLine(value, 0)}\n onChange={(e) => setLine1(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Line 2\"\n defaultValue={getLine(value, 1)}\n onChange={(e) => setLine2(e.currentTarget.value)}\n />\n <TextInput placeholder=\"City\" defaultValue={value.city} onChange={(e) => setCity(e.currentTarget.value)} />\n <TextInput placeholder=\"State\" defaultValue={value.state} onChange={(e) => setState(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Postal Code\"\n defaultValue={value.postalCode}\n onChange={(e) => setPostalCode(e.currentTarget.value)}\n />\n </Group>\n );\n}\n","import { MedplumClient, ProfileResource } from '@medplum/core';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\nconst reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n children: React.ReactNode;\n}\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: false,\n });\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListeneer('change', eventListener);\n }, [medplum, state]);\n\n const medplumContext = {\n ...state,\n medplum,\n };\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * Returns the MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n","import { TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { useMedplumProfile } from '../MedplumProvider/MedplumProvider';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || {});\n\n const valueRef = useRef<Annotation>();\n valueRef.current = value;\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : {};\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <TextInput\n name={props.name}\n placeholder=\"Annotation text\"\n defaultValue={value.text}\n onChange={(e) => setText(e.currentTarget.value)}\n />\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const value = props.value;\n const { contentType, url, title } = value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={value?.title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && !title?.endsWith('.pdf') && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <a href={value?.url} data-testid=\"attachment-details\" target=\"_blank\" rel=\"noopener noreferrer\">\n {value?.title || 'Download'}\n </a>\n </div>\n </div>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values &&\n props.values.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n","/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n","import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useRef } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentButtonProps {\n onUpload: (attachment: Attachment) => void;\n onUploadStart?: () => void;\n onUploadProgress?: (e: ProgressEvent) => void;\n children(props: { onClick(e: React.MouseEvent): void }): React.ReactNode;\n}\n\nexport function AttachmentButton(props: AttachmentButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onClick(e: React.MouseEvent): void {\n killEvent(e);\n fileInputRef.current?.click();\n }\n\n function onFileChange(e: React.ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n *\n * @param {File} file The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n if (props.onUploadStart) {\n props.onUploadStart();\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType, props.onUploadProgress)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((outcome: OperationOutcome) => {\n alert(outcome?.issue?.[0]?.details?.text);\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n {props.children({ onClick })}\n </>\n );\n}\n","import { ActionIcon } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCloudUpload } from '@tabler/icons';\nimport React, { useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td>\n <AttachmentButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n >\n {(props) => (\n <ActionIcon {...props} title=\"Add\" size=\"sm\" color=\"green\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { Button } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return (\n <AttachmentButton onUpload={setValueWrapper}>{(props) => <Button {...props}>Upload...</Button>}</AttachmentButton>\n );\n}\n","import { Container, Paper } from '@mantine/core';\nimport React from 'react';\n\nexport interface DocumentProps {\n width?: number;\n children?: React.ReactNode;\n}\n\nexport function Document(props: DocumentProps): JSX.Element {\n let style: React.CSSProperties | undefined = undefined;\n if (props.width) {\n style = { maxWidth: props.width };\n }\n\n return (\n <Container>\n <Paper style={style} mx=\"auto\" my=\"lg\" p=\"lg\" shadow=\"xs\" radius=\"sm\" withBorder>\n {props.children}\n </Paper>\n </Container>\n );\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form The HTML form element.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param el The input element.\n * @param result The result builder.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result The result builder.\n * @param el The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n","import React, { CSSProperties } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: React.ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: React.SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n","import React from 'react';\n\nexport interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill || '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill || '#946af9'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill || '#7857c5'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill || '#40bc26'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill || '#33961e'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n","import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getErrorsForInput(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): string | undefined {\n return outcome?.issue\n ?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression))\n ?.map((issue) => issue.details?.text)\n ?.join('\\n');\n}\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression));\n}\n\nfunction isExpressionMatch(expr1: string | undefined, expr2: string | undefined): boolean {\n // Expression can be either \"fieldName\" or \"resourceType.fieldName\"\n if (expr1 === expr2) {\n return true;\n }\n if (!expr1 || !expr2) {\n return false;\n }\n const dot1 = expr1.indexOf('.');\n if (dot1 >= 0 && expr1.substring(dot1 + 1) === expr2) {\n return true;\n }\n const dot2 = expr2.indexOf('.');\n if (dot2 >= 0 && expr2.substring(dot2 + 1) === expr1) {\n return true;\n }\n return false;\n}\n","import { Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum <a href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</a>\n {' and '}\n <a href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</a>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n","/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src The JavaScript file URL.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload || null;\n head.appendChild(script);\n}\n","import { GoogleCredentialResponse } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { createScriptTag } from '../utils/script';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { googleClientId, handleGoogleCredential } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState<boolean>(false);\n const [buttonRendered, setButtonRendered] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n\nexport function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = process.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return process.env.GOOGLE_CLIENT_ID;\n }\n\n return undefined;\n}\n","import { createScriptTag } from './script';\n\n/**\n * Dynamically loads the recaptcha script.\n * We do not want to load the script on page load unless the user needs it.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n */\nexport function initRecaptcha(siteKey: string): void {\n if (typeof grecaptcha === 'undefined') {\n createScriptTag('https://www.google.com/recaptcha/api.js?render=' + siteKey);\n }\n}\n\n/**\n * Starts a request to generate a recapcha token.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n * @returns Promise to a recaptcha token for the current user.\n */\nexport function getRecaptcha(siteKey: string): Promise<string> {\n return new Promise((resolve, reject) => {\n grecaptcha.ready(async () => {\n try {\n resolve(await grecaptcha.execute(siteKey, { action: 'submit' }));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n","import { Alert, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, Text, TextInput } from '@mantine/core';\nimport { GoogleCredentialResponse, LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\nimport { getRecaptcha, initRecaptcha } from '../utils/recaptcha';\n\nexport interface NewUserFormProps {\n readonly projectId: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey: string;\n readonly children?: React.ReactNode;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewUserForm(props: NewUserFormProps): JSX.Element {\n const googleClientId = getGoogleClientId(props.googleClientId);\n const recaptchaSiteKey = props.recaptchaSiteKey;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n useEffect(() => initRecaptcha(recaptchaSiteKey), [recaptchaSiteKey]);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n const recaptchaToken = await getRecaptcha(recaptchaSiteKey);\n props.handleAuthResponse(\n await medplum.startNewUser({\n projectId: props.projectId,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n recaptchaSiteKey,\n recaptchaToken,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>{props.children}</Center>\n {issues && (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </Alert>\n )}\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={async (response: GoogleCredentialResponse) => {\n try {\n await medplum.startPkce();\n props.handleAuthResponse(\n await medplum.startGoogleLogin({\n googleClientId: response.clientId,\n googleCredential: response.credential,\n createUser: true,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"First name\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <TextInput\n name=\"lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Last name\"\n required={true}\n error={getErrorsForInput(outcome, 'lastName')}\n />\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum <a href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</a>\n {' and '}\n <a href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</a>.\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n This site is protected by reCAPTCHA and the Google{' '}\n <a href=\"https://policies.google.com/privacy\">Privacy&nbsp;Policy</a>\n {' and '}\n <a href=\"https://policies.google.com/terms\">Terms&nbsp;of&nbsp;Service</a> apply.\n </Text>\n </Stack>\n <Group position=\"apart\" mt=\"xl\" noWrap>\n <Checkbox name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Create account</Button>\n </Group>\n </Form>\n );\n}\n","import {\n Alert,\n Anchor,\n Button,\n Center,\n Checkbox,\n Divider,\n Group,\n PasswordInput,\n Stack,\n TextInput,\n} from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly generatePkce?: boolean;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const { generatePkce, onForgotPassword, onRegister, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = getGoogleClientId(props.googleClientId);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n async function startPkce(): Promise<void> {\n if (generatePkce) {\n await medplum.startPkce();\n }\n }\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n startPkce()\n .then(() =>\n medplum.startLogin({\n ...baseLoginRequest,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n )\n .then(handleAuthResponse)\n .catch(setOutcome);\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n {issues && (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </Alert>\n )}\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={(response: GoogleCredentialResponse) => {\n startPkce()\n .then(() =>\n medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest)\n )\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n type=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" noWrap>\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n","import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: any) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose profile</Title>\n </Center>\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n","import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: any) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope || 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n","export const DEFAULT_IGNORED_PROPERTIES = [\n 'meta',\n 'implicitRules',\n 'language',\n 'text',\n 'contained',\n 'extension',\n 'modifierExtension',\n];\n","import { createStyles } from '@mantine/core';\nimport React from 'react';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n display: 'grid',\n gridTemplateColumns: '30% 70%',\n margin: 0,\n\n '& > dt, & > dd': {\n padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n margin: 0,\n },\n },\n\n compact: {\n gridTemplateColumns: '20% 80%',\n\n '& > dt, & > dd': {\n padding: `0 ${theme.spacing.xs}px ${theme.spacing.xs}px 0`,\n border: 0,\n },\n },\n}));\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n const { children, compact } = props;\n const { classes, cx } = useStyles();\n return <dl className={cx(classes.root, { [classes.compact]: compact })}>{children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: React.ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n","import { formatCodeableConcept } from '@medplum/core';\nimport { CodeableConcept } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element {\n return <>{formatCodeableConcept(props.value)}</>;\n}\n","import { formatCoding } from '@medplum/core';\nimport { Coding } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{formatCoding(props.value)}</>;\n}\n","import { ContactPoint } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n","import { ContactDetail } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom, index) => (\n <ContactPointDisplay key={'telecom-' + index} value={telecom} />\n ))}\n </>\n );\n}\n","import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n","import { Identifier } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n","import { formatQuantity } from '@medplum/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantity(props.value)}</>;\n}\n","import { formatRange } from '@medplum/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRange(props.value)}</>;\n}\n","import { Ratio } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n &nbsp;/&nbsp;\n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n","import { Anchor, TextProps } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedplumLinkProps extends TextProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useNavigate();\n const { to, suffix, label, onClick, children, ...rest } = props;\n\n let href = getHref(to);\n if (suffix) {\n href += '/' + suffix;\n }\n\n return (\n <Anchor\n href={href}\n aria-label={label}\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n if (onClick) {\n onClick();\n } else if (to) {\n navigate(href);\n }\n }}\n {...rest}\n >\n {children}\n </Anchor>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if ('resourceType' in to) {\n return getResourceHref(to);\n } else if ('reference' in to) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n","import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n","import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n","import {\n buildTypeName,\n formatDateTime,\n formatPeriod,\n formatTiming,\n getTypedPropertyValue,\n PropertyType,\n TypedValue,\n} from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\n\nexport interface ResourcePropertyDisplayProps {\n property?: ElementDefinition;\n propertyType: PropertyType;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n if (property?.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.string:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n default:\n if (!property?.path) {\n throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: buildTypeName(property?.path?.split('.') as string[]), value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context The base context (usually a FHIR resource).\n * @param property The property definition.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, PropertyType] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined' as PropertyType];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type as PropertyType];\n }\n\n return [typedResult.value, typedResult.type as PropertyType];\n}\n","import { getPropertyDisplayName, globalSchema, TypedValue } from '@medplum/core';\nimport React from 'react';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n if (\n typeof value === 'object' &&\n 'name' in value &&\n Object.keys(value).length === 1 &&\n typeof value.name === 'string'\n ) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPropertyDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n","import { Group, Input } from '@mantine/core';\nimport React from 'react';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n return (\n <Group noWrap>\n <div>{props.children}</div>\n <div>\n <Input.Wrapper id={props.htmlFor} label={props.title} description={props.description}>\n {(() => null)()}\n </Input.Wrapper>\n </div>\n </Group>\n );\n}\n","import { Input } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n return (\n <Input.Wrapper\n id={props.htmlFor}\n label={props.title}\n description={props.description}\n error={getErrorsForInput(props.outcome, props.htmlFor)}\n >\n {props.children}\n </Input.Wrapper>\n );\n}\n","import { MedplumClient } from '@medplum/core';\nimport { Device, Reference, Resource } from '@medplum/fhirtypes';\nimport { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nconst system: Device = {\n resourceType: 'Device',\n id: 'system',\n deviceName: [\n {\n name: 'System',\n },\n ],\n};\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value The resource or reference to resource.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(value: Reference<T> | T | undefined): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n useEffect(() => {\n let subscribed = true;\n\n if (!resource && value && 'reference' in value && value.reference) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResource(r);\n }\n })\n .catch(() => setResource(undefined));\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to system, returns the system resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum The medplum client.\n * @param value The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | T | undefined\n): T | undefined {\n if (!value) {\n return undefined;\n }\n\n if ('resourceType' in value) {\n return value;\n }\n\n if ('reference' in value) {\n if (value.reference === 'system') {\n return system as T;\n }\n\n return medplum.getCachedReference(value);\n }\n\n return undefined;\n}\n","import { Button, Group, Stack, TextInput } from '@mantine/core';\nimport { capitalize, IndexedStructureDefinition } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceFormProps {\n defaultValue: Resource | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Resource | undefined>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(JSON.parse(JSON.stringify(defaultValue)));\n medplum.requestSchema(defaultValue.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, defaultValue]);\n\n if (!schema || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: React.FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <Stack mb=\"xl\">\n <FormSection title=\"Resource Type\" htmlFor=\"resourceType\" outcome={props.outcome}>\n <TextInput name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\" htmlFor=\"id\" outcome={props.outcome}>\n <TextInput name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n </Stack>\n <BackboneElementInput\n typeName={value.resourceType}\n defaultValue={value}\n outcome={props.outcome}\n onChange={setValue}\n />\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">OK</Button>\n {props.onDelete && (\n <Button\n variant=\"outline\"\n color=\"red\"\n type=\"button\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </Group>\n </form>\n );\n}\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: ElementDefinition,\n value: any\n): any {\n const types = elementDefinition.type as ElementDefinitionType[];\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n","import { MultiSelect } from '@mantine/core';\nimport { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ValueSetAutocompleteProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: ValueSetExpansionContains;\n onChange?: (value: ValueSetExpansionContains | undefined) => void;\n}\n\ninterface ValueSetAutocompleteItem {\n value: string;\n label: string;\n element: ValueSetExpansionContains;\n}\n\nfunction valueSetElementToAutocompleteItem(element: ValueSetExpansionContains): ValueSetAutocompleteItem {\n return {\n value: element.code as string,\n label: getDisplay(element),\n element,\n };\n}\n\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { property, defaultValue } = props;\n const [textValues, setTextValues] = useState<string[]>(defaultValue?.code ? [defaultValue.code as string] : []);\n\n const [data, setData] = useState<ValueSetAutocompleteItem[]>(\n defaultValue?.code ? [valueSetElementToAutocompleteItem(defaultValue)] : []\n );\n\n const dataRef = useRef<ValueSetAutocompleteItem[]>();\n dataRef.current = data;\n\n const loadValues = useCallback(\n async (input: string): Promise<void> => {\n const system = property.binding?.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input);\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData = [...(dataRef.current as ValueSetAutocompleteItem[])];\n\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.value === valueSetElement.code)) {\n newData.push(valueSetElementToAutocompleteItem(valueSetElement));\n }\n }\n\n setData(newData);\n },\n [medplum, property, dataRef]\n );\n\n function handleChange(values: string[]): void {\n setTextValues(values);\n\n const textValue = values[0];\n let currentItem = undefined;\n if (textValue) {\n currentItem = (dataRef.current as ValueSetAutocompleteItem[]).find((item) => item.value === values[0]);\n if (!currentItem) {\n const newElement = { code: textValue, display: textValue };\n currentItem = valueSetElementToAutocompleteItem(newElement);\n setData([...(dataRef.current as ValueSetAutocompleteItem[]), currentItem]);\n }\n }\n\n if (props.onChange) {\n props.onChange(currentItem?.element);\n }\n }\n\n useEffect(() => {\n loadValues('').catch(console.log);\n }, [loadValues]);\n\n return (\n <MultiSelect\n data={data}\n placeholder={props.placeholder}\n searchable\n creatable\n clearable\n value={textValues}\n filter={(value: string, selected: boolean, item: ValueSetAutocompleteItem) =>\n !!(\n textValues.length === 0 &&\n !selected &&\n (item.element.display?.toLowerCase().includes(value.toLowerCase().trim()) ||\n item.element.code?.toLowerCase().includes(value.toLowerCase().trim()))\n )\n }\n onChange={handleChange}\n getCreateLabel={(query) => `+ Create ${query}`}\n onCreate={(query) => valueSetElementToAutocompleteItem({ code: query, display: query })}\n />\n );\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n return item.display || item.code || '';\n}\n","import { CodeableConcept, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeableConceptInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept | undefined) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const [value, setValue] = useState<CodeableConcept | undefined>(props.defaultValue);\n\n function handleChange(newValue: ValueSetExpansionContains | undefined): void {\n const newConcept = newValue && valueSetElementToCodeableConcept(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n property={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codeableConceptToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeableConceptToValueSetElement(concept: CodeableConcept): ValueSetExpansionContains {\n return {\n system: concept.coding?.[0]?.system,\n code: concept.coding?.[0]?.code,\n display: concept.coding?.[0]?.display,\n };\n}\n\nfunction valueSetElementToCodeableConcept(element: ValueSetExpansionContains): CodeableConcept {\n return {\n text: element.display,\n coding: [\n {\n system: element.system,\n code: element.code,\n display: element.display,\n },\n ],\n };\n}\n","import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const [value, setValue] = useState<string | undefined>(props.defaultValue);\n\n function handleChange(newValue: ValueSetExpansionContains | undefined): void {\n const newCode = valueSetElementToCode(newValue);\n setValue(newCode);\n if (props.onChange) {\n props.onChange(newCode);\n }\n }\n\n return (\n <ValueSetAutocomplete\n property={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={codeToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeToValueSetElement(code: string | undefined): ValueSetExpansionContains | undefined {\n return code ? { code } : undefined;\n}\n\nfunction valueSetElementToCode(element: ValueSetExpansionContains | undefined): string | undefined {\n return element?.code;\n}\n","import { Coding, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: Coding;\n onChange?: (value: Coding | undefined) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const [value, setValue] = useState<Coding | undefined>(props.defaultValue);\n\n function handleChange(newValue: ValueSetExpansionContains | undefined): void {\n const newConcept = newValue && valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n property={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codingToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"system\"\n defaultValue={contactPoint?.system}\n onChange={(e) =>\n setSystem(e.currentTarget.value as 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other')\n }\n data={['', 'email', 'phone', 'fax', 'pager', 'sms', 'other']}\n />\n <NativeSelect\n data-testid=\"use\"\n defaultValue={contactPoint?.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'mobile')}\n data={['', 'home', 'work', 'temp', 'old', 'mobile']}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={contactPoint?.value}\n onChange={(e) => setValue(e.currentTarget.value)}\n />\n </Group>\n );\n}\n","import { Group, TextInput } from '@mantine/core';\nimport { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n data-testid={props.name + '-name'}\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={(e) => setName(e.currentTarget.value)}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </Group>\n );\n}\n","import { TextInput } from '@mantine/core';\nimport { isValidDate } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface DateTimeInputProps {\n name?: string;\n placeholder?: string;\n defaultValue?: string;\n outcome?: OperationOutcome;\n onChange?: (value: string) => void;\n}\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: DateTimeInputProps): JSX.Element {\n return (\n <TextInput\n id={props.name}\n name={props.name}\n data-testid={props.name}\n placeholder={props.placeholder}\n type={getInputType()}\n defaultValue={convertIsoToLocal(props.defaultValue)}\n error={getErrorsForInput(props.outcome, props.name)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n const newValue = e.currentTarget.value;\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n */\nfunction getInputType(): string {\n return process.env.NODE_ENV === 'test' ? 'text' : 'datetime-local';\n}\n","import { JsonInput } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <JsonInput\n id={props.name}\n name={props.name}\n data-testid=\"extension-input\"\n defaultValue={stringify(props.defaultValue)}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface HumanNameInputProps {\n name: string;\n defaultValue?: HumanName;\n onChange?: (value: HumanName) => void;\n}\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n const valueRef = useRef<HumanName>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden' | undefined): void {\n setValueWrapper({ ...valueRef.current, use: use ? use : undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...valueRef.current,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...valueRef.current,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...valueRef.current,\n family: family ? family : undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...valueRef.current,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n defaultValue={value?.use}\n data-testid=\"use\"\n onChange={(e) =>\n setUse(e.currentTarget.value as 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden')\n }\n data={['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden']}\n />\n <TextInput\n placeholder=\"Prefix\"\n defaultValue={value?.prefix?.join(' ')}\n onChange={(e) => setPrefix(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Given\"\n defaultValue={value?.given?.join(' ')}\n onChange={(e) => setGiven(e.currentTarget.value)}\n />\n <TextInput placeholder=\"Family\" defaultValue={value?.family} onChange={(e) => setFamily(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Suffix\"\n defaultValue={value?.suffix?.join(' ')}\n onChange={(e) => setSuffix(e.currentTarget.value)}\n />\n </Group>\n );\n}\n","import { Group, TextInput } from '@mantine/core';\nimport { Identifier } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\n\nexport interface IdentifierInputProps {\n name: string;\n defaultValue?: Identifier;\n onChange?: (value: Identifier) => void;\n}\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n placeholder=\"System\"\n defaultValue={value?.system}\n onChange={(e) => setValueWrapper({ ...value, system: e.currentTarget.value })}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={value?.value}\n onChange={(e) => setValueWrapper({ ...value, value: e.currentTarget.value })}\n />\n </Group>\n );\n}\n","import { Group } from '@mantine/core';\nimport { Period } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <DateTimeInput\n name={props.name + '.start'}\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <DateTimeInput\n name={props.name + '.end'}\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </Group>\n );\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n onChange?: (value: Quantity) => void;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: 80 }}\n data-testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n data={['', '<', '<=', '>=', '>']}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n comparator: e.currentTarget.value as '<' | '<=' | '>=' | '>',\n })\n }\n />\n <TextInput\n id={props.name}\n name={props.name}\n data-testid={props.name + '-value'}\n type=\"number\"\n step=\"any\"\n placeholder=\"Value\"\n defaultValue={value?.value?.toString()}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n value: tryParseNumber(e.currentTarget.value),\n })\n }\n />\n <TextInput\n placeholder=\"Unit\"\n data-testid={props.name + '-unit'}\n defaultValue={value?.unit}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n unit: e.currentTarget.value,\n })\n }\n />\n </Group>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n","import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n","import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n","import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n","import { Autocomplete, AutocompleteItem, Group, Loader, Text } from '@mantine/core';\nimport { getDisplayString } from '@medplum/core';\nimport { Patient, Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { forwardRef, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { useResource } from '../useResource/useResource';\n\n/**\n * Defines which search parameters will be used by the type ahead to search for each resourceType\n */\nconst SEARCH_CODES: Record<string, string> = {\n Schedule: '_id',\n Task: '_id',\n Patient: 'name',\n Practitioner: 'name',\n Questionnaire: 'name',\n ServiceRequest: '_id',\n DiagnosticReport: '_id',\n Specimen: '_id',\n Observation: 'code',\n RequestGroup: '_id',\n ActivityDefinition: 'name',\n};\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: ResourceType;\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [value, setValue] = useState<string>(defaultValue ? getDisplayString(defaultValue) : '');\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AutocompleteItem[]>([]);\n\n useEffect(() => {\n if (defaultValue) {\n setValue(getDisplayString(defaultValue));\n }\n }, [defaultValue, setValue]);\n\n async function loadValues(input: string): Promise<void> {\n setLoading(true);\n const searchCode = SEARCH_CODES[props.resourceType] || 'name';\n const searchParams = new URLSearchParams({\n [searchCode]: encodeURIComponent(input),\n _count: '10',\n });\n\n const resources = await medplum.searchResources(props.resourceType, searchParams);\n setData(resources.map((resource) => ({ value: getDisplayString(resource), resource })));\n setLoading(false);\n }\n\n async function handleChange(val: string): Promise<void> {\n setValue(val);\n return loadValues(val);\n }\n\n function handleSelect(item: AutocompleteItem): void {\n setValue(item.value);\n setData([]);\n if (props.onChange) {\n props.onChange(item.resource);\n }\n }\n\n return (\n <Autocomplete\n itemComponent={ItemComponent}\n value={value}\n data={data}\n placeholder={props.placeholder}\n onFocus={() => loadValues(value)}\n onChange={handleChange}\n onItemSubmit={handleSelect}\n rightSection={loading ? <Loader size={16} /> : null}\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(({ value, resource, ...others }: any, ref) => {\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{value}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {(resource as Patient).birthDate}\n </Text>\n </div>\n </Group>\n </div>\n );\n});\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = props.targetTypes;\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes ? (\n <NativeSelect\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n data={targetTypes}\n />\n ) : (\n <TextInput\n data-testid=\"reference-input-resource-type-input\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n />\n )}\n <ResourceInput\n resourceType={resourceType as ResourceType}\n name={props.name + '-id'}\n placeholder={props.placeholder}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </Group>\n );\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n","import { ActionIcon } from '@mantine/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport React, { useRef, useState } from 'react';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(\n props.defaultValue && Array.isArray(props.defaultValue) ? props.defaultValue : []\n );\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Add\"\n size=\"sm\"\n color=\"green\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { Button, Checkbox, Group, Modal, NativeSelect, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo' | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDayOfWeek(day: DayOfWeek, enabled: boolean): void {\n if (enabled) {\n addDayOfWeek(day);\n } else {\n removeDayOfWeek(day);\n }\n }\n\n function addDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (!existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });\n }\n }\n\n function removeDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });\n }\n }\n\n return (\n <Modal title=\"Timing\" closeButtonLabel=\"Close\" opened={props.visible} onClose={() => props.onCancel()}>\n <div style={{ padding: '5px 20px', textAlign: 'left' }}>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value?.repeat?.period}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value))}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value?.repeat?.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as 'a' | 'd' | 'wk' | 'mo' | undefined)}\n data={[\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n <FormSection title=\"Repeat on\">\n <Group spacing=\"xs\" grow noWrap>\n {daysOfWeek.map((day) => (\n <React.Fragment key={day}>\n <label htmlFor={'timing-dialog-repeat-' + day}>{day.charAt(0).toUpperCase()}</label>\n <Checkbox\n id={'timing-dialog-repeat-' + day}\n name={'timing-dialog-repeat-' + day}\n onChange={(e) => setDayOfWeek(day as DayOfWeek, e.currentTarget.checked)}\n />\n </React.Fragment>\n ))}\n </Group>\n </FormSection>\n </div>\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Modal>\n );\n}\n","import { Checkbox, Group, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport { buildTypeName, capitalize, PropertyType } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AddressInput } from '../AddressInput/AddressInput';\nimport { AnnotationInput } from '../AnnotationInput/AnnotationInput';\nimport { AttachmentArrayInput } from '../AttachmentArrayInput/AttachmentArrayInput';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { CodingInput } from '../CodingInput/CodingInput';\nimport { ContactDetailInput } from '../ContactDetailInput/ContactDetailInput';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { ExtensionInput } from '../ExtensionInput/ExtensionInput';\nimport { HumanNameInput } from '../HumanNameInput/HumanNameInput';\nimport { IdentifierInput } from '../IdentifierInput/IdentifierInput';\nimport { PeriodInput } from '../PeriodInput/PeriodInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { RatioInput } from '../RatioInput/RatioInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourceArrayInput } from '../ResourceArrayInput/ResourceArrayInput';\nimport { TimingInput } from '../TimingInput/TimingInput';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface ResourcePropertyInputProps {\n property: ElementDefinition;\n name: string;\n defaultPropertyType?: PropertyType;\n defaultValue?: any;\n arrayElement?: boolean;\n onChange?: (value: any, propName?: string) => void;\n outcome?: OperationOutcome;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.defaultPropertyType ?? (property.type?.[0]?.code as PropertyType);\n const name = props.name;\n const value = props.defaultValue;\n\n if (property.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayInput name={name} defaultValue={value} onChange={props.onChange} />;\n }\n return <ResourceArrayInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n }\n\n const propertyTypes = property.type as ElementDefinitionType[];\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return <ElementDefinitionTypeInput elementDefinitionType={propertyTypes[0]} {...props} />;\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: '200px' }}\n defaultValue={selectedType?.code}\n onChange={(e) => {\n setSelectedType(\n propertyTypes.find(\n (type: ElementDefinitionType) => type.code === e.currentTarget.value\n ) as ElementDefinitionType\n );\n }}\n data={propertyTypes.map((type: ElementDefinitionType) => ({\n value: type.code as string,\n label: type.code as string,\n }))}\n />\n <ElementDefinitionTypeInput\n {...props}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n />\n </Group>\n );\n}\n\nexport interface ElementDefinitionTypeInputProps extends ResourcePropertyInputProps {\n elementDefinitionType: ElementDefinitionType;\n}\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.elementDefinitionType.code as PropertyType;\n const name = props.name;\n const value = props.defaultValue;\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n return (\n <TextInput\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeInput name={name} defaultValue={value} onChange={props.onChange} outcome={props.outcome} />;\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <TextInput\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : '1'}\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.valueAsNumber);\n }\n }}\n />\n );\n case PropertyType.code:\n return <CodeInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n data-testid={name}\n defaultChecked={!!value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n case PropertyType.markdown:\n return (\n <Textarea\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Annotation:\n return <AnnotationInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Attachment:\n return <AttachmentInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Coding:\n return <CodingInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Extension:\n return <ExtensionInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.HumanName:\n return <HumanNameInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Identifier:\n return <IdentifierInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Period:\n return <PeriodInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Quantity:\n return <QuantityInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Range:\n return <RangeInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Ratio:\n return <RatioInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={value}\n targetTypes={getTargetTypes(property)}\n onChange={props.onChange}\n />\n );\n case PropertyType.Timing:\n return <TimingInput name={name} defaultValue={value} onChange={props.onChange} />;\n default:\n return (\n <BackboneElementInput\n typeName={buildTypeName(property.path?.split('.') as string[])}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n }\n}\n\nfunction getTargetTypes(property?: ElementDefinition): string[] | undefined {\n return property?.type?.[0]?.targetProfile?.map((p) => p.split('/').pop() as string);\n}\n","import { Stack } from '@mantine/core';\nimport { getPropertyDisplayName, globalSchema } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { FormSection } from '../FormSection/FormSection';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\n\nexport interface BackboneElementInputProps {\n typeName: string;\n defaultValue?: any;\n outcome?: OperationOutcome;\n onChange?: (value: any) => void;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n const typeName = props.typeName;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n const typedValue = { type: typeName, value };\n\n return (\n <Stack>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n if (!property.type) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n\n if (property.type.length === 1 && property.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n outcome={props.outcome}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n","import { Button, createStyles, Group } from '@mantine/core';\nimport { Slot } from '@medplum/fhirtypes';\nimport React, { useMemo, useState } from 'react';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n width: 350,\n\n '& th': {\n fontWeight: 'normal',\n fontSize: 11,\n padding: 8,\n textAlign: 'center',\n },\n\n '& td': {\n padding: '2px 4px',\n },\n\n '& td button': {\n width: 44,\n height: 44,\n color: theme.colors[theme.primaryColor][5],\n fontSize: 16,\n fontWeight: 500,\n textAlign: 'center',\n padding: 0,\n backgroundColor: theme.colors[theme.primaryColor][0],\n border: 0,\n borderRadius: '50%',\n cursor: 'pointer',\n },\n\n '& td button:hover': {\n backgroundColor: theme.colors[theme.primaryColor][1],\n },\n\n '& td button:disabled': {\n backgroundColor: 'transparent',\n cursor: 'default',\n color: theme.colors.gray[4],\n fontWeight: 'normal',\n },\n },\n}));\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onChangeMonth: (date: Date) => void;\n onClick: (date: Date) => void;\n}\n\n/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const { classes } = useStyles();\n const { onChangeMonth, onClick } = props;\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const newMonth = new Date(currMonth.getTime());\n newMonth.setMonth(currMonth.getMonth() + delta);\n onChangeMonth(newMonth);\n return newMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <Group position=\"apart\" spacing=\"xs\" grow noWrap>\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <Group position=\"right\" spacing=\"xs\">\n <Button variant=\"outline\" aria-label=\"Previous month\" onClick={() => moveMonth(-1)}>\n &lt;\n </Button>\n <Button variant=\"outline\" aria-label=\"Next month\" onClick={() => moveMonth(1)}>\n &gt;\n </Button>\n </Group>\n </Group>\n <table className={classes.table}>\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <Button disabled={!day.available} onClick={() => onClick(day.date)}>\n {day.date.getDate()}\n </Button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day The day to check.\n * @param slots The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n","import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const { value, link, ...rest } = props;\n const resource = useResource(value);\n if (!resource) {\n return null;\n }\n\n const text = getDisplayString(resource);\n\n return link ? (\n <MedplumLink to={resource} {...rest}>\n {text}\n </MedplumLink>\n ) : (\n <Text component=\"span\" {...rest}>\n {text}\n </Text>\n );\n}\n","import { Group } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <Group spacing=\"xs\">\n <ResourceAvatar size={24} radius={12} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </Group>\n );\n}\n","import { createStyles, Group, Stack, Text, Title } from '@mantine/core';\nimport { capitalize, formatDateTime, formatObservationValue } from '@medplum/core';\nimport {\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n borderCollapse: 'collapse',\n\n '& td, & th': {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n padding: 4,\n },\n },\n\n criticalRow: {\n background: theme.colorScheme === 'dark' ? theme.colors.red[7] : theme.colors.red[1],\n border: `0.1px solid ${theme.colors.red[5]}`,\n color: theme.colors.red[5],\n fontWeight: 500,\n\n '& td': {\n border: `0.1px solid ${theme.colors.red[5]}`,\n },\n },\n}));\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n}\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const diagnosticReport = useResource(props.value);\n const specimen = useResource(diagnosticReport?.specimen?.[0]);\n if (!diagnosticReport) {\n return null;\n }\n\n let textContent = '';\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n textContent = window.atob(pf.data);\n }\n }\n\n if (specimen?.note) {\n for (const note of specimen.note) {\n textContent += note.text + '\\n\\n';\n }\n }\n\n return (\n <Stack>\n <Title>Diagnostic Report</Title>\n <Group mt=\"md\" spacing={30}>\n {diagnosticReport.subject && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Subject\n </Text>\n <Text>\n <ResourceBadge value={diagnosticReport.subject} link={true} />\n </Text>\n </div>\n )}\n {diagnosticReport.resultsInterpreter &&\n diagnosticReport.resultsInterpreter.map((interpreter) => (\n <div key={interpreter.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Interpreter\n </Text>\n <Text>\n <ResourceBadge value={interpreter} link={true} />\n </Text>\n </div>\n ))}\n {diagnosticReport.issued && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Issued\n </Text>\n <Text>{formatDateTime(diagnosticReport.issued)}</Text>\n </div>\n )}\n {diagnosticReport.status && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Status\n </Text>\n <Text>{capitalize(diagnosticReport.status)}</Text>\n </div>\n )}\n </Group>\n {diagnosticReport.result && <ObservationTable value={diagnosticReport.result} />}\n {textContent && <pre>{textContent.trim()}</pre>}\n </Stack>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n const { classes } = useStyles();\n return (\n <table className={classes.table}>\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation, index) => (\n <ObservationRow key={'obs-' + index} value={observation} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const { classes, cx } = useStyles();\n const observation = useResource(props.value);\n if (!observation) {\n return null;\n }\n\n const critical = isCritical(observation);\n\n return (\n <tr className={cx({ [classes.criticalRow]: critical })}>\n <td>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n </tr>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n return <>{formatObservationValue(obs)}</>;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n if (range.text) {\n return <>{range.text}</>;\n }\n return <RangeDisplay value={range} />;\n}\n\n/**\n * Returns true if the observation is critical.\n * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html\n * @param observation The FHIR observation.\n * @returns True if the FHIR observation is a critical value.\n */\nfunction isCritical(observation: Observation): boolean {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n return code === 'AA' || code === 'LL' || code === 'HH' || code === 'A';\n}\n","import { createStyles } from '@mantine/core';\nimport { getPropertyDisplayName, IndexedStructureDefinition, stringify, toTypedValue } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n borderCollapse: 'collapse',\n width: '100%',\n\n '& tr': {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n '& th, & td': {\n padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,\n verticalAlign: 'top',\n },\n },\n\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n medplum.requestSchema(props.original.resourceType).then(setSchema).catch(console.log);\n }, [medplum, props.original.resourceType]);\n\n if (!schema) {\n return null;\n }\n\n const typeSchema = schema.types[props.original.resourceType];\n if (!typeSchema) {\n return null;\n }\n\n return (\n <table className={classes.root}>\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '35%' }} />\n <col style={{ width: '35%' }} />\n </colgroup>\n <thead>\n <tr>\n <th>Property</th>\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || key === 'meta') {\n return null;\n }\n\n const property = entry[1];\n const [originalPropertyValue, originalPropertyType] = getValueAndType(toTypedValue(props.original), key);\n const [revisedPropertyValue, revisedPropertyType] = getValueAndType(toTypedValue(props.revised), key);\n if (isEmpty(originalPropertyValue) && isEmpty(revisedPropertyValue)) {\n return null;\n }\n\n if (stringify(originalPropertyValue) === stringify(revisedPropertyValue)) {\n return null;\n }\n\n return (\n <tr key={key}>\n <td>{getPropertyDisplayName(key)}</td>\n <td className={classes.removed}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalPropertyType}\n value={originalPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n <td className={classes.added}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedPropertyType}\n value={revisedPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n !value ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n );\n}\n","import { IndexedStructureDefinition } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceTableProps {\n value: Resource | Reference;\n ignoreMissingValues?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n if (value) {\n medplum.requestSchema(value.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, value]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{ type: value.resourceType, value }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n","import { Alert } from '@mantine/core';\nimport { normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Something went wrong\" color=\"red\">\n {normalizeErrorString(this.state.error)}\n </Alert>\n );\n }\n\n return this.props.children;\n }\n}\n","import { ActionIcon, Container, Group, Menu, Paper, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { IconDots } from '@tabler/icons';\nimport React from 'react';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface TimelineProps {\n children?: React.ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <Container>{props.children}</Container>;\n}\n\nexport interface TimelineItemProps {\n resource: Resource;\n profile?: Reference;\n socialEnabled?: boolean;\n children?: React.ReactNode;\n padding?: boolean;\n className?: string;\n popupMenuItems?: React.ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const author = props.profile ?? props.resource.meta?.author;\n\n return (\n <Paper data-testid=\"timeline-item\" m=\"lg\" p=\"sm\" shadow=\"xs\" radius=\"sm\" withBorder className={props.className}>\n <Group position=\"apart\" spacing={8}>\n <ResourceAvatar value={author} link={true} size=\"md\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\">\n <ResourceName color=\"dark\" weight={500} value={author} link={true} />\n </Text>\n <Text size=\"xs\">\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {formatDateTime(props.resource.meta?.lastUpdated)}\n </MedplumLink>\n <Text component=\"span\" color=\"dimmed\" mx={8}>\n &middot;\n </Text>\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {props.resource.resourceType}\n </MedplumLink>\n </Text>\n </div>\n {props.popupMenuItems && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={200}>\n <Menu.Target>\n <ActionIcon radius=\"xl\" aria-label={`Actions for ${getReferenceString(props.resource)}`}>\n <IconDots />\n </ActionIcon>\n </Menu.Target>\n {props.popupMenuItems}\n </Menu>\n )}\n </Group>\n <ErrorBoundary>\n {props.padding && <div style={{ padding: '2px 16px 16px 16px' }}>{props.children}</div>}\n {!props.padding && <>{props.children}</>}\n </ErrorBoundary>\n </Paper>\n );\n}\n","import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources Array of resources.\n */\nexport function sortByDateAndPriority(resources: Resource[]): void {\n resources.sort(resourceDateComparator);\n}\n\nfunction resourceDateComparator(a: Resource, b: Resource): number {\n const priority1 = getPriorityScore(a);\n const priority2 = getPriorityScore(b);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a) - getTime(b);\n}\n\nfunction getPriorityScore(resource: Resource): number {\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] || 0;\n }\n return 0;\n}\n\nfunction getTime(resource: Resource): number {\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n","import { ActionIcon, Center, createStyles, Group, Loader, Menu, Paper, ScrollArea, TextInput } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { getReferenceString, normalizeErrorString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n Reference,\n Resource,\n} from '@medplum/fhirtypes';\nimport {\n IconCheck,\n IconCloudUpload,\n IconEdit,\n IconFileAlert,\n IconListDetails,\n IconMessage,\n IconPin,\n IconPinnedOff,\n IconTrash,\n} from '@tabler/icons';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { DiagnosticReportDisplay } from '../DiagnosticReportDisplay/DiagnosticReportDisplay';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceDiffTable } from '../ResourceDiffTable/ResourceDiffTable';\nimport { ResourceTable } from '../ResourceTable/ResourceTable';\nimport { Timeline, TimelineItem } from '../Timeline/Timeline';\nimport { useResource } from '../useResource/useResource';\nimport { sortByDateAndPriority } from '../utils/date';\n\nconst useStyles = createStyles((theme) => ({\n pinnedComment: {\n backgroundColor: theme.colors.blue[0],\n },\n}));\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n buildSearchRequests: (resource: T) => Bundle;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const navigate = useNavigate();\n const medplum = useMedplum();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const buildSearchRequests = props.buildSearchRequests;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n const loadTimeline = useCallback(() => {\n if (!resource) {\n setItems([]);\n setHistory({} as Bundle);\n return;\n }\n medplum.executeBatch(buildSearchRequests(resource)).then(handleBatchResponse).catch(console.log);\n }, [medplum, resource, buildSearchRequests]);\n\n useEffect(() => {\n loadTimeline();\n }, [loadTimeline]);\n\n /**\n * Handles a batch request response.\n * @param batchResponse The batch response.\n */\n function handleBatchResponse(batchResponse: Bundle): void {\n const newItems = [];\n\n if (batchResponse.entry) {\n for (const batchEntry of batchResponse.entry) {\n const bundle = batchEntry.resource as Bundle;\n if (!bundle) {\n // User may not have access to all resource types\n continue;\n }\n\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n if (entry.resource) {\n newItems.push(entry.resource);\n }\n }\n }\n }\n\n sortByDateAndPriority(newItems);\n newItems.reverse();\n }\n\n setItems(newItems);\n }\n\n /**\n * Adds an array of resources to the timeline.\n * @param resources Array of resources.\n */\n function addResources(resources: Resource[]): void {\n const newItems = [...itemsRef.current, ...resources];\n sortByDateAndPriority(newItems);\n newItems.reverse();\n setItems(newItems);\n }\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createCommunication(resource, sender, contentString))\n .then((result) => {\n addResources([result]);\n })\n .catch(console.log);\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createMedia(resource, sender, attachment))\n .then((result) => addResources([result]))\n .then(() =>\n updateNotification({\n id: 'upload-notification',\n color: 'teal',\n title: 'Upload complete',\n message: '',\n icon: <IconCheck size={16} />,\n autoClose: 2000,\n })\n )\n .catch((reason) =>\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(reason),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n })\n );\n }\n\n function setPriority(\n communication: Communication,\n priority: 'routine' | 'urgent' | 'asap' | 'stat'\n ): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline).catch(console.log);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline).catch(console.log);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n function onUploadStart(): void {\n showNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Initializing upload...',\n message: 'Please wait...',\n autoClose: false,\n disallowClose: true,\n });\n }\n\n function onUploadProgress(e: ProgressEvent): void {\n updateNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Uploading...',\n message: getProgressMessage(e),\n autoClose: false,\n disallowClose: true,\n });\n }\n\n if (!resource) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <Paper m=\"lg\" p=\"sm\" shadow=\"xs\" radius=\"sm\" withBorder>\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Group spacing=\"xs\" noWrap style={{ width: '100%' }}>\n <ResourceAvatar value={sender} />\n <TextInput\n name=\"text\"\n ref={inputRef}\n placeholder=\"Add comment\"\n style={{ width: '100%', maxWidth: 300 }}\n />\n <ActionIcon type=\"submit\" radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconMessage size={16} />\n </ActionIcon>\n <AttachmentButton\n onUpload={createMedia}\n onUploadStart={onUploadStart}\n onUploadProgress={onUploadProgress}\n >\n {(props) => (\n <ActionIcon {...props} radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </Group>\n </Form>\n </Paper>\n )}\n {items.map((item) => {\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem\n key={item.meta?.versionId}\n history={history as Bundle<Resource>}\n resource={item}\n onDetails={onVersionDetails}\n />\n );\n }\n const key = `${item.resourceType}/${item.id}`;\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <Menu.Dropdown>\n <Menu.Label>Resource</Menu.Label>\n {props.onPin && (\n <Menu.Item\n icon={<IconPin size={14} />}\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n aria-label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </Menu.Item>\n )}\n {props.onUnpin && (\n <Menu.Item\n icon={<IconPinnedOff size={14} />}\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n aria-label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </Menu.Item>\n )}\n {props.onDetails && (\n <Menu.Item\n icon={<IconListDetails size={14} />}\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n aria-label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </Menu.Item>\n )}\n {props.onEdit && (\n <Menu.Item\n icon={<IconEdit size={14} />}\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n aria-label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </Menu.Item>\n )}\n {props.onDelete && (\n <>\n <Menu.Divider />\n <Menu.Label>Danger zone</Menu.Label>\n <Menu.Item\n color=\"red\"\n icon={<IconTrash size={14} />}\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n aria-label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const { classes } = useStyles();\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? undefined : classes.pinnedComment;\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ScrollArea>\n <pre>{props.resource.outcomeDesc}</pre>\n </ScrollArea>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n\nfunction getProgressMessage(e: ProgressEvent): string {\n if (e.lengthComputable) {\n const percent = (100 * e.loaded) / e.total;\n return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;\n }\n return `Uploaded: ${formatFileSize(e.loaded)}`;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes == 0) {\n return '0.00 B';\n }\n const e = Math.floor(Math.log(bytes) / Math.log(1024));\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\n}\n","import { evalFhirPath, PropertyType } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: PropertyType;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n","import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n Operator,\n PropertyType,\n SearchRequest,\n} from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n};\n\n/**\n * Sets the array of filters.\n *\n * @param {Array} filters The new filters.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n *\n * @param {string} code The field key name to clear filters.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters || []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The operation key name.\n * @param {?string} value The filter value.\n * @param {boolean=} opt_clear Optional flag to clear filters on the field.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value || '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n *\n * @param {string} field The field key name.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields && definition.fields.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n *\n * @param {number} index The filter index.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n *\n * @param {string} field The field key name.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n *\n * @param {string} field The field key name.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n *\n * @param {string} field The field key name.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of days from this day.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n *\n * @param {string} field The field key name.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n *\n * @param {string} field The field key name.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n *\n * @param {string} field The field key name.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of months from this month.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n *\n * @param {string} field The field key name.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n *\n * @param {string} field The field key name.\n * @param {Date} d1 The start date.\n * @param {Date} d2 The end date.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n *\n * @param {string} field The field key name.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n *\n * @param {number} offset The offset number.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition The search definition.\n * @param page The new page number\n * @return The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n *\n * @param {string} sortField The sort key.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n *\n * @param {string} key The field key name.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n *\n * @param {string} op The operation code.\n * @return {string} A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param key The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0], field.elementDefinition);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') || '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @param elementDefinition Optional element definition.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(\n resource: Resource,\n searchParam: SearchParameter,\n elementDefinition: ElementDefinition | undefined\n): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n if (elementDefinition) {\n return (\n <ResourcePropertyDisplay\n propertyType={value[0].type as PropertyType}\n value={value[0].value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n }\n\n return (\n <>\n {value.map((v, index) => (\n <span key={`${index}-${value.length}`}>\n {typeof v === 'object' ? JSON.stringify(v) : (v as string | number)}\n </span>\n ))}\n </>\n );\n}\n","import { Button, Modal } from '@mantine/core';\nimport { globalSchema, SearchRequest, stringify, TypeSchema } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { buildFieldNameString } from '../SearchControl/SearchUtils';\n\ninterface SearchFieldEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFieldEditor(props: SearchFieldEditorProps): JSX.Element | null {\n const [state, setState] = useState({\n search: JSON.parse(stringify(props.search)) as SearchRequest,\n });\n\n const availableRef = useRef<HTMLSelectElement>(null);\n const selectedRef = useRef<HTMLSelectElement>(null);\n\n useEffect(() => {\n setState({ search: props.search });\n }, [props.search]);\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n *\n * @param {KeyboardEvent} e The keyboard event.\n */\n function handleAvailableKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onAddField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleAvailableDoubleClick(): void {\n onAddField();\n }\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n *\n * @param {KeyboardEvent} e The keyboard event.\n */\n function handleSelectedKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onRemoveField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleSelectedDoubleClick(): void {\n onRemoveField();\n }\n\n /**\n * Handles a click on the \"Add\" button.\n * Moves the \"available\" selection into the \"selected\" list.\n */\n function onAddField(): void {\n const currentField = state.search.fields ?? [];\n const key = availableRef.current?.value;\n if (key) {\n const newFields = [...currentField, key];\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Remove\" button.\n * Moves the \"selected\" selection into the \"available\" list.\n */\n function onRemoveField(): void {\n const currentField = state.search.fields ?? [];\n const key = selectedRef.current?.value;\n if (key) {\n const newFields = [...currentField];\n newFields.splice(newFields.indexOf(key), 1);\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Up\" button.\n * Moves the selection up one position in the list.\n */\n function onMoveUp(): void {\n const currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index - 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Down\" button.\n * Moves the selection down one position in the list.\n */\n function onMoveDown(): void {\n const currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index + 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Swaps two fields in the search.\n *\n * @param {number} i The index of the first field.\n * @param {number} j The index of the second field.\n */\n function swapFields(fields: string[], i: number, j: number): void {\n const temp = fields[i];\n fields[i] = fields[j];\n fields[j] = temp;\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const typeDef = globalSchema.types[resourceType];\n\n const selected = state.search.fields ?? [];\n const available = getFieldsList(typeDef)\n .filter((field) => !selected?.includes(field))\n .sort();\n\n return (\n <Modal title=\"Fields\" closeButtonLabel=\"Close\" opened={props.visible} onClose={props.onCancel}>\n <div>\n <table style={{ margin: 'auto' }}>\n <thead>\n <tr>\n <th colSpan={2} align=\"center\">\n Available\n </th>\n <th colSpan={2} align=\"center\">\n Selected\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td colSpan={2} align=\"center\">\n <select\n ref={availableRef}\n size={15}\n tabIndex={1}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleAvailableKeyDown(e)}\n onDoubleClick={() => handleAvailableDoubleClick()}\n data-testid=\"available\"\n >\n {available.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n <td colSpan={2} align=\"center\">\n <select\n ref={selectedRef}\n size={15}\n tabIndex={4}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleSelectedKeyDown(e)}\n onDoubleClick={() => handleSelectedDoubleClick()}\n data-testid=\"selected\"\n >\n {selected.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onAddField}>\n Add\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onRemoveField}>\n Remove\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveUp}>\n Up\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveDown}>\n Down\n </Button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n <Button onClick={() => props.onOk(state.search)}>OK</Button>\n </Modal>\n );\n}\n\n/**\n * Returns a list of fields/columns available for a type.\n * The result is the union of properties and search parameters.\n * @param typeSchema The type definition.\n */\nfunction getFieldsList(typeSchema: TypeSchema): string[] {\n const result = [] as string[];\n const keys = new Set<string>();\n const names = new Set<string>();\n\n // Add properties first\n for (const key of Object.keys(typeSchema.properties)) {\n result.push(key);\n keys.add(key.toLowerCase());\n names.add(buildFieldNameString(key));\n }\n\n // Add search parameters if unique\n if (typeSchema.searchParams) {\n for (const code of Object.keys(typeSchema.searchParams)) {\n const name = buildFieldNameString(code);\n if (!keys.has(code) && !names.has(name)) {\n result.push(code);\n keys.add(code);\n names.add(buildFieldNameString(code));\n }\n }\n }\n\n return result;\n}\n","import { Filter, formatDateTime, getSearchParameterDetails, globalSchema, SearchParameterType } from '@medplum/core';\nimport React from 'react';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element {\n const { resourceType, filter } = props;\n\n const searchParam = globalSchema.types[resourceType]?.searchParams?.[filter.code];\n if (searchParam) {\n if (searchParam.type === 'reference') {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);\n if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {\n return <>{formatDateTime(filter.value)}</>;\n }\n }\n\n return <>{filter.value}</>;\n}\n","import { Checkbox, TextInput } from '@mantine/core';\nimport { getSearchParameterDetails, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n resourceType: string;\n searchParam: SearchParameter;\n defaultValue?: string;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n}\n\nexport function SearchFilterValueInput(props: SearchFilterValueInputProps): JSX.Element | null {\n const details = getSearchParameterDetails(props.resourceType, props.searchParam);\n const name = 'filter-value';\n\n switch (details.type) {\n case SearchParameterType.REFERENCE:\n return (\n <ReferenceInput\n name={name}\n defaultValue={{ reference: props.defaultValue }}\n targetTypes={props.searchParam?.target}\n onChange={(newReference: Reference | undefined) => {\n if (newReference) {\n props.onChange(newReference.reference as string);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n case SearchParameterType.BOOLEAN:\n return (\n <Checkbox\n name={name}\n data-testid={name}\n defaultChecked={props.defaultValue === 'true'}\n onChange={(e) => props.onChange(e.currentTarget.checked.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return (\n <TextInput\n type=\"date\"\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.DATETIME:\n return <DateTimeInput name={name} defaultValue={props.defaultValue} onChange={props.onChange} />;\n\n case SearchParameterType.NUMBER:\n return (\n <TextInput\n type=\"number\"\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.QUANTITY:\n return (\n <QuantityInput\n name={name}\n defaultValue={tryParseQuantity(props.defaultValue)}\n onChange={(newQuantity: Quantity | undefined) => {\n if (newQuantity) {\n props.onChange(`${newQuantity.value}`);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n default:\n return (\n <TextInput\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n placeholder=\"Search value\"\n />\n );\n }\n}\n\nfunction tryParseQuantity(value: string | undefined): Quantity | undefined {\n if (value) {\n const [valueString, systemString, unitString] = value.split('|');\n if (valueString) {\n return {\n value: parseFloat(valueString),\n system: systemString,\n unit: unitString,\n };\n }\n }\n return undefined;\n}\n","import { Button, Group, Modal, NativeSelect } from '@mantine/core';\nimport { Filter, globalSchema, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from '../SearchControl/SearchUtils';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterEditor(props: SearchFilterEditorProps): JSX.Element | null {\n const [search, setSearch] = useState<SearchRequest>(JSON.parse(stringify(props.search)) as SearchRequest);\n const [editingIndex, setEditingIndex] = useState<number>(-1);\n\n const searchRef = useRef<SearchRequest>(search);\n searchRef.current = search;\n\n useEffect(() => {\n setSearch(JSON.parse(stringify(props.search)) as SearchRequest);\n }, [props.search]);\n\n function onAddFilter(filter: Filter): void {\n setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const searchParams = globalSchema.types[resourceType].searchParams as Record<string, SearchParameter>;\n const filters = search.filters || [];\n\n return (\n <Modal title=\"Filters\" closeButtonLabel=\"Close\" size={900} opened={props.visible} onClose={props.onCancel}>\n <div>\n <table>\n <colgroup>\n <col style={{ width: 200 }} />\n <col style={{ width: 200 }} />\n <col style={{ width: 380 }} />\n <col style={{ width: 120 }} />\n </colgroup>\n <thead>\n <tr>\n <th>Field</th>\n <th>Operation</th>\n <th>Value</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {filters.map((filter: Filter, index: number) => {\n if (index === editingIndex) {\n return (\n <FilterRowInput\n key={`filter-${index}-${filters.length}-input`}\n resourceType={resourceType}\n searchParams={searchParams}\n defaultValue={filter}\n okText=\"Save\"\n onOk={(newFilter: Filter) => {\n const newFilters = [...filters];\n newFilters[index] = newFilter;\n setSearch(setFilters(searchRef.current, newFilters));\n setEditingIndex(-1);\n }}\n onCancel={() => setEditingIndex(-1)}\n />\n );\n } else {\n return (\n <FilterRowDisplay\n key={`filter-${index}-${filters.length}-display`}\n resourceType={resourceType}\n searchParams={searchParams}\n filter={filter}\n onEdit={() => setEditingIndex(index)}\n onDelete={() => setSearch(deleteFilter(searchRef.current, index))}\n />\n );\n }\n })}\n <FilterRowInput resourceType={resourceType} searchParams={searchParams} okText=\"Add\" onOk={onAddFilter} />\n </tbody>\n </table>\n </div>\n <Group position=\"right\" mt=\"xl\">\n <Button onClick={() => props.onOk(searchRef.current)}>OK</Button>\n </Group>\n </Modal>\n );\n}\n\ninterface FilterRowDisplayProps {\n readonly searchParams: Record<string, SearchParameter>;\n readonly resourceType: string;\n readonly filter: Filter;\n readonly onEdit: () => void;\n readonly onDelete: () => void;\n}\n\nfunction FilterRowDisplay(props: FilterRowDisplayProps): JSX.Element | null {\n const { filter } = props;\n return (\n <tr>\n <td>{buildFieldNameString(filter.code)}</td>\n <td>{getOpString(filter.operator)}</td>\n <td>\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </td>\n <td>\n <Button compact variant=\"outline\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button compact variant=\"outline\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n resourceType: string;\n searchParams: Record<string, SearchParameter>;\n defaultValue?: Filter;\n okText: string;\n onOk: (value: Filter) => void;\n onCancel?: () => void;\n}\n\nfunction FilterRowInput(props: FilterRowInputProps): JSX.Element {\n const [value, setValue] = useState<Filter>(props.defaultValue ?? ({} as Filter));\n const valueRef = useRef<Filter>(value);\n valueRef.current = value;\n\n function setFilterCode(newCode: string): void {\n setValue({ ...valueRef.current, code: newCode });\n }\n\n function setFilterOperator(newOperator: Operator): void {\n setValue({ ...valueRef.current, operator: newOperator });\n }\n\n function setFilterValue(newFilterValue: string): void {\n setValue({ ...valueRef.current, value: newFilterValue });\n }\n\n const searchParam = props.searchParams[value.code];\n const operators = searchParam && getSearchOperators(searchParam);\n\n return (\n <tr>\n <td>\n <NativeSelect\n data-testid=\"filter-field\"\n defaultValue={valueRef.current.code}\n onChange={(e) => setFilterCode(e.currentTarget.value)}\n data={Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) }))}\n />\n </td>\n <td>\n {operators && (\n <NativeSelect\n data-testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={(e) => setFilterOperator(e.currentTarget.value as Operator)}\n data={['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))]}\n />\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={searchParam}\n defaultValue={value.value}\n onChange={setFilterValue}\n />\n )}\n </td>\n <td>\n {value.code && value.operator && value.value && (\n <Button\n compact\n variant=\"outline\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button compact variant=\"outline\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n","import { Button, Modal } from '@mantine/core';\nimport { Filter } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n resourceType: string;\n searchParam?: SearchParameter;\n filter?: Filter;\n defaultValue?: string;\n onOk: (filter: Filter) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterValueDialog(props: SearchFilterValueDialogProps): JSX.Element | null {\n const [value, setValue] = useState<string>(props.defaultValue ?? '');\n\n if (!props.visible || !props.searchParam || !props.filter) {\n return null;\n }\n\n function onOk(): void {\n props.onOk({ ...(props.filter as Filter), value });\n }\n\n return (\n <Modal title={props.title} size=\"xl\" opened={props.visible} onClose={props.onCancel}>\n <div style={{ width: 500 }}>\n <Form onSubmit={onOk}>\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Form>\n </div>\n <Button onClick={onOk}>OK</Button>\n </Modal>\n );\n}\n","import { Menu } from '@mantine/core';\nimport { Filter, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport {\n IconBleach,\n IconBleachOff,\n IconBracketsContain,\n IconBucket,\n IconBucketOff,\n IconCalendar,\n IconEqual,\n IconEqualNot,\n IconMathGreater,\n IconMathLower,\n IconSettings,\n IconSortAscending,\n IconSortDescending,\n IconX,\n} from '@tabler/icons';\nimport React from 'react';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from '../SearchControl/SearchUtils';\n\nexport interface SearchPopupMenuProps {\n search: SearchRequest;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Menu.Dropdown>\n {props.searchParams.map((searchParam) => (\n <Menu.Item key={searchParam.code}>{buildFieldNameString(searchParam.code as string)}</Menu.Item>\n ))}\n </Menu.Dropdown>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Oldest to Newest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Newest to Oldest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}>\n Before...\n </Menu.Item>\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}\n >\n After...\n </Menu.Item>\n <Menu.Item icon={<IconBracketsContain size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Between...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addTomorrowFilter(props.search, code))}\n >\n Tomorrow\n </Menu.Item>\n <Menu.Item icon={<IconCalendar size={14} />} onClick={() => props.onChange(addTodayFilter(props.search, code))}>\n Today\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYesterdayFilter(props.search, code))}\n >\n Yesterday\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addNextMonthFilter(props.search, code))}\n >\n Next Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addThisMonthFilter(props.search, code))}\n >\n This Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addLastMonthFilter(props.search, code))}\n >\n Last Month\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYearToDateFilter(props.search, code))}\n >\n Year to date\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Smallest to Largest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Largest to Smallest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}\n >\n Greater than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}\n >\n Greater than or equal to...\n </Menu.Item>\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}>\n Less than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}\n >\n Less than or equal to...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort A to Z\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Z to A\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconBucket size={14} />} onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>\n Contains...\n </Menu.Item>\n <Menu.Item icon={<IconBucketOff size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Does not contain...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction CommonMenuItems(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <Menu.Divider />\n <Menu.Item icon={<IconBleach size={14} />} onClick={() => props.onChange(addMissingFilter(props.search, code))}>\n Missing\n </Menu.Item>\n <Menu.Item\n icon={<IconBleachOff size={14} />}\n onClick={() => props.onChange(addMissingFilter(props.search, code, false))}\n >\n Not missing\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconX size={14} />} onClick={() => props.onClear(searchParam)}>\n Clear filters\n </Menu.Item>\n </>\n );\n}\n","import { getSearchParameterDetails, globalSchema, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, ResourceType, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to ElementDefinition objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: ElementDefinition;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param search The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param resourceType The resource type.\n * @param name The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(resourceType: string, name: string): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n },\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n },\n ],\n };\n }\n\n const typeSchema = globalSchema.types[resourceType];\n const exactElementDefinition: ElementDefinition | undefined = typeSchema.properties[name];\n const exactSearchParam: SearchParameter | undefined = typeSchema.searchParams?.[name.toLowerCase()];\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n let searchParams: SearchParameter[] | undefined = undefined;\n if (typeSchema.searchParams) {\n const path = `${resourceType}.${name.replaceAll('[x]', '')}`;\n searchParams = Object.values(typeSchema.searchParams).filter((p) => p.expression?.includes(path));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n","import {\n Button,\n Center,\n Container,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs}px ${theme.spacing.md}px`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: 'accurate', fields: undefined })\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n }, [medplum, search, onLoad]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current?.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n *\n * @param e The click event.\n * @param resource The FHIR resource.\n */\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && props.onExport && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={props.onExport}\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </Text>\n )}\n </Group>\n )}\n <Table className={classes.table}>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n page={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getItemAriaLabel={(page) => {\n switch (page) {\n case 'prev':\n return 'Previous page';\n case 'next':\n return 'Next page';\n default:\n return undefined;\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue={''}\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter, index: number) => (\n <div key={`filter-${index}-${filters.length}`}>\n {getOpString(filter.operator)}\n &nbsp;\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset || 0) / (search.count || DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count || DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n","import { Button, Loader, Table } from '@mantine/core';\nimport { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from '../FhirPathDisplay/FhirPathDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchClickEvent } from '../SearchControl/SearchControl';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data?.ResourceList?.length === 0 && <div data-testid=\"empty-search\">No results</div>}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nconst searches = [\n '$/_history',\n 'Communication?subject=$',\n 'Device?patient=$',\n 'DeviceRequest?patient=$',\n 'DiagnosticReport?subject=$',\n 'Media?subject=$',\n 'ServiceRequest?subject=$',\n];\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.patient}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: searches.map((search) => ({\n request: {\n method: 'GET',\n url: search.replaceAll('$', getReferenceString(resource)),\n },\n })),\n })}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { Button, createStyles, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { getReferenceString, IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { ElementDefinition, PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n}));\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>(undefined);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const { classes } = useStyles();\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className={classes.section}>\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className={classes.bottomActions}>\n <a\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </a>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { classes, cx } = useStyles();\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: React.SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className={classes.bottomActions}>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n}\n\nconst timingProperty: ElementDefinition = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: '1',\n type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <Stack spacing=\"xl\">\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\">\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </Stack>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, PropertyType] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n","import { QuestionnaireItem } from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n","import { Button, Checkbox, Group, NativeSelect, Radio, Stack, Textarea, TextInput, Title } from '@mantine/core';\nimport {\n capitalize,\n createReference,\n deepEquals,\n getQuestionnaireAnswers,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { useResource } from '../useResource/useResource';\nimport { QuestionnaireItemType } from '../utils/questionnaire';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer>>({});\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getQuestionnaireAnswers(newResponse));\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n });\n }\n }}\n >\n {questionnaire.title && <Title>{questionnaire.title}</Title>}\n {questionnaire.item && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">{props.submitButtonText || 'OK'}</Button>\n </Group>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(index: number, newResponseItem: QuestionnaireResponseItem): void {\n const newResponseItems = responseItems.slice();\n newResponseItems[index] = newResponseItem;\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n return (\n <Stack>\n {props.items.map((item, index) => {\n if (!isQuestionEnabled(item, props.answers)) {\n return null;\n }\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n );\n }\n if (item.type === QuestionnaireItemType.boolean) {\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n return (\n <CheckboxFormSection key={item.linkId} title={item.text} htmlFor={item.linkId}>\n <Checkbox\n id={item.linkId}\n name={item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) =>\n setResponseItem(index, {\n linkId: item.linkId,\n text: item.text,\n answer: [{ valueBoolean: e.currentTarget.checked }],\n })\n }\n />\n </CheckboxFormSection>\n );\n }\n return (\n <FormSection key={item.linkId} htmlFor={item.linkId} title={item.text || ''}>\n <QuestionnaireFormItem\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[]): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n answer: [newResponseAnswer],\n });\n }\n\n switch (type) {\n case QuestionnaireItemType.group:\n return (\n <div>\n <h3>{item.text}</h3>\n {item.item && (\n <QuestionnaireFormItemArray items={item.item} answers={props.answers} onChange={onChangeItem} />\n )}\n </div>\n );\n case QuestionnaireItemType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n }\n }\n\n return null;\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n return (\n <Radio.Group\n name={name}\n orientation=\"vertical\"\n defaultValue={defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\n );\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n const enableBehavior = item.enableBehavior || 'any';\n for (const enableWhen of item.enableWhen) {\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n );\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: answers[enableWhen.question as string],\n },\n 'value[x]'\n );\n const match = deepEquals(expectedAnswer, actualAnswer);\n if (enableBehavior === 'any' && match) {\n return true;\n }\n if (enableBehavior === 'all' && !match) {\n return false;\n }\n }\n if (enableBehavior === 'any') {\n return false;\n } else {\n return true;\n }\n}\n","import { Button, createStyles, NativeSelect, Textarea, TextInput, Title } from '@mantine/core';\nimport { globalSchema, IndexedStructureDefinition } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\nimport { isChoiceQuestion, QuestionnaireItemType } from '../utils/questionnaire';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n questionBody: {\n maxWidth: 600,\n },\n\n topActions: {\n position: 'absolute',\n right: 4,\n top: 1,\n padding: 4,\n color: theme.colors.gray[5],\n fontSize: theme.fontSizes.xs,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n\n linkIdInput: {\n width: 100,\n marginBottom: 4,\n },\n\n typeSelect: {\n width: 100,\n },\n}));\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const { classes, cx } = useStyles();\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = 'resourceType' in props.item;\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item?.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item?.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n <div className={classes.questionBody}>\n {editing ? (\n <>\n {isResource && (\n <TextInput\n size=\"xl\"\n defaultValue={resource.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n )}\n {!isResource && (\n <Textarea\n autosize\n minRows={2}\n defaultValue={item.text}\n onChange={(e) => changeProperty('text', e.currentTarget.value)}\n />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <Title>{resource.title}</Title>}\n {item.text && <div>{item.text}</div>}\n {!isContainer && <QuestionnaireFormItem item={item} answers={{}} onChange={() => undefined} />}\n </>\n )}\n </div>\n {item.item &&\n item.item.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className={classes.topActions}>\n {editing ? (\n <>\n <TextInput\n size=\"xs\"\n className={classes.linkIdInput}\n defaultValue={item.linkId}\n onChange={(e) => changeProperty('linkId', e.currentTarget.value)}\n />\n {!isContainer && (\n <NativeSelect\n size=\"xs\"\n className={classes.typeSelect}\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\n )}\n </>\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className={classes.bottomActions}>\n {isContainer && (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </a>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </a>\n </>\n )}\n {editing && !isResource && (\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </a>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n })}\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </a>\n </div>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @return A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3)) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1)) + 1);\n }\n });\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n","import {\n ActionIcon,\n Button,\n Container,\n createStyles,\n Divider,\n Group,\n NativeSelect,\n Stack,\n Text,\n TextInput,\n} from '@mantine/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport { killEvent } from '../utils/dom';\n\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport React, { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'] as const;\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<typeof intervalFilters[number], any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals?.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals?.[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex != -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup. Also populates some initial\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget?.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget?.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '');\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<\n typeof intervalFilters[number],\n any\n >,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together\n * @return A \"group key\" that corresponds to the value of the interval filter properties.\n */\n\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n","import { Badge, DefaultMantineColor } from '@mantine/core';\nimport React from 'react';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n","/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path && path.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n","import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .filter((entry) => !!entry.resource)\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table The output blame table.\n * @param versions The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n","import { createStyles } from '@mantine/core';\nimport { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { blame } from '../utils/blame';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n overflowX: 'auto',\n },\n\n root: {\n border: `0.1px solid ${theme.colors.gray[3]}`,\n borderCollapse: 'collapse',\n borderRadius: theme.radius.sm,\n borderSpacing: 0,\n fontSize: theme.fontSizes.xs,\n width: '100%',\n\n '& td': {\n padding: '2px 4px 0 4px',\n verticalAlign: 'top',\n whiteSpace: 'nowrap',\n },\n },\n\n startRow: {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n normalRow: {\n borderTop: 0,\n },\n\n author: {\n lineHeight: '10px',\n },\n\n dateTime: {\n borderRight: `0.1px solid ${theme.colors.gray[3]}`,\n lineHeight: '20px',\n },\n\n lineNumber: {\n backgroundColor: theme.colors.gray[1],\n border: 0,\n color: theme.colors.gray[5],\n fontFamily: theme.fontFamilyMonospace,\n padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,\n textAlign: 'right',\n },\n\n line: {\n fontFamily: theme.fontFamilyMonospace,\n fontSize: theme.fontSizes.sm,\n padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,\n },\n\n pre: {\n margin: 0,\n },\n}));\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then(setValue).catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n const table = blame(value);\n return (\n <div className={classes.container}>\n <table className={classes.root}>\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? classes.startRow : classes.normalRow}>\n {row.span > 0 && (\n <>\n <td className={classes.author} rowSpan={row.span}>\n <ResourceBadge value={row.meta.author} link={true} />\n </td>\n <td className={classes.dateTime} rowSpan={row.span}>\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </td>\n </>\n )}\n <td className={classes.lineNumber}>{index + 1}</td>\n <td className={classes.line}>\n <pre className={classes.pre}>{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n","import { createStyles } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Delta, diff } from '../utils/diff';\n\nconst useStyles = createStyles((theme) => ({\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n const { classes } = useStyles();\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className={classes.removed}>{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className={classes.added}>{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n","import { Table } from '@mantine/core';\nimport { formatDateTime, normalizeErrorString } from '@medplum/core';\nimport { Bundle, BundleEntry, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum\n .readHistory(props.resourceType as ResourceType, props.id)\n .then(setValue)\n .catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <Table withBorder withColumnBorders>\n <thead>\n <tr>\n <th>Author</th>\n <th>Date</th>\n <th>Version</th>\n </tr>\n </thead>\n <tbody>\n {value.entry?.map((entry, index) => (\n <HistoryRow key={'entry-' + index} entry={entry} />\n ))}\n </tbody>\n </Table>\n );\n}\n\ninterface HistoryRowProps {\n entry: BundleEntry;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n const { response, resource } = props.entry;\n if (resource) {\n return (\n <tr>\n <td>\n <ResourceBadge value={resource.meta?.author} link={true} />\n </td>\n <td>{formatDateTime(resource.meta?.lastUpdated)}</td>\n <td>\n <MedplumLink to={getVersionUrl(resource)}>{resource.meta?.versionId}</MedplumLink>\n </td>\n </tr>\n );\n } else {\n return (\n <tr>\n <td colSpan={3}>{normalizeErrorString(response?.outcome)}</td>\n </tr>\n );\n }\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n","import { Button, createStyles, Stack, Text } from '@mantine/core';\nimport { getReferenceString } from '@medplum/core';\nimport { Questionnaire, QuestionnaireResponse, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { CalendarInput, getStartMonth } from '../CalendarInput/CalendarInput';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireForm } from '../QuestionnaireForm/QuestionnaireForm';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n display: 'flex',\n minHeight: 400,\n },\n\n info: {\n minWidth: 300,\n padding: 20,\n borderRight: `1px solid ${theme.colors.gray[3]}`,\n },\n\n selection: {\n minWidth: 300,\n padding: 20,\n },\n}));\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n questionnaire: Questionnaire | Reference<Questionnaire>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const schedule = useResource(props.schedule);\n const questionnaire = useResource(props.questionnaire);\n\n const [slots, setSlots] = useState<Slot[]>();\n const slotsRef = useRef<Slot[]>();\n slotsRef.current = slots;\n\n const [month, setMonth] = useState<Date>(getStartMonth());\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [response, setResponse] = useState<QuestionnaireResponse>();\n\n useEffect(() => {\n if (schedule) {\n setSlots([]);\n medplum\n .searchResources(\n 'Slot',\n new URLSearchParams([\n ['_count', (30 * 24).toString()],\n ['schedule', getReferenceString(schedule)],\n ['start', 'gt' + getStart(month)],\n ['start', 'lt' + getEnd(month)],\n ])\n )\n .then(setSlots)\n .catch(console.log);\n } else {\n setSlots(undefined);\n }\n }, [medplum, schedule, month]);\n\n if (!schedule || !slots || !questionnaire) {\n return null;\n }\n\n const actor = schedule.actor?.[0];\n\n return (\n <div className={classes.container} data-testid=\"scheduler\">\n <div className={classes.info}>\n {actor && <ResourceAvatar value={actor} size=\"xl\" />}\n {actor && (\n <Text size=\"xl\" weight={500}>\n <ResourceName value={actor} />\n </Text>\n )}\n <p>1 hour</p>\n {date && <p>{date.toLocaleDateString()}</p>}\n {slot && <p>{formatTime(new Date(slot.start as string))}</p>}\n </div>\n <div className={classes.selection}>\n {!date && (\n <div>\n <h3>Select date</h3>\n <CalendarInput slots={slots} onChangeMonth={setMonth} onClick={setDate} />\n </div>\n )}\n {date && !slot && (\n <div>\n <h3>Select time</h3>\n <Stack>\n {slots.map((s) => {\n const slotStart = new Date(s.start as string);\n return (\n slotStart.getTime() > date.getTime() &&\n slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (\n <div key={s.id}>\n <Button variant=\"outline\" style={{ width: 150 }} onClick={() => setSlot(s)}>\n {formatTime(slotStart)}\n </Button>\n </div>\n )\n );\n })}\n </Stack>\n </div>\n )}\n {date && slot && !response && (\n <QuestionnaireForm questionnaire={questionnaire} submitButtonText={'Next'} onSubmit={setResponse} />\n )}\n {date && slot && response && (\n <div>\n <h3>You're all set!</h3>\n <p>Check your email for a calendar invite.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction getStart(month: Date): string {\n return formatSlotInstant(month.getTime());\n}\n\nfunction getEnd(month: Date): string {\n return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);\n}\n\nfunction formatSlotInstant(time: number): string {\n return new Date(Math.max(Date.now(), time)).toISOString();\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `AuditEvent?entity=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n ],\n })}\n />\n );\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?encounter=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?encounter=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { NewProjectForm } from './NewProjectForm';\nimport { NewUserForm } from './NewUserForm';\n\nexport interface RegisterFormProps {\n readonly type: 'patient' | 'project';\n readonly projectId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey: string;\n readonly children?: React.ReactNode;\n readonly onSuccess: () => void;\n}\n\nexport function RegisterForm(props: RegisterFormProps): JSX.Element {\n const { type, projectId, googleClientId, recaptchaSiteKey, onSuccess } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n if (type === 'patient' && login) {\n medplum\n .startNewPatient({ login, projectId: projectId as string })\n .then((response) => medplum.processCode(response.code as string))\n .then(() => onSuccess())\n .catch((err) => setOutcome(err as OperationOutcome));\n }\n }, [medplum, type, projectId, login, onSuccess]);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.code) {\n medplum\n .processCode(response.code)\n .then(() => onSuccess())\n .catch(console.log);\n } else if (response.login) {\n setLogin(response.login);\n }\n }\n\n return (\n <Document width={450}>\n {outcome && <pre>{JSON.stringify(outcome, null, 2)}</pre>}\n {!login && (\n <NewUserForm\n projectId={projectId as string}\n googleClientId={googleClientId}\n recaptchaSiteKey={recaptchaSiteKey}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </NewUserForm>\n )}\n {login && type === 'project' && <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />}\n </Document>\n );\n}\n","import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { IconCheckbox, IconSquare } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <React.Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text weight={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by&nbsp;\n <ResourceName value={task?.meta?.author as Reference} />\n &nbsp;on&nbsp;\n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </React.Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, Resource, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?based-on=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?_count=100&based-on=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `DiagnosticReport?based-on=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n ],\n })}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { BaseLoginRequest, LoginAuthenticationResponse } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly chooseScopes?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const { chooseScopes, onSuccess, onForgotPassword, onRegister, onCode, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n }\n\n function handleScopeResponse(response: LoginAuthenticationResponse): void {\n handleCode(response.code as string);\n }\n\n function handleCode(code: string): void {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch(console.log);\n }\n }\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n generatePkce={!onCode}\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n"],"names":["AddressDisplay","props","address","value","React","formatAddress","getLine","index","line","length","setLine","str","push","Object","assign","AddressInput","setValue","useState","defaultValue","valueRef","useRef","setValueWrapper","newValue","onChange","current","createElement","Group","spacing","grow","noWrap","NativeSelect","use","e","setUse","currentTarget","data","type","setType","TextInput","placeholder","setLine1","line1","setLine2","line2","city","setCity","state","setState","postalCode","setPostalCode","reactContext","createContext","undefined","useMedplumContext","useContext","useMedplum","medplum","useMedplumProfile","profile","AnnotationInput","author","name","text","authorReference","createReference","time","Date","toISOString","setText","AttachmentDisplay","contentType","url","title","startsWith","style","maxWidth","src","alt","controls","endsWith","minHeight","width","height","allowFullScreen","frameBorder","seamless","padding","href","target","rel","AttachmentArrayDisplay","values","map","v","key","killEvent","preventDefault","stopPropagation","isCheckboxCell","el","isCheckboxElement","HTMLTableCellElement","children","HTMLInputElement","AttachmentButton","fileInputRef","processFile","file","onUploadStart","filename","createBinary","onUploadProgress","then","binary","onUpload","catch","outcome","alert","_c","_b","issue","_a","details","Fragment","display","ref","files","Array","from","forEach","onFileChange","onClick","click","AttachmentArrayInput","setValues","valuesRef","setValuesWrapper","newValues","ActionIcon","size","copy","slice","splice","IconCircleMinus","attachment","color","IconCloudUpload","AttachmentInput","Button","Document","Container","Paper","mx","my","p","shadow","radius","withBorder","__rest","s","t","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","apply","parseForm","form","element","elements","parseInputElement","HTMLTextAreaElement","HTMLSelectElement","parseSelectElement","disabled","checked","Form","testid","onSubmit","formData","Logo","xmlns","viewBox","fill","d","getErrorsForInput","expression","filter","isExpressionMatch","join","getIssuesForExpression","expr1","expr2","dot1","substring","dot2","NewProjectForm","setOutcome","this","handleAuthResponse","startNewProject","login","projectName","err","Center","sx","flexDirection","Title","Stack","label","required","autoFocus","error","Text","position","mt","createScriptTag","onload","head","document","getElementsByTagName","script","async","appendChild","GoogleButton","googleClientId","handleGoogleCredential","parentRef","scriptLoaded","setScriptLoaded","google","initialized","setInitialized","buttonRendered","setButtonRendered","useEffect","accounts","id","initialize","client_id","callback","renderButton","getGoogleClientId","clientId","origin","window","location","protocol","host","split","includes","initRecaptcha","siteKey","grecaptcha","getRecaptcha","ready","execute","action","NewUserForm","recaptchaSiteKey","issues","recaptchaToken","startNewUser","projectId","firstName","lastName","email","password","remember","Alert","icon","IconAlertCircle","response","startPkce","startGoogleLogin","googleCredential","credential","createUser","Divider","labelPosition","PasswordInput","autoComplete","Checkbox","AuthenticationForm","generatePkce","onForgotPassword","onRegister","baseLoginRequest","startLogin","Anchor","component","ChooseProfileForm","memberships","membership","UnstyledButton","post","console","log","Avatar","flex","weight","project","ChooseScopeForm","scope","keys","scopeName","defaultChecked","DEFAULT_IGNORED_PROPERTIES","useStyles","createStyles","theme","root","gridTemplateColumns","margin","sm","borderTop","colors","gray","compact","xs","border","DescriptionList","classes","cx","className","DescriptionListEntry","term","CodeableConceptDisplay","formatCodeableConcept","CodingDisplay","formatCoding","ContactPointDisplay","contactPoint","builder","system","trim","ContactDetailDisplay","contactDetail","telecom","HumanNameDisplay","formatHumanName","options","IdentifierDisplay","QuantityDisplay","formatQuantity","RangeDisplay","formatRange","RatioDisplay","numerator","denominator","MedplumLink","navigate","useNavigate","to","suffix","rest","getStringHref","resourceType","getResourceHref","reference","getReferenceHref","getHref","ReferenceDisplay","displayString","stringify","link","ResourceArrayDisplay","property","propertyType","code","ResourcePropertyDisplay","arrayElement","ignoreMissingValues","max","PropertyType","boolean","Boolean","toString","SystemString","date","integer","positiveInt","string","unsignedInt","uri","canonical","dateTime","instant","formatDateTime","markdown","Address","Annotation","Attachment","CodeableConcept","Coding","ContactDetail","ContactPoint","HumanName","Identifier","Period","formatPeriod","Quantity","Range","Ratio","Reference","Timing","formatTiming","path","Error","BackboneElementDisplay","buildTypeName","getValueAndType","context","typedResult","getTypedPropertyValue","isArray","typedValue","typeName","typeSchema","globalSchema","types","entries","properties","entry","propertyValue","getPropertyDisplayName","CheckboxFormSection","Input","Wrapper","htmlFor","description","FormSection","deviceName","useResource","resource","setResource","getCachedReference","getInitialResource","subscribed","readReference","r","setPropertyValue","obj","propName","elementDefinition","compoundKey","replace","capitalize","valueSetElementToAutocompleteItem","item","ValueSetAutocomplete","textValues","setTextValues","setData","dataRef","loadValues","useCallback","input","binding","valueSet","valueSetElements","searchValueSet","expansion","contains","newData","valueSetElement","some","MultiSelect","searchable","creatable","clearable","selected","toLowerCase","textValue","currentItem","find","getCreateLabel","query","onCreate","CodeableConceptInput","concept","coding","_d","_f","_e","newConcept","CodeInput","newCode","CodingInput","ContactPointInput","setContactPoint","setContactPointWrapper","setSystem","ContactDetailInput","setContactDetail","setContactDetailWrapper","setName","DateTimeInput","convertIsoToLocal","convertLocalToIso","isoString","isValidDate","toLocaleDateString","toLocaleTimeString","localString","ExtensionInput","JsonInput","JSON","parse","HumanNameInput","prefix","setPrefix","given","setGiven","family","setFamily","setSuffix","IdentifierInput","PeriodInput","start","end","QuantityInput","comparator","tryParseNumber","unit","parseFloat","RangeInput","low","high","RatioInput","ResourceAvatar","getDisplayString","imageUrl","getImageSrc","avatarProps","SEARCH_CODES","Schedule","Task","Patient","Practitioner","Questionnaire","ServiceRequest","DiagnosticReport","Specimen","Observation","RequestGroup","ActivityDefinition","ResourceInput","loading","setLoading","searchCode","searchParams","URLSearchParams","encodeURIComponent","_count","resources","searchResources","Autocomplete","itemComponent","ItemComponent","onFocus","val","onItemSubmit","rightSection","Loader","forwardRef","others","birthDate","ReferenceInput","targetTypes","initialResourceType","defaultValueResourceType","getInitialResourceType","setResourceType","ResourceArrayInput","borderCollapse","ResourcePropertyInput","textAlign","IconCirclePlus","daysOfWeek","TimingInput","open","setOpen","TimingEditorDialog","visible","onOk","onCancel","setRepeat","repeat","setDayOfWeek","day","enabled","existing","dayOfWeek","addDayOfWeek","removeDayOfWeek","Modal","closeButtonLabel","opened","onClose","setStart","newStart","event","period","newPeriod","setPeriod","parseInt","periodUnit","newPeriodUnit","setPeriodUnit","charAt","toUpperCase","defaultPropertyType","propertyTypes","ElementDefinitionInputSelector","elementDefinitionTypes","ElementDefinitionTypeInput","elementDefinitionType","initialPropertyType","selectedType","setSelectedType","decimal","valueAsNumber","Textarea","Extension","getTargetTypes","BackboneElementInput","targetProfile","pop","definition","table","fontWeight","fontSize","primaryColor","backgroundColor","borderRadius","cursor","getMonthString","toLocaleString","month","getFullYear","CalendarInput","onChangeMonth","setMonth","getStartMonth","moveMonth","delta","currMonth","newMonth","getTime","getMonth","grid","useMemo","startDate","slots","row","getDay","available","isDayAvailable","setDate","getDate","buildGrid","variant","week","weekIndex","dayIndex","setHours","slot","slotStart","ResourceName","ResourceBadge","criticalRow","background","colorScheme","red","DiagnosticReportDisplay","diagnosticReport","specimen","textContent","presentedForm","pf","atob","note","subject","transform","resultsInterpreter","interpreter","issued","status","ObservationTable","observation","ObservationRow","critical","interpretation","isCritical","ObservationValueDisplay","ReferenceRangeDisplay","referenceRange","obs","formatObservationValue","range","verticalAlign","removed","textDecoration","added","green","ResourceDiffTable","schema","setSchema","requestSchema","original","originalPropertyValue","originalPropertyType","toTypedValue","revisedPropertyValue","revisedPropertyType","revised","isEmpty","ResourceTable","ErrorBoundary","Component","constructor","super","static","componentDidCatch","errorInfo","render","normalizeErrorString","Timeline","TimelineItem","meta","m","lastUpdated","popupMenuItems","Menu","Target","getReferenceString","IconDots","sortByDateAndPriority","sort","resourceDateComparator","a","b","priority1","getPriorityScore","priority2","priority","stat","asap","urgent","sent","pinnedComment","blue","ResourceTimeline","sender","getProfile","inputRef","history","setHistory","items","setItems","buildSearchRequests","itemsRef","loadTimeline","executeBatch","handleBatchResponse","batchResponse","newItems","batchEntry","bundle","reverse","addResources","setPriority","communication","updateResource","onPin","onUnpin","onDetails","timelineItem","onEdit","onDelete","onVersionDetails","version","versionId","createCommunication","contentString","createResource","focus","IconMessage","createMedia","updateNotification","message","IconCheck","autoClose","reason","IconFileAlert","showNotification","disallowClose","getProgressMessage","HistoryTimelineItem","AuditEventTimelineItem","CommunicationTimelineItem","DiagnosticReportTimelineItem","MediaTimelineItem","TimelineItemPopupMenu","Dropdown","Label","Item","IconPin","IconPinnedOff","IconListDetails","IconEdit","IconTrash","previous","findIndex","getPrevious","payload","content","ScrollArea","outcomeDesc","lengthComputable","percent","loaded","total","formatFileSize","toFixed","bytes","Math","floor","pow","FhirPathDisplay","evalFhirPath","warn","searchParamToOperators","Operator","EQUALS","NOT","CONTAINS","EXACT","fulltext","token","numeric","NOT_EQUALS","GREATER_THAN","LESS_THAN","GREATER_THAN_OR_EQUALS","LESS_THAN_OR_EQUALS","quantity","STARTS_AFTER","ENDS_BEFORE","APPROXIMATELY","datetime","operatorNames","eq","ne","gt","lt","ge","le","sa","eb","ap","exact","not","above","below","in","missing","setFilters","filters","offset","clearFiltersOnField","f","addFilter","field","op","opt_clear","nextFilters","operator","deleteFilter","newFilters","addYesterdayFilter","addDayFilter","addTodayFilter","addTomorrowFilter","startTime","endTime","setTime","addDateFilterBetween","addLastMonthFilter","addMonthFilter","addThisMonthFilter","addNextMonthFilter","addYearToDateFilter","d1","d2","addDateFilterImpl","addMissingFilter","MISSING","setOffset","setPage","page","count","DEFAULT_SEARCH_COUNT","setSort","desc","getSortField","isSortDescending","sortRules","descending","substr","getSearchOperators","searchParam","getOpString","buildFieldNameString","tmp","renderValue","replaceAll","renderPropertyValue","evalFhirPathTyped","renderSearchParameterValue","SearchFieldEditor","search","availableRef","selectedRef","onAddField","currentField","fields","newFields","onRemoveField","swapFields","j","temp","typeDef","Set","names","add","has","getFieldsList","colSpan","align","tabIndex","onKeyDown","handleAvailableKeyDown","onDoubleClick","handleSelectedKeyDown","SearchFilterValueDisplay","searchParamDetails","getSearchParameterDetails","SearchParameterType","DATETIME","SearchFilterValueInput","REFERENCE","newReference","BOOLEAN","DATE","NUMBER","QUANTITY","tryParseQuantity","newQuantity","valueString","systemString","unitString","SearchFilterEditor","setSearch","editingIndex","setEditingIndex","searchRef","FilterRowInput","okText","newFilter","FilterRowDisplay","operators","setFilterCode","param","setFilterOperator","newOperator","newFilterValue","SearchFilterValueDialog","SearchPopupMenu","SearchParameterSubMenu","onSort","onPrompt","onClear","DateFilterSubMenu","NumericFilterSubMenu","ReferenceFilterSubMenu","TextFilterSubMenu","IconSortAscending","IconSortDescending","IconEqual","IconEqualNot","IconMathLower","IconMathGreater","IconBracketsContain","IconCalendar","CommonMenuItems","IconSettings","IconBucket","IconBucketOff","IconBleach","IconBleachOff","IconX","getFieldDefinition","base","exactElementDefinition","exactSearchParam","SearchChangeEvent","Event","SearchLoadEvent","SearchClickEvent","browserEvent","overflow","marginBottom","tr","dark","th","control","md","SearchControl","schemaLoaded","setSchemaLoaded","onLoad","fieldEditorVisible","filterEditorVisible","filterDialogVisible","stateRef","emitSearchChange","newSearch","handleRowClick","button","onAuxClick","formatSearchQuery","searchResponse","checkboxColumn","checkboxesEnabled","getFieldDefinitions","lastResult","buttonVariant","buttonColor","iconSize","isMobile","innerWidth","hideToolbar","mb","leftIcon","IconFilter","IconColumns","onNew","IconFilePlus","onExport","IconTableExport","onBulk","IconBoxMultiple","min","getStart","getEnd","Table","isAllSelected","newSelected","handleAllCheckboxClick","IconAdjustmentsHorizontal","stroke","filterDialogSearchParam","filterDialogFilter","hideFilters","FilterDescription","handleSingleCheckboxClick","Pagination","getPage","getTotalPages","newPage","getItemAriaLabel","MemoizedSearchControl","memo","pageSize","ceil","FhirPathTable","setResponse","setSelected","responseRef","graphql","newSchema","onContextMenu","ResourceList","fhirPath","MemoizedFhirPathTable","searches","section","transition","hovering","editing","borderLeft","bottomActions","right","bottom","fontSizes","marginLeft","ActionArrayBuilder","actionsRef","changeAction","changedAction","actions","ActionBuilder","selectedKey","setSelectedKey","hoverKey","setHoverKey","onRemove","removeAction","removedAction","addedAction","generateId","actionType","definitionCanonical","getInitialActionType","onMouseOver","ActionEditor","ActionDisplay","timingProperty","getActionTiming","setActionType","changeProperty","x","ActionResourceTypeBuilder","ActionTimingInput","loadOnFocus","nextId","existingNum","isNaN","ensurePlanDefinitionActionKeys","QuestionnaireItemType","isChoiceQuestion","QuestionnaireForm","source","questionnaire","answers","setAnswers","buildInitialResponseItems","buildInitialResponse","authored","QuestionnaireFormItemArray","newResponseItems","newResponse","getQuestionnaireAnswers","submitButtonText","responseItems","setResponseItems","setResponseItem","newResponseItem","isQuestionEnabled","linkId","group","QuestionnaireFormItem","initial","valueBoolean","answer","onChangeAnswer","newResponseAnswer","valueDecimal","valueInteger","valueDate","valueDateTime","valueTime","valueAttachment","valueReference","valueQuantity","choice","openChoice","extension","valueCodeableConcept","isDropDownChoice","QuestionnaireChoiceDropDownInput","QuestionnaireChoiceRadioInput","initialValue","answerOption","option","optionValue","typedValueToString","selectedIndex","propertyName","valueElementDefinition","optionName","Radio","orientation","buildInitialResponseItem","buildInitialResponseAnswer","enableWhen","enableBehavior","expectedAnswer","actualAnswer","question","match","deepEquals","exports","questionBody","topActions","top","linkIdInput","typeSelect","ItemBuilder","isResource","isContainer","itemRef","changeItem","changedItem","curr","addItem","addedItem","autosize","minRows","AnswerBuilder","newOptions","removedItem","removeItem","generateLinkId","justifyContent","alignItems","o","nextLinkId","ensureQuestionnaireItemKeys","ensureQuestionnaireOptionKeys","intervalFilters","defaultProps","ReferenceRangeGroupEditor","intervalGroup","onRemoveGroup","ReferenceRangeGroupFilters","intervals","interval","condition","onAdd","age","gender","newGender","ageRange","newEndocrine","generateGroupKey","gestationalAge","appliesTo","c","statusToColor","draft","active","revoked","completed","unknown","retired","registered","preliminary","final","amended","cancelled","requested","received","accepted","failed","proposed","pending","booked","arrived","noshow","waitlist","routine","StatusBadge","Badge","diff","startNode","orig","rev","deltas","snake","prev","ianchor","janchor","lines","buildRevisions","N","M","MAX","middle","diagonal","k","kmiddle","kminus","kplusNode","kminusNode","node","previousSnake","buildPath","blame","versions","localeCompare","span","revisions","revision","oldLines","newLines","compareVersions","combineSpans","container","overflowX","borderSpacing","whiteSpace","startRow","normalRow","lineHeight","borderRight","lineNumber","fontFamily","fontFamilyMonospace","pre","getVersionUrl","getTimeString","seconds","now","years","pluralizeTime","months","days","hours","minutes","noun","ChangeDiff","HistoryRow","info","minWidth","selection","formatSlotInstant","formatTime","hour","minute","request","method","encounter","eventListener","addEventListener","removeEventListeneer","medplumContext","Provider","patient","handleDocumentMouseOver","handleDocumentClick","planDefinition","removeEventListener","defaultDefinition","intervalGroups","setIntervalGroups","groupId","setGroupId","intervalId","setIntervalId","qualifiedInterval","Number","NEGATIVE_INFINITY","isFinite","ensureQualifiedIntervalKeys","groups","groupKey","fromEntries","groupQualifiedIntervals","flatMap","isEmptyInterval","quantitativeDetails","getCodeBySystem","changeInterval","addInterval","removeInterval","removeGroup","addedGroup","currentGroups","removedGroup","changedInterval","currentGroup","g","addedInterval","currentGroupIndex","removedInterval","onSuccess","setLogin","processCode","startNewPatient","requestGroup","startedLoading","setStartedLoading","responseBundle","setResponseBundle","batchEntries","buildBatchRequest","Grid","task","findBundleEntry","taskInput","taskOutput","output","Col","IconCheckbox","IconSquare","onStart","readHistory","rowSpan","originalResource","revisedResource","ignoreMeta","noValidate","withColumnBorders","schedule","setSlots","setSlot","actor","serviceRequest","basedOn","chooseScopes","onCode","setMemberships","handleCode","handleScopeResponse"],"mappings":"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"}
1
+ {"version":3,"file":"index.min.js","sources":["../../src/AddressDisplay/AddressDisplay.tsx","../../src/AddressInput/AddressInput.tsx","../../src/MedplumProvider/MedplumProvider.tsx","../../src/AnnotationInput/AnnotationInput.tsx","../../src/AttachmentDisplay/AttachmentDisplay.tsx","../../src/AttachmentArrayDisplay/AttachmentArrayDisplay.tsx","../../src/utils/dom.ts","../../src/AttachmentButton/AttachmentButton.tsx","../../src/AttachmentArrayInput/AttachmentArrayInput.tsx","../../src/AttachmentInput/AttachmentInput.tsx","../../../../node_modules/tslib/tslib.es6.js","../../src/Container/Container.tsx","../../src/Panel/Panel.tsx","../../src/Document/Document.tsx","../../src/Form/FormUtils.ts","../../src/Form/Form.tsx","../../src/Logo/Logo.tsx","../../src/utils/outcomes.ts","../../src/auth/NewProjectForm.tsx","../../src/utils/script.ts","../../src/GoogleButton/GoogleButton.tsx","../../src/utils/recaptcha.ts","../../src/auth/NewUserForm.tsx","../../src/auth/AuthenticationForm.tsx","../../src/auth/ChooseProfileForm.tsx","../../src/auth/ChooseScopeForm.tsx","../../src/constants.ts","../../src/DescriptionList/DescriptionList.tsx","../../src/CodeableConceptDisplay/CodeableConceptDisplay.tsx","../../src/CodingDisplay/CodingDisplay.tsx","../../src/ContactPointDisplay/ContactPointDisplay.tsx","../../src/ContactDetailDisplay/ContactDetailDisplay.tsx","../../src/HumanNameDisplay/HumanNameDisplay.tsx","../../src/IdentifierDisplay/IdentifierDisplay.tsx","../../src/QuantityDisplay/QuantityDisplay.tsx","../../src/RangeDisplay/RangeDisplay.tsx","../../src/RatioDisplay/RatioDisplay.tsx","../../src/MedplumLink/MedplumLink.tsx","../../src/ReferenceDisplay/ReferenceDisplay.tsx","../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx","../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx","../../src/BackboneElementDisplay/BackboneElementDisplay.tsx","../../src/CheckboxFormSection/CheckboxFormSection.tsx","../../src/FormSection/FormSection.tsx","../../src/useResource/useResource.ts","../../src/ResourceForm/ResourceForm.tsx","../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx","../../src/CodeableConceptInput/CodeableConceptInput.tsx","../../src/CodeInput/CodeInput.tsx","../../src/CodingInput/CodingInput.tsx","../../src/ContactPointInput/ContactPointInput.tsx","../../src/ContactDetailInput/ContactDetailInput.tsx","../../src/DateTimeInput/DateTimeInput.tsx","../../src/ExtensionInput/ExtensionInput.tsx","../../src/HumanNameInput/HumanNameInput.tsx","../../src/IdentifierInput/IdentifierInput.tsx","../../src/PeriodInput/PeriodInput.tsx","../../src/QuantityInput/QuantityInput.tsx","../../src/RangeInput/RangeInput.tsx","../../src/RatioInput/RatioInput.tsx","../../src/ResourceAvatar/ResourceAvatar.tsx","../../src/ResourceInput/ResourceInput.tsx","../../src/ReferenceInput/ReferenceInput.tsx","../../src/ResourceArrayInput/ResourceArrayInput.tsx","../../src/TimingInput/TimingInput.tsx","../../src/ResourcePropertyInput/ResourcePropertyInput.tsx","../../src/BackboneElementInput/BackboneElementInput.tsx","../../src/CalendarInput/CalendarInput.tsx","../../src/ResourceName/ResourceName.tsx","../../src/ResourceBadge/ResourceBadge.tsx","../../src/DiagnosticReportDisplay/DiagnosticReportDisplay.tsx","../../src/ResourceDiffTable/ResourceDiffTable.tsx","../../src/ResourceTable/ResourceTable.tsx","../../src/ErrorBoundary/ErrorBoundary.tsx","../../src/Timeline/Timeline.tsx","../../src/utils/date.ts","../../src/ResourceTimeline/ResourceTimeline.tsx","../../src/FhirPathDisplay/FhirPathDisplay.tsx","../../src/SearchControl/SearchUtils.tsx","../../src/SearchFieldEditor/SearchFieldEditor.tsx","../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx","../../src/SearchFilterValueInput/SearchFilterValueInput.tsx","../../src/SearchFilterEditor/SearchFilterEditor.tsx","../../src/SearchFilterValueDialog/SearchFilterValueDialog.tsx","../../src/SearchPopupMenu/SearchPopupMenu.tsx","../../src/SearchControl/SearchControlField.ts","../../src/SearchControl/SearchControl.tsx","../../src/FhirPathTable/FhirPathTable.tsx","../../src/PatientTimeline/PatientTimeline.tsx","../../src/PlanDefinitionBuilder/PlanDefinitionBuilder.tsx","../../src/utils/questionnaire.ts","../../src/QuestionnaireForm/QuestionnaireForm.tsx","../../src/QuestionnaireBuilder/QuestionnaireBuilder.tsx","../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx","../../src/StatusBadge/StatusBadge.tsx","../../src/utils/diff.ts","../../src/utils/blame.ts","../../src/ResourceBlame/ResourceBlame.tsx","../../src/ResourceDiff/ResourceDiff.tsx","../../src/ResourceHistoryTable/ResourceHistoryTable.tsx","../../src/Scheduler/Scheduler.tsx","../../src/DefaultResourceTimeline/DefaultResourceTimeline.tsx","../../src/EncounterTimeline/EncounterTimeline.tsx","../../src/auth/RegisterForm.tsx","../../src/RequestGroupDisplay/RequestGroupDisplay.tsx","../../src/ServiceRequestTimeline/ServiceRequestTimeline.tsx","../../src/auth/SignInForm.tsx"],"sourcesContent":["import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nfunction getLine(address: Address, index: number): string {\n return address && address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport interface AddressInputProps {\n name: string;\n defaultValue?: Address;\n onChange?: (value: Address) => void;\n}\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'billing'): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: 'postal' | 'physical' | 'both'): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"address-use\"\n defaultValue={value?.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'billing')}\n data={['', 'home', 'work', 'temp', 'old', 'billing']}\n />\n <NativeSelect\n data-testid=\"address-type\"\n defaultValue={value?.type}\n onChange={(e) => setType(e.currentTarget.value as 'postal' | 'physical' | 'both')}\n data={['', 'postal', 'physical', 'both']}\n />\n <TextInput\n placeholder=\"Line 1\"\n defaultValue={getLine(value, 0)}\n onChange={(e) => setLine1(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Line 2\"\n defaultValue={getLine(value, 1)}\n onChange={(e) => setLine2(e.currentTarget.value)}\n />\n <TextInput placeholder=\"City\" defaultValue={value.city} onChange={(e) => setCity(e.currentTarget.value)} />\n <TextInput placeholder=\"State\" defaultValue={value.state} onChange={(e) => setState(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Postal Code\"\n defaultValue={value.postalCode}\n onChange={(e) => setPostalCode(e.currentTarget.value)}\n />\n </Group>\n );\n}\n","import { MedplumClient, ProfileResource } from '@medplum/core';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\nconst reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n children: React.ReactNode;\n}\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: false,\n });\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListeneer('change', eventListener);\n }, [medplum, state]);\n\n const medplumContext = {\n ...state,\n medplum,\n };\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * Returns the MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n","import { TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { useMedplumProfile } from '../MedplumProvider/MedplumProvider';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || {});\n\n const valueRef = useRef<Annotation>();\n valueRef.current = value;\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : {};\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <TextInput\n name={props.name}\n placeholder=\"Annotation text\"\n defaultValue={value.text}\n onChange={(e) => setText(e.currentTarget.value)}\n />\n );\n}\n","import { Anchor } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const value = props.value;\n const { contentType, url, title } = value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={value?.title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && !title?.endsWith('.pdf') && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <Anchor href={value?.url} data-testid=\"attachment-details\" target=\"_blank\" rel=\"noopener noreferrer\">\n {value?.title || 'Download'}\n </Anchor>\n </div>\n </div>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values &&\n props.values.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n","/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n","import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useRef } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentButtonProps {\n onUpload: (attachment: Attachment) => void;\n onUploadStart?: () => void;\n onUploadProgress?: (e: ProgressEvent) => void;\n children(props: { onClick(e: React.MouseEvent): void }): React.ReactNode;\n}\n\nexport function AttachmentButton(props: AttachmentButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onClick(e: React.MouseEvent): void {\n killEvent(e);\n fileInputRef.current?.click();\n }\n\n function onFileChange(e: React.ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n *\n * @param {File} file The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n if (props.onUploadStart) {\n props.onUploadStart();\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType, props.onUploadProgress)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((outcome: OperationOutcome) => {\n alert(outcome?.issue?.[0]?.details?.text);\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n {props.children({ onClick })}\n </>\n );\n}\n","import { ActionIcon } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCloudUpload } from '@tabler/icons';\nimport React, { useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td>\n <AttachmentButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n >\n {(props) => (\n <ActionIcon {...props} title=\"Add\" size=\"sm\" color=\"green\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { Button } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return (\n <AttachmentButton onUpload={setValueWrapper}>{(props) => <Button {...props}>Upload...</Button>}</AttachmentButton>\n );\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import { Container as MantineContainer, ContainerProps, createStyles } from '@mantine/core';\nimport React from 'react';\n\nconst useStyles = createStyles(() => ({\n root: {\n '@media (max-width: 800px)': {\n paddingLeft: 4,\n paddingRight: 4,\n },\n },\n}));\n\nexport function Container(props: ContainerProps): JSX.Element {\n const { children, ...others } = props;\n const { classes } = useStyles();\n\n return (\n <MantineContainer className={classes.root} {...others}>\n {children}\n </MantineContainer>\n );\n}\n","import { createStyles, Paper, PaperProps, useComponentDefaultProps } from '@mantine/core';\nimport React from 'react';\n\nexport interface PanelStylesParams {\n width?: number;\n fill?: boolean;\n}\n\nconst useStyles = createStyles((theme, { width, fill }: PanelStylesParams) => ({\n paper: {\n maxWidth: width,\n margin: `${theme.spacing.xl}px auto`,\n padding: fill ? 0 : theme.spacing.md,\n '@media (max-width: 800px)': {\n padding: fill ? 0 : 8,\n },\n '& img': {\n width: '100%',\n maxWidth: '100%',\n },\n '& video': {\n width: '100%',\n maxWidth: '100%',\n },\n },\n}));\n\nexport interface PanelProps extends PaperProps {\n width?: number;\n fill?: boolean;\n}\n\nconst defaultProps: Partial<PanelProps> = {\n shadow: 'xs',\n radius: 'md',\n withBorder: true,\n};\n\nexport function Panel(props: PanelProps): JSX.Element {\n const { className, children, width, fill, unstyled, ...others } = useComponentDefaultProps(\n 'Panel',\n defaultProps,\n props\n );\n const { classes, cx } = useStyles({ width, fill }, { name: 'Panel', unstyled });\n\n return (\n <Paper className={cx(classes.paper, className)} {...others}>\n {children}\n </Paper>\n );\n}\n","import React from 'react';\nimport { Container } from '../Container/Container';\nimport { Panel, PanelProps } from '../Panel/Panel';\n\nexport function Document(props: PanelProps): JSX.Element {\n const { children, ...others } = props;\n return (\n <Container>\n <Panel {...others}>{children}</Panel>\n </Container>\n );\n}\n","/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form The HTML form element.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param el The input element.\n * @param result The result builder.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result The result builder.\n * @param el The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n","import React, { CSSProperties } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: React.ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: React.SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n","import React from 'react';\n\nexport interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill || '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill || '#946af9'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill || '#7857c5'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill || '#40bc26'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill || '#33961e'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n","import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getErrorsForInput(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): string | undefined {\n return outcome?.issue\n ?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression))\n ?.map((issue) => issue.details?.text)\n ?.join('\\n');\n}\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression));\n}\n\nfunction isExpressionMatch(expr1: string | undefined, expr2: string | undefined): boolean {\n // Expression can be either \"fieldName\" or \"resourceType.fieldName\"\n if (expr1 === expr2) {\n return true;\n }\n if (!expr1 || !expr2) {\n return false;\n }\n const dot1 = expr1.indexOf('.');\n if (dot1 >= 0 && expr1.substring(dot1 + 1) === expr2) {\n return true;\n }\n const dot2 = expr2.indexOf('.');\n if (dot2 >= 0 && expr2.substring(dot2 + 1) === expr1) {\n return true;\n }\n return false;\n}\n","import { Anchor, Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n","/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src The JavaScript file URL.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload || null;\n head.appendChild(script);\n}\n","import { GoogleCredentialResponse } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { createScriptTag } from '../utils/script';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { googleClientId, handleGoogleCredential } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState<boolean>(false);\n const [buttonRendered, setButtonRendered] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n\nexport function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = process.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return process.env.GOOGLE_CLIENT_ID;\n }\n\n return undefined;\n}\n","import { createScriptTag } from './script';\n\n/**\n * Dynamically loads the recaptcha script.\n * We do not want to load the script on page load unless the user needs it.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n */\nexport function initRecaptcha(siteKey: string): void {\n if (typeof grecaptcha === 'undefined') {\n createScriptTag('https://www.google.com/recaptcha/api.js?render=' + siteKey);\n }\n}\n\n/**\n * Starts a request to generate a recapcha token.\n * @param siteKey The reCAPTCHA site key, available from the reCAPTCHA admin page.\n * @returns Promise to a recaptcha token for the current user.\n */\nexport function getRecaptcha(siteKey: string): Promise<string> {\n return new Promise((resolve, reject) => {\n grecaptcha.ready(async () => {\n try {\n resolve(await grecaptcha.execute(siteKey, { action: 'submit' }));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n","import {\n Alert,\n Anchor,\n Button,\n Center,\n Checkbox,\n Divider,\n Group,\n PasswordInput,\n Stack,\n Text,\n TextInput,\n} from '@mantine/core';\nimport { GoogleCredentialResponse, LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\nimport { getRecaptcha, initRecaptcha } from '../utils/recaptcha';\n\nexport interface NewUserFormProps {\n readonly projectId: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey: string;\n readonly children?: React.ReactNode;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewUserForm(props: NewUserFormProps): JSX.Element {\n const googleClientId = getGoogleClientId(props.googleClientId);\n const recaptchaSiteKey = props.recaptchaSiteKey;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n useEffect(() => initRecaptcha(recaptchaSiteKey), [recaptchaSiteKey]);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n const recaptchaToken = await getRecaptcha(recaptchaSiteKey);\n props.handleAuthResponse(\n await medplum.startNewUser({\n projectId: props.projectId,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n recaptchaSiteKey,\n recaptchaToken,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>{props.children}</Center>\n {issues && (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </Alert>\n )}\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={async (response: GoogleCredentialResponse) => {\n try {\n await medplum.startPkce();\n props.handleAuthResponse(\n await medplum.startGoogleLogin({\n googleClientId: response.clientId,\n googleCredential: response.credential,\n createUser: true,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"First name\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <TextInput\n name=\"lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Last name\"\n required={true}\n error={getErrorsForInput(outcome, 'lastName')}\n />\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n This site is protected by reCAPTCHA and the Google{' '}\n <Anchor href=\"https://policies.google.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://policies.google.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor> apply.\n </Text>\n </Stack>\n <Group position=\"apart\" mt=\"xl\" noWrap>\n <Checkbox name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Create account</Button>\n </Group>\n </Form>\n );\n}\n","import {\n Alert,\n Anchor,\n Button,\n Center,\n Checkbox,\n Divider,\n Group,\n PasswordInput,\n Stack,\n TextInput,\n} from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly generatePkce?: boolean;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const { generatePkce, onForgotPassword, onRegister, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = getGoogleClientId(props.googleClientId);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n async function startPkce(): Promise<void> {\n if (generatePkce) {\n await medplum.startPkce();\n }\n }\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n startPkce()\n .then(() =>\n medplum.startLogin({\n ...baseLoginRequest,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n )\n .then(handleAuthResponse)\n .catch(setOutcome);\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n {issues && (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </Alert>\n )}\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={(response: GoogleCredentialResponse) => {\n startPkce()\n .then(() =>\n medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest)\n )\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n type=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" sx={{ lineHeight: 1 }} />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n","import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: any) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose profile</Title>\n </Center>\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n","import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: any) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope || 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n","export const DEFAULT_IGNORED_PROPERTIES = [\n 'meta',\n 'implicitRules',\n 'language',\n 'text',\n 'contained',\n 'extension',\n 'modifierExtension',\n];\n","import { createStyles } from '@mantine/core';\nimport React from 'react';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n display: 'grid',\n gridTemplateColumns: '30% 70%',\n margin: 0,\n\n '& > dt, & > dd': {\n padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n margin: 0,\n },\n },\n\n compact: {\n gridTemplateColumns: '20% 80%',\n\n '& > dt, & > dd': {\n padding: `0 ${theme.spacing.xs}px ${theme.spacing.xs}px 0`,\n border: 0,\n },\n },\n}));\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n const { children, compact } = props;\n const { classes, cx } = useStyles();\n return <dl className={cx(classes.root, { [classes.compact]: compact })}>{children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: React.ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n","import { formatCodeableConcept } from '@medplum/core';\nimport { CodeableConcept } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element {\n return <>{formatCodeableConcept(props.value)}</>;\n}\n","import { formatCoding } from '@medplum/core';\nimport { Coding } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{formatCoding(props.value)}</>;\n}\n","import { ContactPoint } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n","import { ContactDetail } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom, index) => (\n <ContactPointDisplay key={'telecom-' + index} value={telecom} />\n ))}\n </>\n );\n}\n","import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n","import { Identifier } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n","import { formatQuantity } from '@medplum/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantity(props.value)}</>;\n}\n","import { formatRange } from '@medplum/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRange(props.value)}</>;\n}\n","import { Ratio } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n &nbsp;/&nbsp;\n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n","import { Anchor, TextProps } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedplumLinkProps extends TextProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useNavigate();\n const { to, suffix, label, onClick, children, ...rest } = props;\n\n let href = getHref(to);\n if (suffix) {\n href += '/' + suffix;\n }\n\n return (\n <Anchor\n href={href}\n aria-label={label}\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n if (onClick) {\n onClick();\n } else if (to) {\n navigate(href);\n }\n }}\n {...rest}\n >\n {children}\n </Anchor>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if ('resourceType' in to) {\n return getResourceHref(to);\n } else if ('reference' in to) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n","import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n","import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n","import {\n buildTypeName,\n formatDateTime,\n formatPeriod,\n formatTiming,\n getTypedPropertyValue,\n PropertyType,\n TypedValue,\n} from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\n\nexport interface ResourcePropertyDisplayProps {\n property?: ElementDefinition;\n propertyType: PropertyType;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n if (property?.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.string:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n case PropertyType.Duration:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementDisplay\n value={{ type: propertyType, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n default:\n if (!property?.path) {\n throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: buildTypeName(property?.path?.split('.') as string[]), value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context The base context (usually a FHIR resource).\n * @param property The property definition.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, PropertyType] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined' as PropertyType];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type as PropertyType];\n }\n\n return [typedResult.value, typedResult.type as PropertyType];\n}\n","import { getPropertyDisplayName, globalSchema, TypedValue } from '@medplum/core';\nimport React from 'react';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n if (\n typeof value === 'object' &&\n 'name' in value &&\n Object.keys(value).length === 1 &&\n typeof value.name === 'string'\n ) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n if (!property.path) {\n property.path = typeName + '.' + key;\n }\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPropertyDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n","import { Group, Input } from '@mantine/core';\nimport React from 'react';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n return (\n <Group noWrap>\n <div>{props.children}</div>\n <div>\n <Input.Wrapper id={props.htmlFor} label={props.title} description={props.description}>\n {(() => null)()}\n </Input.Wrapper>\n </div>\n </Group>\n );\n}\n","import { Input } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n return (\n <Input.Wrapper\n id={props.htmlFor}\n label={props.title}\n description={props.description}\n error={getErrorsForInput(props.outcome, props.htmlFor)}\n >\n {props.children}\n </Input.Wrapper>\n );\n}\n","import { MedplumClient } from '@medplum/core';\nimport { Device, Reference, Resource } from '@medplum/fhirtypes';\nimport { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nconst system: Device = {\n resourceType: 'Device',\n id: 'system',\n deviceName: [\n {\n name: 'System',\n },\n ],\n};\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value The resource or reference to resource.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(value: Reference<T> | T | undefined): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n useEffect(() => {\n let subscribed = true;\n\n if (!resource && value && 'reference' in value && value.reference) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResource(r);\n }\n })\n .catch(() => setResource(undefined));\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to system, returns the system resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum The medplum client.\n * @param value The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | T | undefined\n): T | undefined {\n if (!value) {\n return undefined;\n }\n\n if ('resourceType' in value) {\n return value;\n }\n\n if ('reference' in value) {\n if (value.reference === 'system') {\n return system as T;\n }\n\n return medplum.getCachedReference(value);\n }\n\n return undefined;\n}\n","import { Button, Group, Stack, TextInput } from '@mantine/core';\nimport { capitalize, IndexedStructureDefinition } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceFormProps {\n defaultValue: Resource | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Resource | undefined>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(JSON.parse(JSON.stringify(defaultValue)));\n medplum.requestSchema(defaultValue.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, defaultValue]);\n\n if (!schema || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: React.FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <Stack mb=\"xl\">\n <FormSection title=\"Resource Type\" htmlFor=\"resourceType\" outcome={props.outcome}>\n <TextInput name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\" htmlFor=\"id\" outcome={props.outcome}>\n <TextInput name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n </Stack>\n <BackboneElementInput\n typeName={value.resourceType}\n defaultValue={value}\n outcome={props.outcome}\n onChange={setValue}\n />\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">OK</Button>\n {props.onDelete && (\n <Button\n variant=\"outline\"\n color=\"red\"\n type=\"button\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </Group>\n </form>\n );\n}\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: ElementDefinition,\n value: any\n): any {\n const types = elementDefinition.type as ElementDefinitionType[];\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n","import { MultiSelect } from '@mantine/core';\nimport { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ValueSetAutocompleteProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: ValueSetExpansionContains;\n onChange?: (value: ValueSetExpansionContains | undefined) => void;\n}\n\ninterface ValueSetAutocompleteItem {\n value: string;\n label: string;\n element: ValueSetExpansionContains;\n}\n\nfunction valueSetElementToAutocompleteItem(element: ValueSetExpansionContains): ValueSetAutocompleteItem {\n return {\n value: element.code as string,\n label: getDisplay(element),\n element,\n };\n}\n\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { property, defaultValue } = props;\n const [textValues, setTextValues] = useState<string[]>(defaultValue?.code ? [defaultValue.code as string] : []);\n\n const [data, setData] = useState<ValueSetAutocompleteItem[]>(\n defaultValue?.code ? [valueSetElementToAutocompleteItem(defaultValue)] : []\n );\n\n const dataRef = useRef<ValueSetAutocompleteItem[]>();\n dataRef.current = data;\n\n const loadValues = useCallback(\n async (input: string): Promise<void> => {\n const system = property.binding?.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input);\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData = [...(dataRef.current as ValueSetAutocompleteItem[])];\n\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.value === valueSetElement.code)) {\n newData.push(valueSetElementToAutocompleteItem(valueSetElement));\n }\n }\n\n setData(newData);\n },\n [medplum, property, dataRef]\n );\n\n function handleChange(values: string[]): void {\n setTextValues(values);\n\n const textValue = values[0];\n let currentItem = undefined;\n if (textValue) {\n currentItem = (dataRef.current as ValueSetAutocompleteItem[]).find((item) => item.value === values[0]);\n if (!currentItem) {\n const newElement = { code: textValue, display: textValue };\n currentItem = valueSetElementToAutocompleteItem(newElement);\n setData([...(dataRef.current as ValueSetAutocompleteItem[]), currentItem]);\n }\n }\n\n if (props.onChange) {\n props.onChange(currentItem?.element);\n }\n }\n\n useEffect(() => {\n loadValues('').catch(console.log);\n }, [loadValues]);\n\n return (\n <MultiSelect\n data={data}\n placeholder={props.placeholder}\n searchable\n creatable\n clearable\n value={textValues}\n filter={(value: string, selected: boolean, item: ValueSetAutocompleteItem) =>\n !!(\n textValues.length === 0 &&\n !selected &&\n (item.element.display?.toLowerCase().includes(value.toLowerCase().trim()) ||\n item.element.code?.toLowerCase().includes(value.toLowerCase().trim()))\n )\n }\n onChange={handleChange}\n getCreateLabel={(query) => `+ Create ${query}`}\n onCreate={(query) => valueSetElementToAutocompleteItem({ code: query, display: query })}\n />\n );\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n return item.display || item.code || '';\n}\n","import { CodeableConcept, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeableConceptInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept | undefined) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const [value, setValue] = useState<CodeableConcept | undefined>(props.defaultValue);\n\n function handleChange(newValue: ValueSetExpansionContains | undefined): void {\n const newConcept = newValue && valueSetElementToCodeableConcept(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n property={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codeableConceptToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeableConceptToValueSetElement(concept: CodeableConcept): ValueSetExpansionContains {\n return {\n system: concept.coding?.[0]?.system,\n code: concept.coding?.[0]?.code,\n display: concept.coding?.[0]?.display,\n };\n}\n\nfunction valueSetElementToCodeableConcept(element: ValueSetExpansionContains): CodeableConcept {\n return {\n text: element.display,\n coding: [\n {\n system: element.system,\n code: element.code,\n display: element.display,\n },\n ],\n };\n}\n","import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const [value, setValue] = useState<string | undefined>(props.defaultValue);\n\n function handleChange(newValue: ValueSetExpansionContains | undefined): void {\n const newCode = valueSetElementToCode(newValue);\n setValue(newCode);\n if (props.onChange) {\n props.onChange(newCode);\n }\n }\n\n return (\n <ValueSetAutocomplete\n property={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={codeToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeToValueSetElement(code: string | undefined): ValueSetExpansionContains | undefined {\n return code ? { code } : undefined;\n}\n\nfunction valueSetElementToCode(element: ValueSetExpansionContains | undefined): string | undefined {\n return element?.code;\n}\n","import { Coding, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: Coding;\n onChange?: (value: Coding | undefined) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const [value, setValue] = useState<Coding | undefined>(props.defaultValue);\n\n function handleChange(newValue: ValueSetExpansionContains | undefined): void {\n const newConcept = newValue && valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n property={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codingToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"system\"\n defaultValue={contactPoint?.system}\n onChange={(e) =>\n setSystem(e.currentTarget.value as 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other')\n }\n data={['', 'email', 'phone', 'fax', 'pager', 'sms', 'other']}\n />\n <NativeSelect\n data-testid=\"use\"\n defaultValue={contactPoint?.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'mobile')}\n data={['', 'home', 'work', 'temp', 'old', 'mobile']}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={contactPoint?.value}\n onChange={(e) => setValue(e.currentTarget.value)}\n />\n </Group>\n );\n}\n","import { Group, TextInput } from '@mantine/core';\nimport { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n data-testid={props.name + '-name'}\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={(e) => setName(e.currentTarget.value)}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </Group>\n );\n}\n","import { TextInput } from '@mantine/core';\nimport { isValidDate } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface DateTimeInputProps {\n name?: string;\n placeholder?: string;\n defaultValue?: string;\n outcome?: OperationOutcome;\n onChange?: (value: string) => void;\n}\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: DateTimeInputProps): JSX.Element {\n return (\n <TextInput\n id={props.name}\n name={props.name}\n data-testid={props.name}\n placeholder={props.placeholder}\n type={getInputType()}\n defaultValue={convertIsoToLocal(props.defaultValue)}\n error={getErrorsForInput(props.outcome, props.name)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n const newValue = e.currentTarget.value;\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n */\nfunction getInputType(): string {\n return process.env.NODE_ENV === 'test' ? 'text' : 'datetime-local';\n}\n","import { JsonInput } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <JsonInput\n id={props.name}\n name={props.name}\n data-testid=\"extension-input\"\n defaultValue={stringify(props.defaultValue)}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface HumanNameInputProps {\n name: string;\n defaultValue?: HumanName;\n onChange?: (value: HumanName) => void;\n}\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n const valueRef = useRef<HumanName>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden' | undefined): void {\n setValueWrapper({ ...valueRef.current, use: use ? use : undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...valueRef.current,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...valueRef.current,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...valueRef.current,\n family: family ? family : undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...valueRef.current,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n defaultValue={value?.use}\n data-testid=\"use\"\n onChange={(e) =>\n setUse(e.currentTarget.value as 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden')\n }\n data={['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden']}\n />\n <TextInput\n placeholder=\"Prefix\"\n defaultValue={value?.prefix?.join(' ')}\n onChange={(e) => setPrefix(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Given\"\n defaultValue={value?.given?.join(' ')}\n onChange={(e) => setGiven(e.currentTarget.value)}\n />\n <TextInput placeholder=\"Family\" defaultValue={value?.family} onChange={(e) => setFamily(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Suffix\"\n defaultValue={value?.suffix?.join(' ')}\n onChange={(e) => setSuffix(e.currentTarget.value)}\n />\n </Group>\n );\n}\n","import { Group, TextInput } from '@mantine/core';\nimport { Identifier } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\n\nexport interface IdentifierInputProps {\n name: string;\n defaultValue?: Identifier;\n onChange?: (value: Identifier) => void;\n}\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n placeholder=\"System\"\n defaultValue={value?.system}\n onChange={(e) => setValueWrapper({ ...value, system: e.currentTarget.value })}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={value?.value}\n onChange={(e) => setValueWrapper({ ...value, value: e.currentTarget.value })}\n />\n </Group>\n );\n}\n","import { Group } from '@mantine/core';\nimport { Period } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <DateTimeInput\n name={props.name + '.start'}\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <DateTimeInput\n name={props.name + '.end'}\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </Group>\n );\n}\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n onChange?: (value: Quantity) => void;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: 80 }}\n data-testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n data={['', '<', '<=', '>=', '>']}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n comparator: e.currentTarget.value as '<' | '<=' | '>=' | '>',\n })\n }\n />\n <TextInput\n id={props.name}\n name={props.name}\n data-testid={props.name + '-value'}\n type=\"number\"\n step=\"any\"\n placeholder=\"Value\"\n defaultValue={value?.value?.toString()}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n value: tryParseNumber(e.currentTarget.value),\n })\n }\n />\n <TextInput\n placeholder=\"Unit\"\n data-testid={props.name + '-unit'}\n defaultValue={value?.unit}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n unit: e.currentTarget.value,\n })\n }\n />\n </Group>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n","import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n","import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n","import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n","import { Autocomplete, AutocompleteItem, Group, Loader, Text } from '@mantine/core';\nimport { getDisplayString } from '@medplum/core';\nimport { Patient, Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { forwardRef, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { useResource } from '../useResource/useResource';\n\n/**\n * Defines which search parameters will be used by the type ahead to search for each resourceType\n */\nconst SEARCH_CODES: Record<string, string> = {\n Schedule: '_id',\n Task: '_id',\n Patient: 'name',\n Practitioner: 'name',\n Questionnaire: 'name',\n ServiceRequest: '_id',\n DiagnosticReport: '_id',\n Specimen: '_id',\n Observation: 'code',\n RequestGroup: '_id',\n ActivityDefinition: 'name',\n User: 'email',\n};\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: ResourceType;\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [value, setValue] = useState<string>(defaultValue ? getDisplayString(defaultValue) : '');\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AutocompleteItem[]>([]);\n\n useEffect(() => {\n if (defaultValue) {\n setValue(getDisplayString(defaultValue));\n }\n }, [defaultValue, setValue]);\n\n async function loadValues(input: string): Promise<void> {\n setLoading(true);\n const searchCode = SEARCH_CODES[props.resourceType] || 'name';\n const searchParams = new URLSearchParams({\n [searchCode]: encodeURIComponent(input),\n _count: '10',\n });\n\n const resources = await medplum.searchResources(props.resourceType, searchParams);\n setData(resources.map((resource) => ({ value: getDisplayString(resource), resource })));\n setLoading(false);\n }\n\n async function handleChange(val: string): Promise<void> {\n setValue(val);\n return loadValues(val);\n }\n\n function handleSelect(item: AutocompleteItem): void {\n setValue(item.value);\n setData([]);\n if (props.onChange) {\n props.onChange(item.resource);\n }\n }\n\n return (\n <Autocomplete\n itemComponent={ItemComponent}\n value={value}\n data={data}\n placeholder={props.placeholder}\n onFocus={() => loadValues(value)}\n onChange={handleChange}\n onItemSubmit={handleSelect}\n rightSection={loading ? <Loader size={16} /> : null}\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(({ value, resource, ...others }: any, ref) => {\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{value}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {(resource as Patient).birthDate}\n </Text>\n </div>\n </Group>\n </div>\n );\n});\n","import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = props.targetTypes;\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes ? (\n <NativeSelect\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n data={targetTypes}\n />\n ) : (\n <TextInput\n data-testid=\"reference-input-resource-type-input\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n />\n )}\n <ResourceInput\n resourceType={resourceType as ResourceType}\n name={props.name + '-id'}\n placeholder={props.placeholder}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </Group>\n );\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n","import { ActionIcon } from '@mantine/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport React, { useRef, useState } from 'react';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(\n props.defaultValue && Array.isArray(props.defaultValue) ? props.defaultValue : []\n );\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Add\"\n size=\"sm\"\n color=\"green\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { Button, Checkbox, Group, Modal, NativeSelect, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo' | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDayOfWeek(day: DayOfWeek, enabled: boolean): void {\n if (enabled) {\n addDayOfWeek(day);\n } else {\n removeDayOfWeek(day);\n }\n }\n\n function addDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (!existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });\n }\n }\n\n function removeDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });\n }\n }\n\n return (\n <Modal title=\"Timing\" closeButtonLabel=\"Close\" opened={props.visible} onClose={() => props.onCancel()}>\n <div style={{ padding: '5px 20px', textAlign: 'left' }}>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value?.repeat?.period}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value))}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value?.repeat?.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as 'a' | 'd' | 'wk' | 'mo' | undefined)}\n data={[\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n <FormSection title=\"Repeat on\">\n <Group spacing=\"xs\" grow noWrap>\n {daysOfWeek.map((day) => (\n <React.Fragment key={day}>\n <label htmlFor={'timing-dialog-repeat-' + day}>{day.charAt(0).toUpperCase()}</label>\n <Checkbox\n id={'timing-dialog-repeat-' + day}\n name={'timing-dialog-repeat-' + day}\n onChange={(e) => setDayOfWeek(day as DayOfWeek, e.currentTarget.checked)}\n />\n </React.Fragment>\n ))}\n </Group>\n </FormSection>\n </div>\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Modal>\n );\n}\n","import { Checkbox, Group, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport { buildTypeName, capitalize, PropertyType } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AddressInput } from '../AddressInput/AddressInput';\nimport { AnnotationInput } from '../AnnotationInput/AnnotationInput';\nimport { AttachmentArrayInput } from '../AttachmentArrayInput/AttachmentArrayInput';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { CodingInput } from '../CodingInput/CodingInput';\nimport { ContactDetailInput } from '../ContactDetailInput/ContactDetailInput';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { ExtensionInput } from '../ExtensionInput/ExtensionInput';\nimport { HumanNameInput } from '../HumanNameInput/HumanNameInput';\nimport { IdentifierInput } from '../IdentifierInput/IdentifierInput';\nimport { PeriodInput } from '../PeriodInput/PeriodInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { RatioInput } from '../RatioInput/RatioInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourceArrayInput } from '../ResourceArrayInput/ResourceArrayInput';\nimport { TimingInput } from '../TimingInput/TimingInput';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface ResourcePropertyInputProps {\n property: ElementDefinition;\n name: string;\n defaultPropertyType?: PropertyType;\n defaultValue?: any;\n arrayElement?: boolean;\n onChange?: (value: any, propName?: string) => void;\n outcome?: OperationOutcome;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.defaultPropertyType ?? (property.type?.[0]?.code as PropertyType);\n const name = props.name;\n const value = props.defaultValue;\n\n if (property.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayInput name={name} defaultValue={value} onChange={props.onChange} />;\n }\n return <ResourceArrayInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n }\n\n const propertyTypes = property.type as ElementDefinitionType[];\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return <ElementDefinitionTypeInput elementDefinitionType={propertyTypes[0]} {...props} />;\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: '200px' }}\n defaultValue={selectedType?.code}\n onChange={(e) => {\n setSelectedType(\n propertyTypes.find(\n (type: ElementDefinitionType) => type.code === e.currentTarget.value\n ) as ElementDefinitionType\n );\n }}\n data={propertyTypes.map((type: ElementDefinitionType) => ({\n value: type.code as string,\n label: type.code as string,\n }))}\n />\n <ElementDefinitionTypeInput\n {...props}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n />\n </Group>\n );\n}\n\nexport interface ElementDefinitionTypeInputProps extends ResourcePropertyInputProps {\n elementDefinitionType: ElementDefinitionType;\n}\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.elementDefinitionType.code as PropertyType;\n const name = props.name;\n const value = props.defaultValue;\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n return (\n <TextInput\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeInput name={name} defaultValue={value} onChange={props.onChange} outcome={props.outcome} />;\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <TextInput\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : '1'}\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.valueAsNumber);\n }\n }}\n />\n );\n case PropertyType.code:\n return <CodeInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n data-testid={name}\n defaultChecked={!!value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n case PropertyType.markdown:\n return (\n <Textarea\n id={name}\n name={name}\n data-testid={name}\n defaultValue={value}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Annotation:\n return <AnnotationInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Attachment:\n return <AttachmentInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Coding:\n return <CodingInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Extension:\n return <ExtensionInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.HumanName:\n return <HumanNameInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Identifier:\n return <IdentifierInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Period:\n return <PeriodInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Duration:\n case PropertyType.Quantity:\n return <QuantityInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Range:\n return <RangeInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Ratio:\n return <RatioInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={value}\n targetTypes={getTargetTypes(property)}\n onChange={props.onChange}\n />\n );\n case PropertyType.Timing:\n return <TimingInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementInput\n typeName={propertyType}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n default:\n return (\n <BackboneElementInput\n typeName={buildTypeName(property.path?.split('.') as string[])}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n }\n}\n\nfunction getTargetTypes(property?: ElementDefinition): string[] | undefined {\n return property?.type?.[0]?.targetProfile?.map((p) => p.split('/').pop() as string);\n}\n","import { Stack } from '@mantine/core';\nimport { getPropertyDisplayName, globalSchema } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { FormSection } from '../FormSection/FormSection';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\n\nexport interface BackboneElementInputProps {\n typeName: string;\n defaultValue?: any;\n outcome?: OperationOutcome;\n onChange?: (value: any) => void;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n const typeName = props.typeName;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n const typedValue = { type: typeName, value };\n\n return (\n <Stack>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n if (!property.type) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n\n if (property.type.length === 1 && property.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n outcome={props.outcome}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n","import { Button, createStyles, Group } from '@mantine/core';\nimport { Slot } from '@medplum/fhirtypes';\nimport React, { useMemo, useState } from 'react';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n width: 350,\n\n '& th': {\n fontWeight: 'normal',\n fontSize: 11,\n padding: 8,\n textAlign: 'center',\n },\n\n '& td': {\n padding: '2px 4px',\n },\n\n '& td button': {\n width: 44,\n height: 44,\n color: theme.colors[theme.primaryColor][5],\n fontSize: 16,\n fontWeight: 500,\n textAlign: 'center',\n padding: 0,\n backgroundColor: theme.colors[theme.primaryColor][0],\n border: 0,\n borderRadius: '50%',\n cursor: 'pointer',\n },\n\n '& td button:hover': {\n backgroundColor: theme.colors[theme.primaryColor][1],\n },\n\n '& td button:disabled': {\n backgroundColor: 'transparent',\n cursor: 'default',\n color: theme.colors.gray[4],\n fontWeight: 'normal',\n },\n },\n}));\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onChangeMonth: (date: Date) => void;\n onClick: (date: Date) => void;\n}\n\n/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const { classes } = useStyles();\n const { onChangeMonth, onClick } = props;\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const newMonth = new Date(currMonth.getTime());\n newMonth.setMonth(currMonth.getMonth() + delta);\n onChangeMonth(newMonth);\n return newMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <Group position=\"apart\" spacing=\"xs\" grow noWrap>\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <Group position=\"right\" spacing=\"xs\">\n <Button variant=\"outline\" aria-label=\"Previous month\" onClick={() => moveMonth(-1)}>\n &lt;\n </Button>\n <Button variant=\"outline\" aria-label=\"Next month\" onClick={() => moveMonth(1)}>\n &gt;\n </Button>\n </Group>\n </Group>\n <table className={classes.table}>\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <Button disabled={!day.available} onClick={() => onClick(day.date)}>\n {day.date.getDate()}\n </Button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day The day to check.\n * @param slots The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n","import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const { value, link, ...rest } = props;\n const resource = useResource(value);\n if (!resource) {\n return null;\n }\n\n const text = getDisplayString(resource);\n\n return link ? (\n <MedplumLink to={resource} {...rest}>\n {text}\n </MedplumLink>\n ) : (\n <Text component=\"span\" {...rest}>\n {text}\n </Text>\n );\n}\n","import { Group } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <Group spacing=\"xs\">\n <ResourceAvatar size={24} radius={12} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </Group>\n );\n}\n","import { createStyles, Group, Stack, Text, Title } from '@mantine/core';\nimport { capitalize, formatDateTime, formatObservationValue } from '@medplum/core';\nimport {\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n borderCollapse: 'collapse',\n\n '& td, & th': {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n padding: 4,\n },\n },\n\n criticalRow: {\n background: theme.colorScheme === 'dark' ? theme.colors.red[7] : theme.colors.red[1],\n border: `0.1px solid ${theme.colors.red[5]}`,\n color: theme.colors.red[5],\n fontWeight: 500,\n\n '& td': {\n border: `0.1px solid ${theme.colors.red[5]}`,\n },\n },\n}));\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n}\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const diagnosticReport = useResource(props.value);\n const specimen = useResource(diagnosticReport?.specimen?.[0]);\n if (!diagnosticReport) {\n return null;\n }\n\n let textContent = '';\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n textContent = window.atob(pf.data);\n }\n }\n\n if (specimen?.note) {\n for (const note of specimen.note) {\n textContent += note.text + '\\n\\n';\n }\n }\n\n return (\n <Stack>\n <Title>Diagnostic Report</Title>\n <Group mt=\"md\" spacing={30}>\n {diagnosticReport.subject && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Subject\n </Text>\n <Text>\n <ResourceBadge value={diagnosticReport.subject} link={true} />\n </Text>\n </div>\n )}\n {diagnosticReport.resultsInterpreter &&\n diagnosticReport.resultsInterpreter.map((interpreter) => (\n <div key={interpreter.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Interpreter\n </Text>\n <Text>\n <ResourceBadge value={interpreter} link={true} />\n </Text>\n </div>\n ))}\n {diagnosticReport.issued && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Issued\n </Text>\n <Text>{formatDateTime(diagnosticReport.issued)}</Text>\n </div>\n )}\n {diagnosticReport.status && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Status\n </Text>\n <Text>{capitalize(diagnosticReport.status)}</Text>\n </div>\n )}\n </Group>\n {diagnosticReport.result && <ObservationTable value={diagnosticReport.result} />}\n {textContent && <pre>{textContent.trim()}</pre>}\n </Stack>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n const { classes } = useStyles();\n return (\n <table className={classes.table}>\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation, index) => (\n <ObservationRow key={'obs-' + index} value={observation} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const { classes, cx } = useStyles();\n const observation = useResource(props.value);\n if (!observation) {\n return null;\n }\n\n const critical = isCritical(observation);\n\n return (\n <tr className={cx({ [classes.criticalRow]: critical })}>\n <td>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n </tr>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n return <>{formatObservationValue(obs)}</>;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n if (range.text) {\n return <>{range.text}</>;\n }\n return <RangeDisplay value={range} />;\n}\n\n/**\n * Returns true if the observation is critical.\n * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html\n * @param observation The FHIR observation.\n * @returns True if the FHIR observation is a critical value.\n */\nfunction isCritical(observation: Observation): boolean {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n return code === 'AA' || code === 'LL' || code === 'HH' || code === 'A';\n}\n","import { createStyles } from '@mantine/core';\nimport { getPropertyDisplayName, IndexedStructureDefinition, stringify, toTypedValue } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n borderCollapse: 'collapse',\n width: '100%',\n\n '& tr': {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n '& th, & td': {\n padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,\n verticalAlign: 'top',\n },\n },\n\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n medplum.requestSchema(props.original.resourceType).then(setSchema).catch(console.log);\n }, [medplum, props.original.resourceType]);\n\n if (!schema) {\n return null;\n }\n\n const typeSchema = schema.types[props.original.resourceType];\n if (!typeSchema) {\n return null;\n }\n\n return (\n <table className={classes.root}>\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '35%' }} />\n <col style={{ width: '35%' }} />\n </colgroup>\n <thead>\n <tr>\n <th>Property</th>\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || key === 'meta') {\n return null;\n }\n\n const property = entry[1];\n const [originalPropertyValue, originalPropertyType] = getValueAndType(toTypedValue(props.original), key);\n const [revisedPropertyValue, revisedPropertyType] = getValueAndType(toTypedValue(props.revised), key);\n if (isEmpty(originalPropertyValue) && isEmpty(revisedPropertyValue)) {\n return null;\n }\n\n if (stringify(originalPropertyValue) === stringify(revisedPropertyValue)) {\n return null;\n }\n\n return (\n <tr key={key}>\n <td>{getPropertyDisplayName(key)}</td>\n <td className={classes.removed}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalPropertyType}\n value={originalPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n <td className={classes.added}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedPropertyType}\n value={revisedPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n !value ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n );\n}\n","import { IndexedStructureDefinition } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceTableProps {\n value: Resource | Reference;\n ignoreMissingValues?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n if (value) {\n medplum.requestSchema(value.resourceType).then(setSchema).catch(console.log);\n }\n }, [medplum, value]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{ type: value.resourceType, value }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n","import { Alert } from '@mantine/core';\nimport { normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Something went wrong\" color=\"red\">\n {normalizeErrorString(this.state.error)}\n </Alert>\n );\n }\n\n return this.props.children;\n }\n}\n","import { ActionIcon, Group, Menu, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { IconDots } from '@tabler/icons';\nimport React from 'react';\nimport { Container } from '../Container/Container';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { Panel, PanelProps } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface TimelineProps {\n children?: React.ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <Container>{props.children}</Container>;\n}\n\nexport interface TimelineItemProps extends PanelProps {\n resource: Resource;\n profile?: Reference;\n padding?: boolean;\n popupMenuItems?: React.ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const { resource, profile, padding, popupMenuItems, ...others } = props;\n const author = profile ?? resource.meta?.author;\n\n return (\n <Panel data-testid=\"timeline-item\" fill={true} {...others}>\n <Group position=\"apart\" spacing={8} mx=\"xs\" my=\"sm\">\n <ResourceAvatar value={author} link={true} size=\"md\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\">\n <ResourceName color=\"dark\" weight={500} value={author} link={true} />\n </Text>\n <Text size=\"xs\">\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {formatDateTime(props.resource.meta?.lastUpdated)}\n </MedplumLink>\n <Text component=\"span\" color=\"dimmed\" mx={8}>\n &middot;\n </Text>\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {props.resource.resourceType}\n </MedplumLink>\n </Text>\n </div>\n {popupMenuItems && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={200}>\n <Menu.Target>\n <ActionIcon radius=\"xl\" aria-label={`Actions for ${getReferenceString(props.resource)}`}>\n <IconDots />\n </ActionIcon>\n </Menu.Target>\n {popupMenuItems}\n </Menu>\n )}\n </Group>\n <ErrorBoundary>\n {padding && <div style={{ padding: '0 16px 16px 16px' }}>{props.children}</div>}\n {!padding && <>{props.children}</>}\n </ErrorBoundary>\n </Panel>\n );\n}\n","import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources Array of resources.\n */\nexport function sortByDateAndPriority(resources: Resource[]): void {\n resources.sort(resourceDateComparator);\n}\n\nfunction resourceDateComparator(a: Resource, b: Resource): number {\n const priority1 = getPriorityScore(a);\n const priority2 = getPriorityScore(b);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a) - getTime(b);\n}\n\nfunction getPriorityScore(resource: Resource): number {\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] || 0;\n }\n return 0;\n}\n\nfunction getTime(resource: Resource): number {\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n","import { ActionIcon, Center, createStyles, Group, Loader, Menu, ScrollArea, TextInput } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { getReferenceString, normalizeErrorString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n Reference,\n Resource,\n} from '@medplum/fhirtypes';\nimport {\n IconCheck,\n IconCloudUpload,\n IconEdit,\n IconFileAlert,\n IconListDetails,\n IconMessage,\n IconPin,\n IconPinnedOff,\n IconTrash,\n} from '@tabler/icons';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { DiagnosticReportDisplay } from '../DiagnosticReportDisplay/DiagnosticReportDisplay';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { Panel } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceDiffTable } from '../ResourceDiffTable/ResourceDiffTable';\nimport { ResourceTable } from '../ResourceTable/ResourceTable';\nimport { Timeline, TimelineItem } from '../Timeline/Timeline';\nimport { useResource } from '../useResource/useResource';\nimport { sortByDateAndPriority } from '../utils/date';\n\nconst useStyles = createStyles((theme) => ({\n pinnedComment: {\n backgroundColor: theme.colors.blue[0],\n },\n}));\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n buildSearchRequests: (resource: T) => Bundle;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const navigate = useNavigate();\n const medplum = useMedplum();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const buildSearchRequests = props.buildSearchRequests;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n const loadTimeline = useCallback(() => {\n if (!resource) {\n setItems([]);\n setHistory({} as Bundle);\n return;\n }\n medplum.executeBatch(buildSearchRequests(resource)).then(handleBatchResponse).catch(console.log);\n }, [medplum, resource, buildSearchRequests]);\n\n useEffect(() => {\n loadTimeline();\n }, [loadTimeline]);\n\n /**\n * Handles a batch request response.\n * @param batchResponse The batch response.\n */\n function handleBatchResponse(batchResponse: Bundle): void {\n const newItems = [];\n\n if (batchResponse.entry) {\n for (const batchEntry of batchResponse.entry) {\n const bundle = batchEntry.resource as Bundle;\n if (!bundle) {\n // User may not have access to all resource types\n continue;\n }\n\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n if (entry.resource) {\n newItems.push(entry.resource);\n }\n }\n }\n }\n\n sortByDateAndPriority(newItems);\n newItems.reverse();\n }\n\n setItems(newItems);\n }\n\n /**\n * Adds an array of resources to the timeline.\n * @param resources Array of resources.\n */\n function addResources(resources: Resource[]): void {\n const newItems = [...itemsRef.current, ...resources];\n sortByDateAndPriority(newItems);\n newItems.reverse();\n setItems(newItems);\n }\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createCommunication(resource, sender, contentString))\n .then((result) => {\n addResources([result]);\n })\n .catch(console.log);\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createMedia(resource, sender, attachment))\n .then((result) => addResources([result]))\n .then(() =>\n updateNotification({\n id: 'upload-notification',\n color: 'teal',\n title: 'Upload complete',\n message: '',\n icon: <IconCheck size={16} />,\n autoClose: 2000,\n })\n )\n .catch((reason) =>\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(reason),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n })\n );\n }\n\n function setPriority(\n communication: Communication,\n priority: 'routine' | 'urgent' | 'asap' | 'stat'\n ): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline).catch(console.log);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline).catch(console.log);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n function onUploadStart(): void {\n showNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Initializing upload...',\n message: 'Please wait...',\n autoClose: false,\n disallowClose: true,\n });\n }\n\n function onUploadProgress(e: ProgressEvent): void {\n updateNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Uploading...',\n message: getProgressMessage(e),\n autoClose: false,\n disallowClose: true,\n });\n }\n\n if (!resource) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <Panel>\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Group spacing=\"xs\" noWrap style={{ width: '100%' }}>\n <ResourceAvatar value={sender} />\n <TextInput\n name=\"text\"\n ref={inputRef}\n placeholder=\"Add comment\"\n style={{ width: '100%', maxWidth: 300 }}\n />\n <ActionIcon type=\"submit\" radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconMessage size={16} />\n </ActionIcon>\n <AttachmentButton\n onUpload={createMedia}\n onUploadStart={onUploadStart}\n onUploadProgress={onUploadProgress}\n >\n {(props) => (\n <ActionIcon {...props} radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </Group>\n </Form>\n </Panel>\n )}\n {items.map((item) => {\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem\n key={item.meta?.versionId}\n history={history as Bundle<Resource>}\n resource={item}\n onDetails={onVersionDetails}\n />\n );\n }\n const key = `${item.resourceType}/${item.id}`;\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <Menu.Dropdown>\n <Menu.Label>Resource</Menu.Label>\n {props.onPin && (\n <Menu.Item\n icon={<IconPin size={14} />}\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n aria-label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </Menu.Item>\n )}\n {props.onUnpin && (\n <Menu.Item\n icon={<IconPinnedOff size={14} />}\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n aria-label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </Menu.Item>\n )}\n {props.onDetails && (\n <Menu.Item\n icon={<IconListDetails size={14} />}\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n aria-label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </Menu.Item>\n )}\n {props.onEdit && (\n <Menu.Item\n icon={<IconEdit size={14} />}\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n aria-label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </Menu.Item>\n )}\n {props.onDelete && (\n <>\n <Menu.Divider />\n <Menu.Label>Danger zone</Menu.Label>\n <Menu.Item\n color=\"red\"\n icon={<IconTrash size={14} />}\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n aria-label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const { classes } = useStyles();\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? undefined : classes.pinnedComment;\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ScrollArea>\n <pre>{props.resource.outcomeDesc}</pre>\n </ScrollArea>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n\nfunction getProgressMessage(e: ProgressEvent): string {\n if (e.lengthComputable) {\n const percent = (100 * e.loaded) / e.total;\n return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;\n }\n return `Uploaded: ${formatFileSize(e.loaded)}`;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes == 0) {\n return '0.00 B';\n }\n const e = Math.floor(Math.log(bytes) / Math.log(1024));\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\n}\n","import { evalFhirPath, PropertyType } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: PropertyType;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n","import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n Operator,\n PropertyType,\n SearchRequest,\n} from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n};\n\n/**\n * Sets the array of filters.\n *\n * @param {Array} filters The new filters.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n *\n * @param {string} code The field key name to clear filters.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters || []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The operation key name.\n * @param {?string} value The filter value.\n * @param {boolean=} opt_clear Optional flag to clear filters on the field.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value || '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n *\n * @param {string} field The field key name.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields && definition.fields.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n *\n * @param {number} index The filter index.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n *\n * @param {string} field The field key name.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n *\n * @param {string} field The field key name.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n *\n * @param {string} field The field key name.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of days from this day.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n *\n * @param {string} field The field key name.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n *\n * @param {string} field The field key name.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n *\n * @param {string} field The field key name.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of months from this month.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n *\n * @param {string} field The field key name.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n *\n * @param {string} field The field key name.\n * @param {Date} d1 The start date.\n * @param {Date} d2 The end date.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n *\n * @param {string} field The field key name.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n *\n * @param {number} offset The offset number.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition The search definition.\n * @param page The new page number\n * @return The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n *\n * @param {string} sortField The sort key.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n *\n * @param {string} key The field key name.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n *\n * @param {string} op The operation code.\n * @return {string} A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param key The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0], field.elementDefinition);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') || '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @param elementDefinition Optional element definition.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(\n resource: Resource,\n searchParam: SearchParameter,\n elementDefinition: ElementDefinition | undefined\n): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n if (elementDefinition) {\n return (\n <ResourcePropertyDisplay\n propertyType={value[0].type as PropertyType}\n value={value[0].value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n }\n\n return (\n <>\n {value.map((v, index) => (\n <span key={`${index}-${value.length}`}>\n {typeof v === 'object' ? JSON.stringify(v) : (v as string | number)}\n </span>\n ))}\n </>\n );\n}\n","import { Button, Modal } from '@mantine/core';\nimport { globalSchema, SearchRequest, stringify, TypeSchema } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { buildFieldNameString } from '../SearchControl/SearchUtils';\n\ninterface SearchFieldEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFieldEditor(props: SearchFieldEditorProps): JSX.Element | null {\n const [state, setState] = useState({\n search: JSON.parse(stringify(props.search)) as SearchRequest,\n });\n\n const availableRef = useRef<HTMLSelectElement>(null);\n const selectedRef = useRef<HTMLSelectElement>(null);\n\n useEffect(() => {\n setState({ search: props.search });\n }, [props.search]);\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n *\n * @param {KeyboardEvent} e The keyboard event.\n */\n function handleAvailableKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onAddField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleAvailableDoubleClick(): void {\n onAddField();\n }\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n *\n * @param {KeyboardEvent} e The keyboard event.\n */\n function handleSelectedKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onRemoveField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleSelectedDoubleClick(): void {\n onRemoveField();\n }\n\n /**\n * Handles a click on the \"Add\" button.\n * Moves the \"available\" selection into the \"selected\" list.\n */\n function onAddField(): void {\n const currentField = state.search.fields ?? [];\n const key = availableRef.current?.value;\n if (key) {\n const newFields = [...currentField, key];\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Remove\" button.\n * Moves the \"selected\" selection into the \"available\" list.\n */\n function onRemoveField(): void {\n const currentField = state.search.fields ?? [];\n const key = selectedRef.current?.value;\n if (key) {\n const newFields = [...currentField];\n newFields.splice(newFields.indexOf(key), 1);\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Up\" button.\n * Moves the selection up one position in the list.\n */\n function onMoveUp(): void {\n const currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index - 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Down\" button.\n * Moves the selection down one position in the list.\n */\n function onMoveDown(): void {\n const currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index + 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Swaps two fields in the search.\n *\n * @param {number} i The index of the first field.\n * @param {number} j The index of the second field.\n */\n function swapFields(fields: string[], i: number, j: number): void {\n const temp = fields[i];\n fields[i] = fields[j];\n fields[j] = temp;\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const typeDef = globalSchema.types[resourceType];\n\n const selected = state.search.fields ?? [];\n const available = getFieldsList(typeDef)\n .filter((field) => !selected?.includes(field))\n .sort();\n\n return (\n <Modal title=\"Fields\" closeButtonLabel=\"Close\" opened={props.visible} onClose={props.onCancel}>\n <div>\n <table style={{ margin: 'auto' }}>\n <thead>\n <tr>\n <th colSpan={2} align=\"center\">\n Available\n </th>\n <th colSpan={2} align=\"center\">\n Selected\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td colSpan={2} align=\"center\">\n <select\n ref={availableRef}\n size={15}\n tabIndex={1}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleAvailableKeyDown(e)}\n onDoubleClick={() => handleAvailableDoubleClick()}\n data-testid=\"available\"\n >\n {available.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n <td colSpan={2} align=\"center\">\n <select\n ref={selectedRef}\n size={15}\n tabIndex={4}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleSelectedKeyDown(e)}\n onDoubleClick={() => handleSelectedDoubleClick()}\n data-testid=\"selected\"\n >\n {selected.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onAddField}>\n Add\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onRemoveField}>\n Remove\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveUp}>\n Up\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveDown}>\n Down\n </Button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n <Button onClick={() => props.onOk(state.search)}>OK</Button>\n </Modal>\n );\n}\n\n/**\n * Returns a list of fields/columns available for a type.\n * The result is the union of properties and search parameters.\n * @param typeSchema The type definition.\n */\nfunction getFieldsList(typeSchema: TypeSchema): string[] {\n const result = [] as string[];\n const keys = new Set<string>();\n const names = new Set<string>();\n\n // Add properties first\n for (const key of Object.keys(typeSchema.properties)) {\n result.push(key);\n keys.add(key.toLowerCase());\n names.add(buildFieldNameString(key));\n }\n\n // Add search parameters if unique\n if (typeSchema.searchParams) {\n for (const code of Object.keys(typeSchema.searchParams)) {\n const name = buildFieldNameString(code);\n if (!keys.has(code) && !names.has(name)) {\n result.push(code);\n keys.add(code);\n names.add(buildFieldNameString(code));\n }\n }\n }\n\n return result;\n}\n","import { Filter, formatDateTime, getSearchParameterDetails, globalSchema, SearchParameterType } from '@medplum/core';\nimport React from 'react';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element {\n const { resourceType, filter } = props;\n\n const searchParam = globalSchema.types[resourceType]?.searchParams?.[filter.code];\n if (searchParam) {\n if (searchParam.type === 'reference') {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);\n if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {\n return <>{formatDateTime(filter.value)}</>;\n }\n }\n\n return <>{filter.value}</>;\n}\n","import { Checkbox, TextInput } from '@mantine/core';\nimport { getSearchParameterDetails, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n resourceType: string;\n searchParam: SearchParameter;\n defaultValue?: string;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n}\n\nexport function SearchFilterValueInput(props: SearchFilterValueInputProps): JSX.Element | null {\n const details = getSearchParameterDetails(props.resourceType, props.searchParam);\n const name = 'filter-value';\n\n switch (details.type) {\n case SearchParameterType.REFERENCE:\n return (\n <ReferenceInput\n name={name}\n defaultValue={{ reference: props.defaultValue }}\n targetTypes={props.searchParam?.target}\n onChange={(newReference: Reference | undefined) => {\n if (newReference) {\n props.onChange(newReference.reference as string);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n case SearchParameterType.BOOLEAN:\n return (\n <Checkbox\n name={name}\n data-testid={name}\n defaultChecked={props.defaultValue === 'true'}\n onChange={(e) => props.onChange(e.currentTarget.checked.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return (\n <TextInput\n type=\"date\"\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.DATETIME:\n return <DateTimeInput name={name} defaultValue={props.defaultValue} onChange={props.onChange} />;\n\n case SearchParameterType.NUMBER:\n return (\n <TextInput\n type=\"number\"\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.QUANTITY:\n return (\n <QuantityInput\n name={name}\n defaultValue={tryParseQuantity(props.defaultValue)}\n onChange={(newQuantity: Quantity | undefined) => {\n if (newQuantity) {\n props.onChange(`${newQuantity.value}`);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n default:\n return (\n <TextInput\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n placeholder=\"Search value\"\n />\n );\n }\n}\n\nfunction tryParseQuantity(value: string | undefined): Quantity | undefined {\n if (value) {\n const [valueString, systemString, unitString] = value.split('|');\n if (valueString) {\n return {\n value: parseFloat(valueString),\n system: systemString,\n unit: unitString,\n };\n }\n }\n return undefined;\n}\n","import { Button, Group, Modal, NativeSelect } from '@mantine/core';\nimport { Filter, globalSchema, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from '../SearchControl/SearchUtils';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterEditor(props: SearchFilterEditorProps): JSX.Element | null {\n const [search, setSearch] = useState<SearchRequest>(JSON.parse(stringify(props.search)) as SearchRequest);\n const [editingIndex, setEditingIndex] = useState<number>(-1);\n\n const searchRef = useRef<SearchRequest>(search);\n searchRef.current = search;\n\n useEffect(() => {\n setSearch(JSON.parse(stringify(props.search)) as SearchRequest);\n }, [props.search]);\n\n function onAddFilter(filter: Filter): void {\n setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const searchParams = globalSchema.types[resourceType].searchParams as Record<string, SearchParameter>;\n const filters = search.filters || [];\n\n return (\n <Modal title=\"Filters\" closeButtonLabel=\"Close\" size={900} opened={props.visible} onClose={props.onCancel}>\n <div>\n <table>\n <colgroup>\n <col style={{ width: 200 }} />\n <col style={{ width: 200 }} />\n <col style={{ width: 380 }} />\n <col style={{ width: 120 }} />\n </colgroup>\n <thead>\n <tr>\n <th>Field</th>\n <th>Operation</th>\n <th>Value</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {filters.map((filter: Filter, index: number) => {\n if (index === editingIndex) {\n return (\n <FilterRowInput\n key={`filter-${index}-${filters.length}-input`}\n resourceType={resourceType}\n searchParams={searchParams}\n defaultValue={filter}\n okText=\"Save\"\n onOk={(newFilter: Filter) => {\n const newFilters = [...filters];\n newFilters[index] = newFilter;\n setSearch(setFilters(searchRef.current, newFilters));\n setEditingIndex(-1);\n }}\n onCancel={() => setEditingIndex(-1)}\n />\n );\n } else {\n return (\n <FilterRowDisplay\n key={`filter-${index}-${filters.length}-display`}\n resourceType={resourceType}\n searchParams={searchParams}\n filter={filter}\n onEdit={() => setEditingIndex(index)}\n onDelete={() => setSearch(deleteFilter(searchRef.current, index))}\n />\n );\n }\n })}\n <FilterRowInput resourceType={resourceType} searchParams={searchParams} okText=\"Add\" onOk={onAddFilter} />\n </tbody>\n </table>\n </div>\n <Group position=\"right\" mt=\"xl\">\n <Button onClick={() => props.onOk(searchRef.current)}>OK</Button>\n </Group>\n </Modal>\n );\n}\n\ninterface FilterRowDisplayProps {\n readonly searchParams: Record<string, SearchParameter>;\n readonly resourceType: string;\n readonly filter: Filter;\n readonly onEdit: () => void;\n readonly onDelete: () => void;\n}\n\nfunction FilterRowDisplay(props: FilterRowDisplayProps): JSX.Element | null {\n const { filter } = props;\n return (\n <tr>\n <td>{buildFieldNameString(filter.code)}</td>\n <td>{getOpString(filter.operator)}</td>\n <td>\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </td>\n <td>\n <Button compact variant=\"outline\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button compact variant=\"outline\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n resourceType: string;\n searchParams: Record<string, SearchParameter>;\n defaultValue?: Filter;\n okText: string;\n onOk: (value: Filter) => void;\n onCancel?: () => void;\n}\n\nfunction FilterRowInput(props: FilterRowInputProps): JSX.Element {\n const [value, setValue] = useState<Filter>(props.defaultValue ?? ({} as Filter));\n const valueRef = useRef<Filter>(value);\n valueRef.current = value;\n\n function setFilterCode(newCode: string): void {\n setValue({ ...valueRef.current, code: newCode });\n }\n\n function setFilterOperator(newOperator: Operator): void {\n setValue({ ...valueRef.current, operator: newOperator });\n }\n\n function setFilterValue(newFilterValue: string): void {\n setValue({ ...valueRef.current, value: newFilterValue });\n }\n\n const searchParam = props.searchParams[value.code];\n const operators = searchParam && getSearchOperators(searchParam);\n\n return (\n <tr>\n <td>\n <NativeSelect\n data-testid=\"filter-field\"\n defaultValue={valueRef.current.code}\n onChange={(e) => setFilterCode(e.currentTarget.value)}\n data={Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) }))}\n />\n </td>\n <td>\n {operators && (\n <NativeSelect\n data-testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={(e) => setFilterOperator(e.currentTarget.value as Operator)}\n data={['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))]}\n />\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={searchParam}\n defaultValue={value.value}\n onChange={setFilterValue}\n />\n )}\n </td>\n <td>\n {value.code && value.operator && value.value && (\n <Button\n compact\n variant=\"outline\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button compact variant=\"outline\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n","import { Button, Modal } from '@mantine/core';\nimport { Filter } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n resourceType: string;\n searchParam?: SearchParameter;\n filter?: Filter;\n defaultValue?: string;\n onOk: (filter: Filter) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterValueDialog(props: SearchFilterValueDialogProps): JSX.Element | null {\n const [value, setValue] = useState<string>(props.defaultValue ?? '');\n\n if (!props.visible || !props.searchParam || !props.filter) {\n return null;\n }\n\n function onOk(): void {\n props.onOk({ ...(props.filter as Filter), value });\n }\n\n return (\n <Modal title={props.title} size=\"xl\" opened={props.visible} onClose={props.onCancel}>\n <div style={{ width: 500 }}>\n <Form onSubmit={onOk}>\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Form>\n </div>\n <Button onClick={onOk}>OK</Button>\n </Modal>\n );\n}\n","import { Menu } from '@mantine/core';\nimport { Filter, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport {\n IconBleach,\n IconBleachOff,\n IconBracketsContain,\n IconBucket,\n IconBucketOff,\n IconCalendar,\n IconEqual,\n IconEqualNot,\n IconMathGreater,\n IconMathLower,\n IconSettings,\n IconSortAscending,\n IconSortDescending,\n IconX,\n} from '@tabler/icons';\nimport React from 'react';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from '../SearchControl/SearchUtils';\n\nexport interface SearchPopupMenuProps {\n search: SearchRequest;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Menu.Dropdown>\n {props.searchParams.map((searchParam) => (\n <Menu.Item key={searchParam.code}>{buildFieldNameString(searchParam.code as string)}</Menu.Item>\n ))}\n </Menu.Dropdown>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Oldest to Newest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Newest to Oldest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}>\n Before...\n </Menu.Item>\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}\n >\n After...\n </Menu.Item>\n <Menu.Item icon={<IconBracketsContain size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Between...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addTomorrowFilter(props.search, code))}\n >\n Tomorrow\n </Menu.Item>\n <Menu.Item icon={<IconCalendar size={14} />} onClick={() => props.onChange(addTodayFilter(props.search, code))}>\n Today\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYesterdayFilter(props.search, code))}\n >\n Yesterday\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addNextMonthFilter(props.search, code))}\n >\n Next Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addThisMonthFilter(props.search, code))}\n >\n This Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addLastMonthFilter(props.search, code))}\n >\n Last Month\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYearToDateFilter(props.search, code))}\n >\n Year to date\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Smallest to Largest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Largest to Smallest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}\n >\n Greater than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}\n >\n Greater than or equal to...\n </Menu.Item>\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}>\n Less than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}\n >\n Less than or equal to...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort A to Z\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Z to A\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconBucket size={14} />} onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>\n Contains...\n </Menu.Item>\n <Menu.Item icon={<IconBucketOff size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Does not contain...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction CommonMenuItems(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <Menu.Divider />\n <Menu.Item icon={<IconBleach size={14} />} onClick={() => props.onChange(addMissingFilter(props.search, code))}>\n Missing\n </Menu.Item>\n <Menu.Item\n icon={<IconBleachOff size={14} />}\n onClick={() => props.onChange(addMissingFilter(props.search, code, false))}\n >\n Not missing\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconX size={14} />} onClick={() => props.onClear(searchParam)}>\n Clear filters\n </Menu.Item>\n </>\n );\n}\n","import { getSearchParameterDetails, globalSchema, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, ResourceType, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to ElementDefinition objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: ElementDefinition;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param search The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param resourceType The resource type.\n * @param name The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(resourceType: string, name: string): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n },\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n },\n ],\n };\n }\n\n const typeSchema = globalSchema.types[resourceType];\n const exactElementDefinition: ElementDefinition | undefined = typeSchema.properties[name];\n const exactSearchParam: SearchParameter | undefined = typeSchema.searchParams?.[name.toLowerCase()];\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n let searchParams: SearchParameter[] | undefined = undefined;\n if (typeSchema.searchParams) {\n const path = `${resourceType}.${name.replaceAll('[x]', '')}`;\n searchParams = Object.values(typeSchema.searchParams).filter((p) => p.expression?.includes(path));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n","import {\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs}px ${theme.spacing.md}px`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: 'accurate', fields: undefined })\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n }, [medplum, search, onLoad]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current?.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n *\n * @param e The click event.\n * @param resource The FHIR resource.\n */\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && props.onExport && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={props.onExport}\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </Text>\n )}\n </Group>\n )}\n <Table className={classes.table}>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n page={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getItemAriaLabel={(page) => {\n switch (page) {\n case 'prev':\n return 'Previous page';\n case 'next':\n return 'Next page';\n default:\n return undefined;\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue={''}\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter, index: number) => (\n <div key={`filter-${index}-${filters.length}`}>\n {getOpString(filter.operator)}\n &nbsp;\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset || 0) / (search.count || DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count || DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n","import { Button, Loader, Table } from '@mantine/core';\nimport { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from '../FhirPathDisplay/FhirPathDisplay';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchClickEvent } from '../SearchControl/SearchControl';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data?.ResourceList?.length === 0 && <div data-testid=\"empty-search\">No results</div>}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nconst searches = [\n '$/_history',\n 'Communication?subject=$',\n 'Device?patient=$',\n 'DeviceRequest?patient=$',\n 'DiagnosticReport?subject=$',\n 'Media?subject=$',\n 'ServiceRequest?subject=$',\n];\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.patient}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: searches.map((search) => ({\n request: {\n method: 'GET',\n url: search.replaceAll('$', getReferenceString(resource)),\n },\n })),\n })}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { Anchor, Button, createStyles, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { getReferenceString, IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { ElementDefinition, PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n}));\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>(undefined);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const { classes } = useStyles();\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className={classes.section}>\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </Anchor>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { classes, cx } = useStyles();\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: React.SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n}\n\nconst timingProperty: ElementDefinition = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: '1',\n type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <Stack spacing=\"xl\">\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\">\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </Stack>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, PropertyType] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n","import { QuestionnaireItem } from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n","import { Button, Checkbox, Group, NativeSelect, Radio, Stack, Textarea, TextInput, Title } from '@mantine/core';\nimport {\n capitalize,\n createReference,\n deepEquals,\n getQuestionnaireAnswers,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { useResource } from '../useResource/useResource';\nimport { QuestionnaireItemType } from '../utils/questionnaire';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer>>({});\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getQuestionnaireAnswers(newResponse));\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n });\n }\n }}\n >\n {questionnaire.title && <Title>{questionnaire.title}</Title>}\n {questionnaire.item && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">{props.submitButtonText || 'OK'}</Button>\n </Group>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(index: number, newResponseItem: QuestionnaireResponseItem): void {\n const newResponseItems = responseItems.slice();\n newResponseItems[index] = newResponseItem;\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n return (\n <Stack>\n {props.items.map((item, index) => {\n if (!isQuestionEnabled(item, props.answers)) {\n return null;\n }\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n );\n }\n if (item.type === QuestionnaireItemType.boolean) {\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n return (\n <CheckboxFormSection key={item.linkId} title={item.text} htmlFor={item.linkId}>\n <Checkbox\n id={item.linkId}\n name={item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) =>\n setResponseItem(index, {\n linkId: item.linkId,\n text: item.text,\n answer: [{ valueBoolean: e.currentTarget.checked }],\n })\n }\n />\n </CheckboxFormSection>\n );\n }\n return (\n <FormSection key={item.linkId} htmlFor={item.linkId} title={item.text || ''}>\n <QuestionnaireFormItem\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[]): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n answer: [newResponseAnswer],\n });\n }\n\n switch (type) {\n case QuestionnaireItemType.group:\n return (\n <div>\n <h3>{item.text}</h3>\n {item.item && (\n <QuestionnaireFormItemArray items={item.item} answers={props.answers} onChange={onChangeItem} />\n )}\n </div>\n );\n case QuestionnaireItemType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n }\n }\n\n return null;\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n return (\n <Radio.Group\n name={name}\n orientation=\"vertical\"\n defaultValue={defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\n );\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n const enableBehavior = item.enableBehavior || 'any';\n for (const enableWhen of item.enableWhen) {\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n );\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: answers[enableWhen.question as string],\n },\n 'value[x]'\n );\n const match = deepEquals(expectedAnswer, actualAnswer);\n if (enableBehavior === 'any' && match) {\n return true;\n }\n if (enableBehavior === 'all' && !match) {\n return false;\n }\n }\n if (enableBehavior === 'any') {\n return false;\n } else {\n return true;\n }\n}\n","import { Anchor, Button, createStyles, NativeSelect, Textarea, TextInput, Title } from '@mantine/core';\nimport { globalSchema, IndexedStructureDefinition } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\nimport { isChoiceQuestion, QuestionnaireItemType } from '../utils/questionnaire';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n questionBody: {\n maxWidth: 600,\n },\n\n topActions: {\n position: 'absolute',\n right: 4,\n top: 1,\n padding: 4,\n color: theme.colors.gray[5],\n fontSize: theme.fontSizes.xs,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n\n linkIdInput: {\n width: 100,\n marginBottom: 4,\n },\n\n typeSelect: {\n width: 100,\n },\n}));\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const { classes, cx } = useStyles();\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = 'resourceType' in props.item;\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item?.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item?.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n <div className={classes.questionBody}>\n {editing ? (\n <>\n {isResource && (\n <TextInput\n size=\"xl\"\n defaultValue={resource.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n )}\n {!isResource && (\n <Textarea\n autosize\n minRows={2}\n defaultValue={item.text}\n onChange={(e) => changeProperty('text', e.currentTarget.value)}\n />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <Title>{resource.title}</Title>}\n {item.text && <div>{item.text}</div>}\n {!isContainer && <QuestionnaireFormItem item={item} answers={{}} onChange={() => undefined} />}\n </>\n )}\n </div>\n {item.item &&\n item.item.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className={classes.topActions}>\n {editing ? (\n <>\n <TextInput\n size=\"xs\"\n className={classes.linkIdInput}\n defaultValue={item.linkId}\n onChange={(e) => changeProperty('linkId', e.currentTarget.value)}\n />\n {!isContainer && (\n <NativeSelect\n size=\"xs\"\n className={classes.typeSelect}\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\n )}\n </>\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className={classes.bottomActions}>\n {isContainer && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </Anchor>\n </>\n )}\n {editing && !isResource && (\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </Anchor>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </Anchor>\n </div>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @return A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3)) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1)) + 1);\n }\n });\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n","import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'] as const;\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<typeof intervalFilters[number], any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals?.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals?.[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex != -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup. Also populates some initial\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget?.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget?.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '');\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<\n typeof intervalFilters[number],\n any\n >,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together\n * @return A \"group key\" that corresponds to the value of the interval filter properties.\n */\n\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n","import { Badge, DefaultMantineColor } from '@mantine/core';\nimport React from 'react';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n","/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path && path.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n","import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .filter((entry) => !!entry.resource)\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table The output blame table.\n * @param versions The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n","import { createStyles } from '@mantine/core';\nimport { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { blame } from '../utils/blame';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n overflowX: 'auto',\n },\n\n root: {\n border: `0.1px solid ${theme.colors.gray[3]}`,\n borderCollapse: 'collapse',\n borderRadius: theme.radius.sm,\n borderSpacing: 0,\n fontSize: theme.fontSizes.xs,\n width: '100%',\n\n '& td': {\n padding: '2px 4px 0 4px',\n verticalAlign: 'top',\n whiteSpace: 'nowrap',\n },\n },\n\n startRow: {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n normalRow: {\n borderTop: 0,\n },\n\n author: {\n lineHeight: '10px',\n },\n\n dateTime: {\n borderRight: `0.1px solid ${theme.colors.gray[3]}`,\n lineHeight: '20px',\n },\n\n lineNumber: {\n backgroundColor: theme.colors.gray[1],\n border: 0,\n color: theme.colors.gray[5],\n fontFamily: theme.fontFamilyMonospace,\n padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,\n textAlign: 'right',\n },\n\n line: {\n fontFamily: theme.fontFamilyMonospace,\n fontSize: theme.fontSizes.sm,\n padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,\n },\n\n pre: {\n margin: 0,\n },\n}));\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then(setValue).catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n const table = blame(value);\n return (\n <div className={classes.container}>\n <table className={classes.root}>\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? classes.startRow : classes.normalRow}>\n {row.span > 0 && (\n <>\n <td className={classes.author} rowSpan={row.span}>\n <ResourceBadge value={row.meta.author} link={true} />\n </td>\n <td className={classes.dateTime} rowSpan={row.span}>\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </td>\n </>\n )}\n <td className={classes.lineNumber}>{index + 1}</td>\n <td className={classes.line}>\n <pre className={classes.pre}>{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n","import { createStyles } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Delta, diff } from '../utils/diff';\n\nconst useStyles = createStyles((theme) => ({\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n const { classes } = useStyles();\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className={classes.removed}>{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className={classes.added}>{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n","import { Table } from '@mantine/core';\nimport { formatDateTime, normalizeErrorString } from '@medplum/core';\nimport { Bundle, BundleEntry, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum\n .readHistory(props.resourceType as ResourceType, props.id)\n .then(setValue)\n .catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <Table withBorder withColumnBorders>\n <thead>\n <tr>\n <th>Author</th>\n <th>Date</th>\n <th>Version</th>\n </tr>\n </thead>\n <tbody>\n {value.entry?.map((entry, index) => (\n <HistoryRow key={'entry-' + index} entry={entry} />\n ))}\n </tbody>\n </Table>\n );\n}\n\ninterface HistoryRowProps {\n entry: BundleEntry;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n const { response, resource } = props.entry;\n if (resource) {\n return (\n <tr>\n <td>\n <ResourceBadge value={resource.meta?.author} link={true} />\n </td>\n <td>{formatDateTime(resource.meta?.lastUpdated)}</td>\n <td>\n <MedplumLink to={getVersionUrl(resource)}>{resource.meta?.versionId}</MedplumLink>\n </td>\n </tr>\n );\n } else {\n return (\n <tr>\n <td colSpan={3}>{normalizeErrorString(response?.outcome)}</td>\n </tr>\n );\n }\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n","import { Button, createStyles, Stack, Text } from '@mantine/core';\nimport { getReferenceString } from '@medplum/core';\nimport { Questionnaire, QuestionnaireResponse, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { CalendarInput, getStartMonth } from '../CalendarInput/CalendarInput';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireForm } from '../QuestionnaireForm/QuestionnaireForm';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { useResource } from '../useResource/useResource';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n display: 'flex',\n minHeight: 400,\n },\n\n info: {\n minWidth: 300,\n padding: 20,\n borderRight: `1px solid ${theme.colors.gray[3]}`,\n },\n\n selection: {\n minWidth: 300,\n padding: 20,\n },\n}));\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n questionnaire: Questionnaire | Reference<Questionnaire>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const schedule = useResource(props.schedule);\n const questionnaire = useResource(props.questionnaire);\n\n const [slots, setSlots] = useState<Slot[]>();\n const slotsRef = useRef<Slot[]>();\n slotsRef.current = slots;\n\n const [month, setMonth] = useState<Date>(getStartMonth());\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [response, setResponse] = useState<QuestionnaireResponse>();\n\n useEffect(() => {\n if (schedule) {\n setSlots([]);\n medplum\n .searchResources(\n 'Slot',\n new URLSearchParams([\n ['_count', (30 * 24).toString()],\n ['schedule', getReferenceString(schedule)],\n ['start', 'gt' + getStart(month)],\n ['start', 'lt' + getEnd(month)],\n ])\n )\n .then(setSlots)\n .catch(console.log);\n } else {\n setSlots(undefined);\n }\n }, [medplum, schedule, month]);\n\n if (!schedule || !slots || !questionnaire) {\n return null;\n }\n\n const actor = schedule.actor?.[0];\n\n return (\n <div className={classes.container} data-testid=\"scheduler\">\n <div className={classes.info}>\n {actor && <ResourceAvatar value={actor} size=\"xl\" />}\n {actor && (\n <Text size=\"xl\" weight={500}>\n <ResourceName value={actor} />\n </Text>\n )}\n <p>1 hour</p>\n {date && <p>{date.toLocaleDateString()}</p>}\n {slot && <p>{formatTime(new Date(slot.start as string))}</p>}\n </div>\n <div className={classes.selection}>\n {!date && (\n <div>\n <h3>Select date</h3>\n <CalendarInput slots={slots} onChangeMonth={setMonth} onClick={setDate} />\n </div>\n )}\n {date && !slot && (\n <div>\n <h3>Select time</h3>\n <Stack>\n {slots.map((s) => {\n const slotStart = new Date(s.start as string);\n return (\n slotStart.getTime() > date.getTime() &&\n slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (\n <div key={s.id}>\n <Button variant=\"outline\" style={{ width: 150 }} onClick={() => setSlot(s)}>\n {formatTime(slotStart)}\n </Button>\n </div>\n )\n );\n })}\n </Stack>\n </div>\n )}\n {date && slot && !response && (\n <QuestionnaireForm questionnaire={questionnaire} submitButtonText={'Next'} onSubmit={setResponse} />\n )}\n {date && slot && response && (\n <div>\n <h3>You're all set!</h3>\n <p>Check your email for a calendar invite.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction getStart(month: Date): string {\n return formatSlotInstant(month.getTime());\n}\n\nfunction getEnd(month: Date): string {\n return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);\n}\n\nfunction formatSlotInstant(time: number): string {\n return new Date(Math.max(Date.now(), time)).toISOString();\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `AuditEvent?entity=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n ],\n })}\n />\n );\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?encounter=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?encounter=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { NewProjectForm } from './NewProjectForm';\nimport { NewUserForm } from './NewUserForm';\n\nexport interface RegisterFormProps {\n readonly type: 'patient' | 'project';\n readonly projectId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey: string;\n readonly children?: React.ReactNode;\n readonly onSuccess: () => void;\n}\n\nexport function RegisterForm(props: RegisterFormProps): JSX.Element {\n const { type, projectId, googleClientId, recaptchaSiteKey, onSuccess } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n if (type === 'patient' && login) {\n medplum\n .startNewPatient({ login, projectId: projectId as string })\n .then((response) => medplum.processCode(response.code as string))\n .then(() => onSuccess())\n .catch((err) => setOutcome(err as OperationOutcome));\n }\n }, [medplum, type, projectId, login, onSuccess]);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.code) {\n medplum\n .processCode(response.code)\n .then(() => onSuccess())\n .catch(console.log);\n } else if (response.login) {\n setLogin(response.login);\n }\n }\n\n return (\n <Document width={450}>\n {outcome && <pre>{JSON.stringify(outcome, null, 2)}</pre>}\n {!login && (\n <NewUserForm\n projectId={projectId as string}\n googleClientId={googleClientId}\n recaptchaSiteKey={recaptchaSiteKey}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </NewUserForm>\n )}\n {login && type === 'project' && <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />}\n </Document>\n );\n}\n","import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { IconCheckbox, IconSquare } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <React.Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text weight={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by&nbsp;\n <ResourceName value={task?.meta?.author as Reference} />\n &nbsp;on&nbsp;\n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </React.Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, Resource, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?based-on=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?_count=100&based-on=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `DiagnosticReport?based-on=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n ],\n })}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { BaseLoginRequest, LoginAuthenticationResponse } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly chooseScopes?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const { chooseScopes, onSuccess, onForgotPassword, onRegister, onCode, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n }\n\n function handleScopeResponse(response: LoginAuthenticationResponse): void {\n handleCode(response.code as string);\n }\n\n function handleCode(code: string): void {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch(console.log);\n }\n }\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n generatePkce={!onCode}\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n"],"names":["AddressDisplay","props","address","value","React","formatAddress","getLine","index","line","length","setLine","str","push","Object","assign","AddressInput","setValue","useState","defaultValue","valueRef","useRef","setValueWrapper","newValue","onChange","current","createElement","Group","spacing","grow","noWrap","NativeSelect","use","e","setUse","currentTarget","data","type","setType","TextInput","placeholder","setLine1","line1","setLine2","line2","city","setCity","state","setState","postalCode","setPostalCode","reactContext","createContext","undefined","useMedplumContext","useContext","useMedplum","medplum","useMedplumProfile","profile","AnnotationInput","author","name","text","authorReference","createReference","time","Date","toISOString","setText","AttachmentDisplay","contentType","url","title","startsWith","style","maxWidth","src","alt","controls","endsWith","minHeight","width","height","allowFullScreen","frameBorder","seamless","padding","Anchor","href","target","rel","AttachmentArrayDisplay","values","map","v","key","killEvent","preventDefault","stopPropagation","isCheckboxCell","el","isCheckboxElement","HTMLTableCellElement","children","HTMLInputElement","AttachmentButton","fileInputRef","processFile","file","onUploadStart","filename","createBinary","onUploadProgress","then","binary","onUpload","catch","outcome","alert","_c","_b","issue","_a","details","Fragment","display","ref","files","Array","from","forEach","onFileChange","onClick","click","AttachmentArrayInput","setValues","valuesRef","setValuesWrapper","newValues","ActionIcon","size","copy","slice","splice","IconCircleMinus","attachment","color","IconCloudUpload","AttachmentInput","Button","__rest","s","t","p","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","apply","useStyles","createStyles","root","paddingLeft","paddingRight","Container","others","classes","MantineContainer","className","theme","fill","paper","margin","xl","md","defaultProps","shadow","radius","withBorder","Panel","useComponentDefaultProps","unstyled","cx","Paper","Document","parseForm","form","element","elements","parseInputElement","HTMLTextAreaElement","HTMLSelectElement","parseSelectElement","disabled","checked","Form","testid","onSubmit","formData","Logo","xmlns","viewBox","d","getErrorsForInput","expression","filter","isExpressionMatch","join","getIssuesForExpression","expr1","expr2","dot1","substring","dot2","NewProjectForm","setOutcome","this","handleAuthResponse","startNewProject","login","projectName","err","Center","sx","flexDirection","Title","Stack","label","required","autoFocus","error","Text","position","mt","createScriptTag","onload","head","document","getElementsByTagName","script","async","appendChild","GoogleButton","googleClientId","handleGoogleCredential","parentRef","scriptLoaded","setScriptLoaded","google","initialized","setInitialized","buttonRendered","setButtonRendered","useEffect","accounts","id","initialize","client_id","callback","renderButton","getGoogleClientId","clientId","origin","window","location","protocol","host","split","includes","initRecaptcha","siteKey","grecaptcha","getRecaptcha","ready","execute","action","NewUserForm","recaptchaSiteKey","issues","recaptchaToken","startNewUser","projectId","firstName","lastName","email","password","remember","Alert","icon","IconAlertCircle","response","startPkce","startGoogleLogin","googleCredential","credential","createUser","Divider","labelPosition","my","PasswordInput","autoComplete","Checkbox","AuthenticationForm","generatePkce","onForgotPassword","onRegister","baseLoginRequest","startLogin","component","lineHeight","ChooseProfileForm","memberships","membership","UnstyledButton","post","console","log","Avatar","flex","weight","project","ChooseScopeForm","scope","keys","scopeName","defaultChecked","DEFAULT_IGNORED_PROPERTIES","gridTemplateColumns","sm","borderTop","colors","gray","compact","xs","border","DescriptionList","DescriptionListEntry","term","CodeableConceptDisplay","formatCodeableConcept","CodingDisplay","formatCoding","ContactPointDisplay","contactPoint","builder","system","trim","ContactDetailDisplay","contactDetail","telecom","HumanNameDisplay","formatHumanName","options","IdentifierDisplay","QuantityDisplay","formatQuantity","RangeDisplay","formatRange","RatioDisplay","numerator","denominator","MedplumLink","navigate","useNavigate","to","suffix","rest","getStringHref","resourceType","getResourceHref","reference","getReferenceHref","getHref","ReferenceDisplay","displayString","stringify","link","ResourceArrayDisplay","property","propertyType","code","ResourcePropertyDisplay","arrayElement","ignoreMissingValues","max","PropertyType","boolean","Boolean","toString","SystemString","date","integer","positiveInt","string","unsignedInt","uri","canonical","dateTime","instant","formatDateTime","markdown","Address","Annotation","Attachment","CodeableConcept","Coding","ContactDetail","ContactPoint","HumanName","Identifier","Period","formatPeriod","Quantity","Duration","Range","Ratio","Reference","Timing","formatTiming","Dosage","UsageContext","BackboneElementDisplay","path","Error","buildTypeName","getValueAndType","context","typedResult","getTypedPropertyValue","isArray","typedValue","typeName","typeSchema","globalSchema","types","entries","properties","entry","propertyValue","getPropertyDisplayName","CheckboxFormSection","Input","Wrapper","htmlFor","description","FormSection","deviceName","useResource","resource","setResource","getCachedReference","getInitialResource","subscribed","readReference","r","setPropertyValue","obj","propName","elementDefinition","compoundKey","replace","capitalize","valueSetElementToAutocompleteItem","item","ValueSetAutocomplete","textValues","setTextValues","setData","dataRef","loadValues","useCallback","input","binding","valueSet","valueSetElements","searchValueSet","expansion","contains","newData","valueSetElement","some","MultiSelect","searchable","creatable","clearable","selected","toLowerCase","textValue","currentItem","find","getCreateLabel","query","onCreate","CodeableConceptInput","concept","coding","_d","_f","_e","newConcept","CodeInput","newCode","CodingInput","ContactPointInput","setContactPoint","setContactPointWrapper","setSystem","ContactDetailInput","setContactDetail","setContactDetailWrapper","setName","DateTimeInput","convertIsoToLocal","convertLocalToIso","isoString","isValidDate","toLocaleDateString","toLocaleTimeString","localString","ExtensionInput","JsonInput","JSON","parse","HumanNameInput","prefix","setPrefix","given","setGiven","family","setFamily","setSuffix","IdentifierInput","PeriodInput","start","end","QuantityInput","comparator","tryParseNumber","unit","parseFloat","RangeInput","low","high","RatioInput","ResourceAvatar","getDisplayString","imageUrl","getImageSrc","avatarProps","SEARCH_CODES","Schedule","Task","Patient","Practitioner","Questionnaire","ServiceRequest","DiagnosticReport","Specimen","Observation","RequestGroup","ActivityDefinition","User","ResourceInput","loading","setLoading","searchCode","searchParams","URLSearchParams","encodeURIComponent","_count","resources","searchResources","Autocomplete","itemComponent","ItemComponent","onFocus","val","onItemSubmit","rightSection","Loader","forwardRef","birthDate","ReferenceInput","targetTypes","initialResourceType","defaultValueResourceType","getInitialResourceType","setResourceType","ResourceArrayInput","borderCollapse","ResourcePropertyInput","textAlign","IconCirclePlus","daysOfWeek","TimingInput","open","setOpen","TimingEditorDialog","visible","onOk","onCancel","setRepeat","repeat","setDayOfWeek","day","enabled","existing","dayOfWeek","addDayOfWeek","removeDayOfWeek","Modal","closeButtonLabel","opened","onClose","setStart","newStart","event","period","newPeriod","setPeriod","parseInt","periodUnit","newPeriodUnit","setPeriodUnit","charAt","toUpperCase","defaultPropertyType","propertyTypes","ElementDefinitionInputSelector","elementDefinitionTypes","ElementDefinitionTypeInput","elementDefinitionType","initialPropertyType","selectedType","setSelectedType","decimal","valueAsNumber","Textarea","Extension","getTargetTypes","BackboneElementInput","targetProfile","pop","definition","table","fontWeight","fontSize","primaryColor","backgroundColor","borderRadius","cursor","getMonthString","toLocaleString","month","getFullYear","CalendarInput","onChangeMonth","setMonth","getStartMonth","moveMonth","delta","currMonth","newMonth","getTime","getMonth","grid","useMemo","startDate","slots","row","getDay","available","isDayAvailable","setDate","getDate","buildGrid","variant","week","weekIndex","dayIndex","setHours","slot","slotStart","ResourceName","ResourceBadge","criticalRow","background","colorScheme","red","DiagnosticReportDisplay","diagnosticReport","specimen","textContent","presentedForm","pf","atob","note","subject","transform","resultsInterpreter","interpreter","issued","status","ObservationTable","observation","ObservationRow","critical","interpretation","isCritical","ObservationValueDisplay","ReferenceRangeDisplay","referenceRange","obs","formatObservationValue","range","verticalAlign","removed","textDecoration","added","green","ResourceDiffTable","schema","setSchema","requestSchema","original","originalPropertyValue","originalPropertyType","toTypedValue","revisedPropertyValue","revisedPropertyType","revised","isEmpty","ResourceTable","ErrorBoundary","Component","constructor","super","static","componentDidCatch","errorInfo","render","normalizeErrorString","Timeline","TimelineItem","popupMenuItems","meta","mx","lastUpdated","Menu","Target","getReferenceString","IconDots","sortByDateAndPriority","sort","resourceDateComparator","a","b","priority1","getPriorityScore","priority2","priority","stat","asap","urgent","sent","pinnedComment","blue","ResourceTimeline","sender","getProfile","inputRef","history","setHistory","items","setItems","buildSearchRequests","itemsRef","loadTimeline","executeBatch","handleBatchResponse","batchResponse","newItems","batchEntry","bundle","reverse","addResources","setPriority","communication","updateResource","onPin","onUnpin","onDetails","timelineItem","onEdit","onDelete","onVersionDetails","version","versionId","createCommunication","contentString","createResource","focus","IconMessage","createMedia","updateNotification","message","IconCheck","autoClose","reason","IconFileAlert","showNotification","disallowClose","getProgressMessage","HistoryTimelineItem","AuditEventTimelineItem","CommunicationTimelineItem","DiagnosticReportTimelineItem","MediaTimelineItem","TimelineItemPopupMenu","Dropdown","Label","Item","IconPin","IconPinnedOff","IconListDetails","IconEdit","IconTrash","previous","findIndex","getPrevious","payload","content","ScrollArea","outcomeDesc","lengthComputable","percent","loaded","total","formatFileSize","toFixed","bytes","Math","floor","pow","FhirPathDisplay","evalFhirPath","warn","searchParamToOperators","Operator","EQUALS","NOT","CONTAINS","EXACT","fulltext","token","numeric","NOT_EQUALS","GREATER_THAN","LESS_THAN","GREATER_THAN_OR_EQUALS","LESS_THAN_OR_EQUALS","quantity","STARTS_AFTER","ENDS_BEFORE","APPROXIMATELY","datetime","operatorNames","eq","ne","gt","lt","ge","le","sa","eb","ap","exact","not","above","below","in","missing","setFilters","filters","offset","clearFiltersOnField","f","addFilter","field","op","opt_clear","nextFilters","operator","deleteFilter","newFilters","addYesterdayFilter","addDayFilter","addTodayFilter","addTomorrowFilter","startTime","endTime","setTime","addDateFilterBetween","addLastMonthFilter","addMonthFilter","addThisMonthFilter","addNextMonthFilter","addYearToDateFilter","d1","d2","addDateFilterImpl","addMissingFilter","MISSING","setOffset","setPage","page","count","DEFAULT_SEARCH_COUNT","setSort","desc","getSortField","isSortDescending","sortRules","descending","substr","getSearchOperators","searchParam","getOpString","buildFieldNameString","tmp","renderValue","replaceAll","renderPropertyValue","evalFhirPathTyped","renderSearchParameterValue","SearchFieldEditor","search","availableRef","selectedRef","onAddField","currentField","fields","newFields","onRemoveField","swapFields","j","temp","typeDef","Set","names","add","has","getFieldsList","colSpan","align","tabIndex","onKeyDown","handleAvailableKeyDown","onDoubleClick","handleSelectedKeyDown","SearchFilterValueDisplay","searchParamDetails","getSearchParameterDetails","SearchParameterType","DATETIME","SearchFilterValueInput","REFERENCE","newReference","BOOLEAN","DATE","NUMBER","QUANTITY","tryParseQuantity","newQuantity","valueString","systemString","unitString","SearchFilterEditor","setSearch","editingIndex","setEditingIndex","searchRef","FilterRowInput","okText","newFilter","FilterRowDisplay","operators","setFilterCode","param","setFilterOperator","newOperator","newFilterValue","SearchFilterValueDialog","SearchPopupMenu","SearchParameterSubMenu","onSort","onPrompt","onClear","DateFilterSubMenu","NumericFilterSubMenu","ReferenceFilterSubMenu","TextFilterSubMenu","IconSortAscending","IconSortDescending","IconEqual","IconEqualNot","IconMathLower","IconMathGreater","IconBracketsContain","IconCalendar","CommonMenuItems","IconSettings","IconBucket","IconBucketOff","IconBleach","IconBleachOff","IconX","getFieldDefinition","base","exactElementDefinition","exactSearchParam","SearchChangeEvent","Event","SearchLoadEvent","SearchClickEvent","browserEvent","overflow","marginBottom","tr","dark","th","control","SearchControl","schemaLoaded","setSchemaLoaded","onLoad","fieldEditorVisible","filterEditorVisible","filterDialogVisible","stateRef","emitSearchChange","newSearch","handleRowClick","button","onAuxClick","formatSearchQuery","searchResponse","checkboxColumn","checkboxesEnabled","getFieldDefinitions","lastResult","buttonVariant","buttonColor","iconSize","isMobile","innerWidth","hideToolbar","mb","leftIcon","IconFilter","IconColumns","onNew","IconFilePlus","onExport","IconTableExport","onBulk","IconBoxMultiple","min","getStart","getEnd","Table","isAllSelected","newSelected","handleAllCheckboxClick","IconAdjustmentsHorizontal","stroke","filterDialogSearchParam","filterDialogFilter","hideFilters","FilterDescription","handleSingleCheckboxClick","m","Pagination","getPage","getTotalPages","newPage","getItemAriaLabel","MemoizedSearchControl","memo","pageSize","ceil","FhirPathTable","setResponse","setSelected","responseRef","graphql","newSchema","onContextMenu","ResourceList","fhirPath","MemoizedFhirPathTable","searches","section","transition","hovering","editing","borderLeft","bottomActions","right","bottom","fontSizes","marginLeft","ActionArrayBuilder","actionsRef","changeAction","changedAction","actions","ActionBuilder","selectedKey","setSelectedKey","hoverKey","setHoverKey","onRemove","removeAction","removedAction","addedAction","generateId","actionType","definitionCanonical","getInitialActionType","onMouseOver","ActionEditor","ActionDisplay","timingProperty","getActionTiming","setActionType","changeProperty","x","ActionResourceTypeBuilder","ActionTimingInput","loadOnFocus","nextId","existingNum","isNaN","ensurePlanDefinitionActionKeys","QuestionnaireItemType","isChoiceQuestion","QuestionnaireForm","source","questionnaire","answers","setAnswers","buildInitialResponseItems","buildInitialResponse","authored","QuestionnaireFormItemArray","newResponseItems","newResponse","getQuestionnaireAnswers","submitButtonText","responseItems","setResponseItems","setResponseItem","newResponseItem","isQuestionEnabled","linkId","group","QuestionnaireFormItem","initial","valueBoolean","answer","onChangeAnswer","newResponseAnswer","valueDecimal","valueInteger","valueDate","valueDateTime","valueTime","valueAttachment","valueReference","valueQuantity","choice","openChoice","extension","valueCodeableConcept","isDropDownChoice","QuestionnaireChoiceDropDownInput","QuestionnaireChoiceRadioInput","initialValue","answerOption","option","optionValue","typedValueToString","selectedIndex","propertyName","valueElementDefinition","optionName","Radio","orientation","buildInitialResponseItem","buildInitialResponseAnswer","enableWhen","enableBehavior","expectedAnswer","actualAnswer","question","match","deepEquals","exports","questionBody","topActions","top","linkIdInput","typeSelect","ItemBuilder","isResource","isContainer","itemRef","changeItem","changedItem","curr","addItem","addedItem","autosize","minRows","AnswerBuilder","newOptions","removedItem","removeItem","generateLinkId","justifyContent","alignItems","o","nextLinkId","ensureQuestionnaireItemKeys","ensureQuestionnaireOptionKeys","intervalFilters","ReferenceRangeGroupEditor","intervalGroup","onRemoveGroup","ReferenceRangeGroupFilters","intervals","interval","condition","onAdd","age","gender","newGender","ageRange","newEndocrine","generateGroupKey","gestationalAge","appliesTo","c","statusToColor","draft","active","revoked","completed","unknown","retired","registered","preliminary","final","amended","cancelled","requested","received","accepted","failed","proposed","pending","booked","arrived","noshow","waitlist","routine","StatusBadge","Badge","diff","startNode","orig","rev","deltas","snake","prev","ianchor","janchor","lines","buildRevisions","N","M","MAX","middle","diagonal","k","kmiddle","kminus","kplusNode","kminusNode","node","previousSnake","buildPath","blame","versions","localeCompare","span","revisions","revision","oldLines","newLines","compareVersions","combineSpans","container","overflowX","borderSpacing","whiteSpace","startRow","normalRow","borderRight","lineNumber","fontFamily","fontFamilyMonospace","pre","getVersionUrl","getTimeString","seconds","now","years","pluralizeTime","months","days","hours","minutes","noun","ChangeDiff","HistoryRow","info","minWidth","selection","formatSlotInstant","formatTime","hour","minute","request","method","encounter","eventListener","addEventListener","removeEventListeneer","medplumContext","Provider","patient","handleDocumentMouseOver","handleDocumentClick","planDefinition","removeEventListener","defaultDefinition","intervalGroups","setIntervalGroups","groupId","setGroupId","intervalId","setIntervalId","qualifiedInterval","Number","NEGATIVE_INFINITY","isFinite","ensureQualifiedIntervalKeys","groups","groupKey","fromEntries","groupQualifiedIntervals","flatMap","isEmptyInterval","quantitativeDetails","getCodeBySystem","changeInterval","addInterval","removeInterval","removeGroup","addedGroup","currentGroups","removedGroup","changedInterval","currentGroup","g","addedInterval","currentGroupIndex","removedInterval","onSuccess","setLogin","processCode","startNewPatient","requestGroup","startedLoading","setStartedLoading","responseBundle","setResponseBundle","batchEntries","buildBatchRequest","Grid","task","findBundleEntry","taskInput","taskOutput","output","Col","IconCheckbox","IconSquare","onStart","readHistory","rowSpan","originalResource","revisedResource","ignoreMeta","noValidate","withColumnBorders","schedule","setSlots","setSlot","actor","serviceRequest","basedOn","chooseScopes","onCode","setMemberships","handleCode","handleScopeResponse"],"mappings":"unBAQM,SAAUA,EAAeC,GAC7B,MAAMC,EAAUD,EAAME,MACtB,OAAKD,EAIEE,gCAAGC,EAAaA,cAACH,IAHf,IAIX,CCXA,SAASI,EAAQJ,EAAkBK,GACjC,OAAOL,GAAWA,EAAQM,MAAQN,EAAQM,KAAKC,OAASF,EAAQL,EAAQM,KAAKD,GAAS,EACxF,CAEA,SAASG,EAAQR,EAAkBK,EAAeI,GAChD,MAAMH,EAAiBN,EAAQM,MAAQ,GACvC,KAAOA,EAAKC,QAAUF,GACpBC,EAAKI,KAAK,IAGZ,OADAJ,EAAKD,GAASI,EACFE,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAZ,GAAS,CAAAM,QACvB,CAQM,SAAUO,EAAad,GAC3B,MAAOE,EAAOa,GAAYC,EAAQA,SAAUhB,EAAMiB,cAAgB,CAAA,GAE5DC,EAAWC,EAAAA,SAGjB,SAASC,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CA8BD,OArCAH,EAASK,QAAUrB,EAsCjBC,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAACqB,cAAAK,EAAAA,4BACa,cACZZ,aAAcf,aAAK,EAALA,EAAO4B,IACrBR,SAAWS,IAAMC,OAjCPF,EAiCcC,EAAEE,cAAc/B,WAhC5CkB,iCAAqBF,EAASK,SAAS,CAAAO,SADzC,IAAgBA,CAiCoF,EAC9FI,KAAM,CAAC,GAAI,OAAQ,OAAQ,OAAQ,MAAO,aAE5C/B,EAAAqB,cAACK,EAAAA,aACa,CAAA,cAAA,eACZZ,aAAcf,aAAA,EAAAA,EAAOiC,KACrBb,SAAWS,IAAMK,OAnCND,EAmCcJ,EAAEE,cAAc/B,WAlC7CkB,iCAAqBF,EAASK,SAAS,CAAAY,UADzC,IAAiBA,CAmCsE,EACjFD,KAAM,CAAC,GAAI,SAAU,WAAY,UAEnC/B,EAAAqB,cAACa,YAAS,CACRC,YAAY,SACZrB,aAAcZ,EAAQH,EAAO,GAC7BoB,SAAWS,IAAMQ,OArCLC,EAqCcT,EAAEE,cAAc/B,WApC9CkB,EAAgBX,EAAQS,EAASK,SAAW,CAAA,EAAI,EAAGiB,IADrD,IAAkBA,KAuCdrC,EAAAqB,cAACa,YAAS,CACRC,YAAY,SACZrB,aAAcZ,EAAQH,EAAO,GAC7BoB,SAAWS,IAAMU,OAtCLC,EAsCcX,EAAEE,cAAc/B,WArC9CkB,EAAgBX,EAAQS,EAASK,SAAW,CAAA,EAAI,EAAGmB,IADrD,IAAkBA,KAwCdvC,EAACqB,cAAAa,EAASA,UAAC,CAAAC,YAAY,OAAOrB,aAAcf,EAAMyC,KAAMrB,SAAWS,IAAMa,OApC5DD,EAoCoEZ,EAAEE,cAAc/B,WAnCnGkB,iCAAqBF,EAASK,SAAS,CAAAoB,UADzC,IAAiBA,KAqCbxC,EAACqB,cAAAa,EAASA,UAAC,CAAAC,YAAY,QAAQrB,aAAcf,EAAM2C,MAAOvB,SAAWS,IAAMe,OAjC7DD,EAiCsEd,EAAEE,cAAc/B,WAhCtGkB,iCAAqBF,EAASK,SAAS,CAAAsB,WADzC,IAAkBA,KAkCd1C,EAAAqB,cAACa,YAAS,CACRC,YAAY,cACZrB,aAAcf,EAAM6C,WACpBzB,SAAWS,IAAMiB,OAjCAD,EAiCchB,EAAEE,cAAc/B,WAhCnDkB,iCAAqBF,EAASK,SAAS,CAAAwB,gBADzC,IAAuBA,CAkCjB,IAGR,CC9FA,MAAME,EAAeC,EAAAA,mBAAcC,YAmDnBC,IACd,OAAOC,EAAAA,WAAWJ,EACpB,UAMgBK,IACd,OAAOF,IAAoBG,OAC7B,UAOgBC,IACd,OAAOJ,IAAoBK,OAC7B,CC7DM,SAAUC,EAAgB1D,GAC9B,MAAM2D,EAASH,KACRtD,EAAOa,GAAYC,EAAQA,SAAahB,EAAMiB,cAAgB,CAAA,GAoBrE,OAlBiBE,EAAAA,SACRI,QAAUrB,EAkBjBC,EAACqB,cAAAa,YACC,CAAAuB,KAAM5D,EAAM4D,KACZtB,YAAY,kBACZrB,aAAcf,EAAM2D,KACpBvC,SAAWS,GApBf,SAAiB8B,GACf,MAAMxC,EAAuBwC,EACzB,CACEA,OACAC,gBAAiBH,GAAUI,EAAeA,gBAACJ,GAC3CK,MAAM,IAAIC,MAAOC,eAEnB,GAEJnD,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAOoB8C,CAAQpC,EAAEE,cAAc/B,QAG/C,CCjCM,SAAUkE,EAAkBpE,GAChC,MAAME,EAAQF,EAAME,OACdmE,YAAEA,EAAWC,IAAEA,EAAGC,MAAEA,GAAUrE,QAAAA,EAAS,CAAA,EAE7C,OAAKoE,EAKHnE,qCAAiB,uBACdkE,aAAA,EAAAA,EAAaG,WAAW,YACvBrE,EAAAqB,cAAA,MAAA,CAAA,cAAiB,mBAAmBiD,MAAO,CAAEC,SAAU1E,EAAM0E,UAAYC,IAAKL,EAAKM,IAAK1E,aAAK,EAALA,EAAOqE,SAEhGF,aAAA,EAAAA,EAAaG,WAAW,YACvBrE,EAAAqB,cAAA,QAAA,CAAA,cAAmB,mBAAmBiD,MAAO,CAAEC,SAAU1E,EAAM0E,UAAYG,UAAU,GACnF1E,EAAQqB,cAAA,SAAA,CAAAW,KAAMkC,EAAaM,IAAKL,KAGnB,oBAAhBD,KAAsCE,aAAK,EAALA,EAAOO,SAAS,UACrD3E,EAAiBqB,cAAA,MAAA,CAAA,cAAA,iBAAiBiD,MAAO,CAAEC,SAAU1E,EAAM0E,SAAUK,UAAW,MAC9E5E,EACEqB,cAAA,SAAA,CAAAwD,MAAM,OACNC,OAAO,MACPN,IAAKL,EAAM,cACXY,iBAAiB,EACjBC,YAAa,EACbC,UAAU,KAIhBjF,EAAiBqB,cAAA,MAAA,CAAA,cAAA,gBAAgBiD,MAAO,CAAEY,QAAS,uBACjDlF,EAAAqB,cAAC8D,EAAAA,OAAO,CAAAC,KAAMrF,aAAK,EAALA,EAAOoE,IAAiB,cAAA,qBAAqBkB,OAAO,SAASC,IAAI,wBAC5EvF,aAAA,EAAAA,EAAOqE,QAAS,cA3BhB,IAgCX,CCrCM,SAAUmB,EAAuB1F,GACrC,OACEG,EAAAqB,cAAA,MAAA,KACGxB,EAAM2F,QACL3F,EAAM2F,OAAOC,KAAI,CAACC,EAAGvF,IACnBH,EAAAqB,cAAA,MAAA,CAAKsE,IAAK,eAAiBxF,GACzBH,EAAAqB,cAAC4C,EAAkB,CAAAlE,MAAO2F,EAAGnB,SAAU1E,EAAM0E,cAKzD,CCdM,SAAUqB,EAAUhE,GACxBA,EAAEiE,iBACFjE,EAAEkE,iBACJ,CAQM,SAAUC,EAAeC,GAC7B,GAAIC,EAAkBD,GACpB,OAAO,EAGT,GAAIA,aAAcE,qBAAsB,CACtC,MAAMC,EAAWH,EAAGG,SACpB,GAAwB,IAApBA,EAAS9F,QAAgB4F,EAAkBE,EAAS,IACtD,OAAO,CAEV,CAED,OAAO,CACT,CAEA,SAASF,EAAkBD,GACzB,OAAOA,aAAcI,kBAAgC,aAAZJ,EAAGhE,IAC9C,CCtBM,SAAUqE,EAAiBxG,GAC/B,MAAMuD,EAAUD,IACVmD,EAAetF,SAAyB,MAoB9C,SAASuF,EAAYC,GACnB,IAAKA,EACH,OAIF,IADiBA,EAAK/C,KAEpB,OAGE5D,EAAM4G,eACR5G,EAAM4G,gBAGR,MAAMC,EAAWF,EAAK/C,KAChBS,EAAcsC,EAAKxE,MAAQ,2BACjCoB,EACGuD,aAAaH,EAAME,EAAUxC,EAAarE,EAAM+G,kBAChDC,MAAMC,IACLjH,EAAMkH,SAAS,CACb7C,YAAa4C,EAAO5C,YACpBC,IAAK2C,EAAO3C,IACZC,MAAOsC,GACP,IAEHM,OAAOC,cACNC,MAAoC,QAA9BC,EAAmB,QAAnBC,EAAc,UAAdH,aAAA,EAAAA,EAASI,aAAK,IAAAC,OAAA,EAAAA,EAAG,UAAE,IAAAF,OAAA,EAAAA,EAAEG,eAAS,IAAAJ,OAAA,EAAAA,EAAAzD,KAAK,GAE9C,CAED,OACE1D,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAAAqB,cAAA,QAAA,CACEW,KAAK,OAAM,cACC,oBACZsC,MAAO,CAAEmD,QAAS,QAClBC,IAAKpB,EACLnF,SAAWS,GAlDjB,SAAsBA,GACpBgE,EAAUhE,GACV,MAAM+F,EAAS/F,EAAEyD,OAA4BsC,MACzCA,GACFC,MAAMC,KAAKF,GAAOG,QAAQvB,EAE7B,CA4CsBwB,CAAanG,KAE/B/B,EAAMsG,SAAS,CAAE6B,QAzDtB,SAAiBpG,SACfgE,EAAUhE,GACY,QAAtB0F,EAAAhB,EAAalF,eAAS,IAAAkG,GAAAA,EAAAW,OACvB,IAyDH,CC7DM,SAAUC,EAAqBrI,SACnC,MAAO2F,EAAQ2C,GAAatH,EAAQA,SAAqC,QAAtByG,EAAAzH,EAAMiB,oBAAgB,IAAAwG,EAAAA,EAAA,IAEnEc,EAAYpH,EAAAA,SAGlB,SAASqH,EAAiBC,GACxBH,EAAUG,GACNzI,EAAMsB,UACRtB,EAAMsB,SAASmH,EAElB,CAED,OATAF,EAAUhH,QAAUoE,EAUlBxF,yBAAOsE,MAAO,CAAEO,MAAO,SACrB7E,EAAAqB,cAAA,WAAA,KACErB,EAAKqB,cAAA,MAAA,CAAAwD,MAAM,QACX7E,EAAAqB,cAAA,MAAA,CAAKwD,MAAM,QAEb7E,EAAAqB,cAAA,QAAA,KACGmE,EAAOC,KAAI,CAACC,EAAevF,IAC1BH,EAAIqB,cAAA,KAAA,CAAAsE,IAAK,GAAGxF,KAASqF,EAAOnF,UAC1BL,EAAAqB,cAAA,KAAA,KACErB,EAACqB,cAAA4C,EAAkB,CAAAlE,MAAO2F,EAAGnB,SAAU,OAEzCvE,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACkH,EAAUA,WAAA,CACTnE,MAAM,SACNoE,KAAK,KACLR,QAAUpG,IACRgE,EAAUhE,GACV,MAAM6G,EAAOjD,EAAOkD,QACpBD,EAAKE,OAAOxI,EAAO,GACnBkI,EAAiBI,EAAK,GAGxBzI,EAAAqB,cAACuH,EAAeA,gBAAG,WAK3B5I,EAAAqB,cAAA,KAAA,KACErB,EAASqB,cAAA,KAAA,MACTrB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACgF,EACC,CAAAU,SAAW8B,IACTR,EAAiB,IAAKD,EAAUhH,QAA0ByH,GAAY,IAGtEhJ,GACAG,EAACqB,cAAAkH,EAAUA,WAAK9H,OAAAC,OAAA,CAAA,EAAAb,GAAOuE,MAAM,MAAMoE,KAAK,KAAKM,MAAM,UACjD9I,EAAAqB,cAAC0H,EAAeA,gBAAA,CAACP,KAAM,WASzC,CC7DM,SAAUQ,EAAgBnJ,GAC9B,MAAOE,EAAOa,GAAYC,EAAAA,SAAShB,EAAMiB,cAEzC,SAASG,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAED,OAAInB,EAEAC,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAACqB,cAAA4C,GAAkBlE,MAAOA,EAAOwE,SAAU,MAC3CvE,EAAAqB,cAAC4H,EAAAA,OACC,CAAAjB,QAAUpG,IACRgE,EAAUhE,GACVX,OAAgB+B,EAAU,GAC3B,WASPhD,gBAACqG,EAAgB,CAACU,SAAU9F,IAAmBpB,GAAUG,gBAACiJ,EAAAA,OAAMxI,OAAAC,OAAA,CAAA,EAAKb,GAAyB,cAElG,CCDO,SAASqJ,EAAOC,EAAGvH,GACtB,IAAIwH,EAAI,CAAA,EACR,IAAK,IAAIC,KAAKF,EAAO1I,OAAO6I,UAAUC,eAAeC,KAAKL,EAAGE,IAAMzH,EAAE6H,QAAQJ,GAAK,IAC9ED,EAAEC,GAAKF,EAAEE,IACb,GAAS,MAALF,GAAqD,mBAAjC1I,OAAOiJ,sBACtB,KAAIC,EAAI,EAAb,IAAgBN,EAAI5I,OAAOiJ,sBAAsBP,GAAIQ,EAAIN,EAAEhJ,OAAQsJ,IAC3D/H,EAAE6H,QAAQJ,EAAEM,IAAM,GAAKlJ,OAAO6I,UAAUM,qBAAqBJ,KAAKL,EAAGE,EAAEM,MACvEP,EAAEC,EAAEM,IAAMR,EAAEE,EAAEM,IAF4B,CAItD,OAAOP,CACX,CAiBO,SAASS,EAAUC,EAASC,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUtK,GAAS,IAAMuK,EAAKL,EAAUM,KAAKxK,IAAW,MAAO6B,GAAKwI,EAAOxI,GAAO,CAC3F,SAAS4I,EAASzK,GAAS,IAAMuK,EAAKL,EAAiB,MAAElK,IAAW,MAAO6B,GAAKwI,EAAOxI,GAAO,CAC9F,SAAS0I,EAAKG,GAJlB,IAAe1K,EAIa0K,EAAOC,KAAOP,EAAQM,EAAO1K,QAJ1CA,EAIyD0K,EAAO1K,MAJhDA,aAAiBiK,EAAIjK,EAAQ,IAAIiK,GAAE,SAAUG,GAAWA,EAAQpK,EAAO,KAIhB8G,KAAKwD,EAAWG,EAAY,CAC9GF,GAAML,EAAYA,EAAUU,MAAMb,EAASC,GAAc,KAAKQ,OACtE,GACA,CC1EA,MAAMK,EAAYC,EAAYA,cAAC,KAAO,CACpCC,KAAM,CACJ,4BAA6B,CAC3BC,YAAa,EACbC,aAAc,QAKd,SAAUC,EAAUpL,GACxB,MAAMsG,SAAEA,GAAwBtG,EAAXqL,EAAMhC,EAAKrJ,EAA1B,CAAuB,cACvBsL,QAAEA,GAAYP,IAEpB,OACE5K,EAAAqB,cAAC+J,YAAgB3K,OAAAC,OAAA,CAAC2K,UAAWF,EAAQL,MAAUI,GAC5C/E,EAGP,CCbA,MAAMyE,EAAYC,EAAYA,cAAC,CAACS,GAASzG,QAAO0G,WAA+B,CAC7EC,MAAO,CACLjH,SAAUM,EACV4G,OAAQ,GAAGH,EAAM/J,QAAQmK,YACzBxG,QAASqG,EAAO,EAAID,EAAM/J,QAAQoK,GAClC,4BAA6B,CAC3BzG,QAASqG,EAAO,EAAI,GAEtB,QAAS,CACP1G,MAAO,OACPN,SAAU,QAEZ,UAAW,CACTM,MAAO,OACPN,SAAU,aAUVqH,EAAoC,CACxCC,OAAQ,KACRC,OAAQ,KACRC,YAAY,GAGR,SAAUC,EAAMnM,GACpB,MAAMyH,EAA4D2E,EAAAA,yBAChE,QACAL,EACA/L,IAHIwL,UAAEA,EAASlF,SAAEA,EAAQtB,MAAEA,EAAK0G,KAAEA,EAAIW,SAAEA,GAIzC5E,EAJsD4D,EAAMhC,EAAA5B,EAAvD,CAAyD,YAAA,WAAA,QAAA,OAAA,cAKzD6D,QAAEA,EAAOgB,GAAEA,GAAOvB,EAAU,CAAE/F,QAAO0G,QAAQ,CAAE9H,KAAM,QAASyI,aAEpE,OACElM,gBAACoM,EAAAA,MAAK3L,OAAAC,OAAA,CAAC2K,UAAWc,EAAGhB,EAAQK,MAAOH,IAAgBH,GACjD/E,EAGP,CC/CM,SAAUkG,EAASxM,GACvB,MAAMsG,SAAEA,GAAwBtG,EAAXqL,EAAMhC,EAAKrJ,EAA1B,CAAuB,aAC7B,OACEG,gBAACiL,EAAS,KACRjL,EAACqB,cAAA2K,mBAAUd,GAAS/E,GAG1B,CCPM,SAAUmG,EAAUC,GACxB,MAAM9B,EAAiC,CAAA,EAEvC,IAAK,MAAM+B,KAAW5E,MAAMC,KAAK0E,EAAKE,UAChCD,aAAmBpG,iBACrBsG,EAAkBjC,EAAQ+B,GACjBA,aAAmBG,oBAC5BlC,EAAO+B,EAAQ/I,MAAQ+I,EAAQzM,MACtByM,aAAmBI,mBAC5BC,EAAmBpC,EAAQ+B,GAI/B,OAAO/B,CACT,CASA,SAASiC,EAAkBjC,EAAgCzE,GACrDA,EAAG8G,WAKU,aAAZ9G,EAAGhE,MAAmC,UAAZgE,EAAGhE,MAAsBgE,EAAG+G,WAK3DtC,EAAOzE,EAAGvC,MAAQuC,EAAGjG,MACvB,CAQA,SAAS8M,EAAmBpC,EAAgCzE,GAC1DyE,EAAOzE,EAAGvC,MAAQuC,EAAGjG,KACvB,CCvCM,SAAUiN,EAAKnN,GACnB,OACEG,EACEqB,cAAA,OAAA,CAAAiD,MAAOzE,EAAMyE,MAAK,cACLzE,EAAMoN,OACnBC,SAAWtL,IACTA,EAAEiE,iBACF,MAAMsH,EAAWb,EAAU1K,EAAEyD,QACzBxF,EAAMqN,UACRrN,EAAMqN,SAASC,EAChB,GAGFtN,EAAMsG,SAGb,CCnBM,SAAUiH,EAAKvN,GACnB,OACEG,EAAKqB,cAAA,MAAA,CAAAgM,MAAM,6BAA6BC,QAAQ,cAAchJ,MAAO,CAAEO,MAAOhF,EAAM2I,KAAM1D,OAAQjF,EAAM2I,OACtGxI,EAA2BqB,cAAA,QAAA,KAAA,gBAC3BrB,EAAMqB,cAAA,OAAA,CAAAkK,KAAM1L,EAAM0L,MAAQ,UAAWgC,EAAE,mEACvCvN,EACEqB,cAAA,OAAA,CAAAkK,KAAM1L,EAAM0L,MAAQ,UACpBgC,EAAE,qJAEJvN,EACEqB,cAAA,OAAA,CAAAkK,KAAM1L,EAAM0L,MAAQ,UACpBgC,EAAE,+FAEJvN,EACEqB,cAAA,OAAA,CAAAkK,KAAM1L,EAAM0L,MAAQ,UACpBgC,EAAE,4EAEJvN,EAAAqB,cAAA,OAAA,CAAMkK,KAAM1L,EAAM0L,MAAQ,UAAWgC,EAAE,6DAG7C,CCzBgB,SAAAC,EACdvG,EACAwG,aAEA,OAEuC,QAFhCtG,EACoE,QADpEC,EAAc,QAAdE,EAAAL,aAAO,EAAPA,EAASI,aAAK,IAAAC,OAAA,EAAAA,EACjBoG,QAAQrG,IAAS,IAAAC,EAAC,OAAAqG,EAAkC,QAAhBrG,EAAAD,EAAMoG,kBAAU,IAAAnG,OAAA,EAAAA,EAAG,GAAImG,EAAW,WAAC,IAAArG,OAAA,EAAAA,EACvE3B,KAAK4B,IAAU,IAAAC,EAAA,OAAe,QAAfA,EAAAD,EAAME,eAAS,IAAAD,OAAA,EAAAA,EAAA5D,IAAI,WAAC,IAAAyD,OAAA,EAAAA,EACnCyG,KAAK,KACX,CAEgB,SAAAC,EACd5G,EACAwG,SAEA,OAAqB,QAAdnG,EAAAL,eAAAA,EAASI,aAAK,IAAAC,OAAA,EAAAA,EAAEoG,QAAQrG,IAAS,IAAAC,EAAC,OAAAqG,EAAqC,QAAnBrG,EAAAD,EAAMoG,kBAAa,IAAAnG,OAAA,EAAAA,EAAA,GAAImG,EAAW,GAC/F,CAEA,SAASE,EAAkBG,EAA2BC,GAEpD,GAAID,IAAUC,EACZ,OAAO,EAET,IAAKD,IAAUC,EACb,OAAO,EAET,MAAMC,EAAOF,EAAMrE,QAAQ,KAC3B,GAAIuE,GAAQ,GAAKF,EAAMG,UAAUD,EAAO,KAAOD,EAC7C,OAAO,EAET,MAAMG,EAAOH,EAAMtE,QAAQ,KAC3B,OAAIyE,GAAQ,GAAKH,EAAME,UAAUC,EAAO,KAAOJ,CAIjD,CCtBM,SAAUK,EAAetO,GAC7B,MAAMuD,EAAUD,KACT8D,EAASmH,GAAcvN,EAAQA,WACtC,OACEb,EAACqB,cAAA2L,EACC,CAAA1I,MAAO,CAAEC,SAAU,KACnB2I,SAAiBC,GAAoCtD,EAAAwE,UAAA,OAAA,GAAA,YACnD,IACExO,EAAMyO,yBACElL,EAAQmL,gBAAgB,CAC5BC,MAAO3O,EAAM2O,MACbC,YAAatB,EAASsB,cAK3B,CAFC,MAAOC,GACPN,EAAWM,EACZ,CACH,KAEA1O,EAACqB,cAAAsN,UAAOC,GAAI,CAAEC,cAAe,WAC3B7O,EAAAqB,cAAC+L,EAAI,CAAC5E,KAAM,KACZxI,EAACqB,cAAAyN,EAAAA,8BAEH9O,EAAAqB,cAAC0N,EAAAA,MAAK,CAACxN,QAAQ,MACbvB,EAAAqB,cAACa,EAAAA,UAAS,CACRuB,KAAK,cACLuL,MAAM,eACN7M,YAAY,aACZ8M,UAAU,EACVC,WAAW,EACXC,MAAO3B,EAAkBvG,EAAS,eAEpCjH,EAACqB,cAAA+N,QAAKtG,MAAM,SAASN,KAAK,oDACoB,IAC5CxI,EAAAqB,cAAC8D,EAAMA,OAAA,CAACC,KAAK,mCAA8D,kBAC1E,QACDpF,EAAAqB,cAAC8D,EAAMA,OAAA,CAACC,KAAK,iCAAmE,0BAGpFpF,EAACqB,cAAAC,EAAKA,MAAC,CAAA+N,SAAS,QAAQC,GAAG,KAAK7N,QAAM,GACpCzB,EAACqB,cAAA4H,EAAAA,QAAOjH,KAAK,UAAgC,mBAIrD,CCtDgB,SAAAuN,EAAgB/K,EAAagL,GAC3C,MAAMC,EAAOC,SAASC,qBAAqB,QAAQ,GAC7CC,EAASF,SAASrO,cAAc,UACtCuO,EAAOC,OAAQ,EACfD,EAAOpL,IAAMA,EACboL,EAAOJ,OAASA,GAAU,KAC1BC,EAAKK,YAAYF,EACnB,CCUM,SAAUG,EAAalQ,GAC3B,MAAMuD,EAAUD,KACV6M,eAAEA,EAAcC,uBAAEA,GAA2BpQ,EAC7CqQ,EAAYlP,SAAuB,OAClCmP,EAAcC,GAAmBvP,EAAQA,SAA4B,oBAAXwP,SAC1DC,EAAaC,GAAkB1P,EAAQA,UAAU,IACjD2P,EAAgBC,GAAqB5P,EAAQA,UAAU,GAsB9D,OApBA6P,EAAAA,WAAU,KACc,oBAAXL,QAKNC,IACHD,OAAOM,SAASC,GAAGC,WAAW,CAC5BC,UAAWd,EACXe,SAAUd,IAEZM,GAAe,IAGbL,EAAU9O,UAAYoP,IACxBH,OAAOM,SAASC,GAAGI,aAAad,EAAU9O,QAAS,CAAA,GACnDqP,GAAkB,KAdlBlB,EAAgB,0CAA0C,IAAMa,GAAgB,IAejF,GACA,CAAChN,EAAS4M,EAAgBM,EAAaH,EAAcD,EAAWM,EAAgBP,IAE9ED,EAIEhQ,EAAKqB,cAAA,MAAA,CAAAqG,IAAKwI,IAHR,IAIX,CAEM,SAAUe,EAAkBC,WAChC,GAAIA,EACF,OAAOA,EAGT,MAAMC,EAASC,OAAOC,SAASC,SAAW,KAAOF,OAAOC,SAASE,KAEjE,OADqE,QAA3CnK,EAA+B,QAA/BE,EAAA,oOAA+B,EAAAA,EAAEkK,MAAM,YAAI,IAAApK,EAAAA,EAAI,IACnDqK,SAASN,GACtB,gFADT,CAKF,CC7DM,SAAUO,EAAcC,GACF,oBAAfC,YACTrC,EAAgB,kDAAoDoC,EAExE,CAOM,SAAUE,EAAaF,GAC3B,OAAO,IAAIzH,SAAQ,CAACC,EAASC,KAC3BwH,WAAWE,OAAM,IAAWjI,EAAAwE,UAAA,OAAA,GAAA,YAC1B,IACElE,QAAcyH,WAAWG,QAAQJ,EAAS,CAAEK,OAAQ,WAGrD,CAFC,MAAOtD,GACPtE,EAAOsE,EACR,CACF,KAAC,GAEN,CCGM,SAAUuD,EAAYpS,GAC1B,MAAMmQ,EAAiBiB,EAAkBpR,EAAMmQ,gBACzCkC,EAAmBrS,EAAMqS,iBACzB9O,EAAUD,KACT8D,EAASmH,GAAcvN,EAAQA,WAChCsR,EAAStE,EAAuB5G,OAASjE,GAI/C,OAFA0N,EAASA,WAAC,IAAMgB,EAAcQ,IAAmB,CAACA,IAGhDlS,EAACqB,cAAA2L,EACC,CAAA1I,MAAO,CAAEC,SAAU,KACnB2I,SAAiBC,GAAoCtD,EAAAwE,UAAA,OAAA,GAAA,YACnD,IACE,MAAM+D,QAAuBP,EAAaK,GAC1CrS,EAAMyO,yBACElL,EAAQiP,aAAa,CACzBC,UAAWzS,EAAMyS,UACjBC,UAAWpF,EAASoF,UACpBC,SAAUrF,EAASqF,SACnBC,MAAOtF,EAASsF,MAChBC,SAAUvF,EAASuF,SACnBC,SAAgC,SAAtBxF,EAASwF,SACnBT,mBACAE,mBAKL,CAFC,MAAO1D,GACPN,EAAWM,EACZ,CACH,KAEA1O,EAAAqB,cAACsN,EAAMA,OAAA,CAACC,GAAI,CAAEC,cAAe,WAAahP,EAAMsG,UAC/CgM,GACCnS,EAAAqB,cAACuR,EAAAA,MAAK,CAACC,KAAM7S,EAACqB,cAAAyR,EAAeA,gBAAC,CAAAtK,KAAM,KAAQM,MAAM,OAC/CqJ,EAAO1M,KAAK4B,YAAU,OACrBrH,qCAAiB,mBAAmB2F,YAAK2B,EAAAD,EAAME,8BAAS7D,MACtC,UAAf2D,EAAME,eAAS,IAAAH,OAAA,EAAAA,EAAA1D,KAEnB,KAGJsM,GACChQ,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAAAqB,cAACC,QAAM,CAAA+N,SAAS,SAAShG,EAAE,KAAK/E,MAAO,CAAEQ,OAAQ,KAC/C9E,EAACqB,cAAA0O,EACC,CAAAC,eAAgBA,EAChBC,uBAA+B8C,GAAsClJ,EAAAwE,UAAA,OAAA,GAAA,YACnE,UACQjL,EAAQ4P,YACdnT,EAAMyO,yBACElL,EAAQ6P,iBAAiB,CAC7BjD,eAAgB+C,EAAS7B,SACzBgC,iBAAkBH,EAASI,WAC3BC,YAAY,IAKjB,CAFC,MAAO1E,GACPN,EAAWM,EACZ,CACF,OAGL1O,EAAAqB,cAACgS,UAAO,CAACrE,MAAM,KAAKsE,cAAc,SAASC,GAAG,QAGlDvT,EAAAqB,cAAC0N,EAAAA,MAAK,CAACxN,QAAQ,MACbvB,EAAAqB,cAACa,EAASA,UAAA,CACRuB,KAAK,YACLzB,KAAK,OACLgN,MAAM,aACN7M,YAAY,aACZ8M,UAAU,EACVC,WAAW,EACXC,MAAO3B,EAAkBvG,EAAS,eAEpCjH,EAAAqB,cAACa,EAAAA,UAAS,CACRuB,KAAK,WACLzB,KAAK,OACLgN,MAAM,YACN7M,YAAY,YACZ8M,UAAU,EACVE,MAAO3B,EAAkBvG,EAAS,cAEpCjH,EAAAqB,cAACa,EAAAA,UAAS,CACRuB,KAAK,QACLzB,KAAK,QACLgN,MAAM,QACN7M,YAAY,kBACZ8M,UAAU,EACVE,MAAO3B,EAAkBvG,EAAS,WAEpCjH,EAACqB,cAAAmS,gBACC,CAAA/P,KAAK,WACLuL,MAAM,WACNyE,aAAa,MACbxE,UAAU,EACVE,MAAO3B,EAAkBvG,EAAS,cAEpCjH,EAACqB,cAAA+N,QAAKtG,MAAM,SAASN,KAAK,oDACoB,IAC5CxI,EAAAqB,cAAC8D,EAAMA,OAAA,CAACC,KAAK,mCAA8D,kBAC1E,QACDpF,EAAAqB,cAAC8D,EAAMA,OAAA,CAACC,KAAK,iCAAmE,oBAC3E,KACPpF,EAACqB,cAAA+N,QAAKtG,MAAM,SAASN,KAAK,2DAC2B,IACnDxI,EAAAqB,cAAC8D,EAAMA,OAAA,CAACC,KAAK,uCAAkE,kBAC9E,QACDpF,EAAAqB,cAAC8D,EAAMA,OAAA,CAACC,KAAK,qCAAuE,gCAGxFpF,EAACqB,cAAAC,EAAKA,MAAC,CAAA+N,SAAS,QAAQC,GAAG,KAAK7N,QAAM,GACpCzB,EAAAqB,cAACqS,EAAQA,SAAA,CAACjQ,KAAK,WAAWuL,MAAM,cAAcxG,KAAK,OACnDxI,EAACqB,cAAA4H,EAAAA,QAAOjH,KAAK,UAAgC,mBAIrD,CCnHM,SAAU2R,EAAmB9T,GACjC,MAAM+T,aAAEA,EAAYC,iBAAEA,EAAgBC,WAAEA,EAAUxF,mBAAEA,EAAkBnI,SAAEA,GAAkCtG,EAArBkU,EAAgB7K,EAAKrJ,EAApG,CAAA,eAAA,mBAAA,aAAA,qBAAA,aACAuD,EAAUD,IACV6M,EAAiBiB,EAAkBpR,EAAMmQ,iBACxC/I,EAASmH,GAAcvN,EAAQA,WAChCsR,EAAStE,EAAuB5G,OAASjE,GAE/C,SAAegQ,6CACTY,UACIxQ,EAAQ4P,eAEjB,CAED,OACEhT,EAACqB,cAAA2L,EACC,CAAA1I,MAAO,CAAEC,SAAU,KACnB2I,SAAWC,IACT6F,IACGnM,MAAK,IACJzD,EAAQ4Q,WAAUvT,OAAAC,OAAAD,OAAAC,OAAA,GACbqT,GAAgB,CACnBtB,MAAOtF,EAASsF,MAChBC,SAAUvF,EAASuF,SACnBC,SAAgC,OAAtBxF,EAASwF,cAGtB9L,KAAKyH,GACLtH,MAAMoH,EAAW,GAGtBpO,EAACqB,cAAAsN,EAAAA,OAAO,CAAAC,GAAI,CAAEC,cAAe,WAAa1I,GACzCgM,GACCnS,EAAAqB,cAACuR,EAAAA,MAAK,CAACC,KAAM7S,EAACqB,cAAAyR,EAAeA,gBAAC,CAAAtK,KAAM,KAAQM,MAAM,OAC/CqJ,EAAO1M,KAAK4B,YAAU,OACrBrH,qCAAiB,mBAAmB2F,YAAK2B,EAAAD,EAAME,8BAAS7D,MACtC,UAAf2D,EAAME,eAAS,IAAAH,OAAA,EAAAA,EAAA1D,KAEnB,KAGJsM,GACChQ,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAAAqB,cAACC,QAAM,CAAA+N,SAAS,SAAShG,EAAE,KAAK/E,MAAO,CAAEQ,OAAQ,KAC/C9E,EAACqB,cAAA0O,EACC,CAAAC,eAAgBA,EAChBC,uBAAyB8C,IACvBC,IACGnM,MAAK,IACJzD,EAAQ6P,iBAAiBxS,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACpBqT,GAAgB,CACnBb,iBAAkBH,EAASI,gBAG9BtM,KAAKhH,EAAMyO,oBACXtH,MAAMoH,EAAW,KAI1BpO,EAAAqB,cAACgS,UAAO,CAACrE,MAAM,KAAKsE,cAAc,SAASC,GAAG,QAGlDvT,EAAAqB,cAAC0N,EAAAA,MAAK,CAACxN,QAAQ,MACbvB,EAAAqB,cAACa,EAASA,UAAA,CACRuB,KAAK,QACLzB,KAAK,QACLgN,MAAM,QACN7M,YAAY,kBACZ8M,UAAU,EACVC,WAAW,EACXC,MAAO3B,EAAkBvG,EAAS,WAEpCjH,EAAAqB,cAACmS,EAAAA,cAAa,CACZ/P,KAAK,WACLzB,KAAK,WACLgN,MAAM,WACNyE,aAAa,MACbxE,UAAU,EACVE,MAAO3B,EAAkBvG,EAAS,eAGtCjH,EAAAqB,cAACC,QAAK,CAAC+N,SAAS,QAAQC,GAAG,KAAK/N,QAAS,EAAGE,QAAM,GAC/CoS,GACC7T,EAAAqB,cAAC8D,EAAAA,OAAM,CAAC8O,UAAU,SAASjS,KAAK,SAAS8G,MAAM,SAASd,QAAS6L,EAAkBrL,KAAK,MAAI,mBAI7FsL,GACC9T,EAAAqB,cAAC8D,EAAAA,OAAM,CAAC8O,UAAU,SAASjS,KAAK,SAAS8G,MAAM,SAASd,QAAS8L,EAAYtL,KAAK,MAAI,YAIxFxI,EAACqB,cAAAqS,EAAQA,SAAC,CAAA9C,GAAG,WAAWnN,KAAK,WAAWuL,MAAM,cAAcxG,KAAK,KAAKoG,GAAI,CAAEsF,WAAY,KACxFlU,EAACqB,cAAA4H,EAAAA,QAAOjH,KAAK,UAAyB,YAI9C,CCtHM,SAAUmS,EAAkBtU,GAChC,MAAMuD,EAAUD,IAChB,OACEnD,gBAAC+O,EAAAA,MAAK,KACJ/O,EAACqB,cAAAsN,UAAOC,GAAI,CAAEC,cAAe,WAC3B7O,EAAAqB,cAAC+L,EAAI,CAAC5E,KAAM,KACZxI,EAACqB,cAAAyN,EAAAA,8BAEFjP,EAAMuU,YAAY3O,KAAK4O,YAAkC,OACxDrU,EAAAqB,cAACiT,iBAAc,CACb3O,IAAK0O,EAAWzD,GAChB5I,QAAS,KACP5E,EACGmR,KAAK,eAAgB,CACpB/F,MAAO3O,EAAM2O,MACblL,QAAS+Q,EAAWzD,KAErB/J,KAAKhH,EAAMyO,oBACXtH,MAAMwN,QAAQC,IAAI,GAGvBzU,EAAAqB,cAACC,EAAAA,MAAK,KACJtB,EAAAqB,cAACqT,EAAAA,OAAM,CAAC5I,OAAO,OACf9L,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEqQ,KAAM,IAClB3U,EAAAqB,cAAC+N,EAAAA,KAAK,CAAA5G,KAAK,KAAKoM,OAAQ,KACH,UAAlBP,EAAW/Q,eAAO,IAAAgE,OAAA,EAAAA,EAAEG,SAEvBzH,EAACqB,cAAA+N,EAAIA,MAACtG,MAAM,SAASN,KAAK,MACH,UAApB6L,EAAWQ,eAAS,IAAAzN,OAAA,EAAAA,EAAAK,WAK9B,IAGP,CCpCM,SAAUqN,EAAgBjV,GAC9B,MAAMuD,EAAUD,IAChB,OACEnD,EAACqB,cAAA2L,EACC,CAAA1I,MAAO,CAAEC,SAAU,KACnB2I,SAAWC,IACT/J,EACGmR,KAAK,aAAc,CAClB/F,MAAO3O,EAAM2O,MACbuG,MAAOtU,OAAOuU,KAAK7H,GAAUS,KAAK,OAEnC/G,KAAKhH,EAAMyO,oBACXtH,MAAMwN,QAAQC,IAAI,GAGvBzU,EAAAqB,cAAC0N,EAAAA,MAAK,KACJ/O,EAACqB,cAAAsN,UAAOC,GAAI,CAAEC,cAAe,WAC3B7O,EAAAqB,cAAC+L,EAAI,CAAC5E,KAAM,KACZxI,EAACqB,cAAAyN,EAAAA,4BAEH9O,EAACqB,cAAA0N,EAAAA,YACGlP,EAAMkV,OAAS,UAAUvD,MAAM,KAAK/L,KAAKwP,GACzCjV,gBAAC0T,EAAAA,SAAQ,CAAC/N,IAAKsP,EAAWrE,GAAIqE,EAAWxR,KAAMwR,EAAWjG,MAAOiG,EAAWC,gBAAc,OAG9FlV,EAACqB,cAAAC,SAAM+N,SAAS,QAAQC,GAAG,MACzBtP,EAACqB,cAAA4H,EAAAA,OAAO,CAAAjH,KAAK,yBAKvB,CC3CO,MAAMmT,EAA6B,CACxC,OACA,gBACA,WACA,OACA,YACA,YACA,qBCJIvK,EAAYC,EAAAA,cAAcS,IAAW,CACzCR,KAAM,CACJrD,QAAS,OACT2N,oBAAqB,UACrB3J,OAAQ,EAER,iBAAkB,CAChBvG,QAAS,GAAGoG,EAAM/J,QAAQ8T,QAAQ/J,EAAM/J,QAAQ8T,OAChDC,UAAW,eAAehK,EAAMiK,OAAOC,KAAK,KAC5C/J,OAAQ,IAIZgK,QAAS,CACPL,oBAAqB,UAErB,iBAAkB,CAChBlQ,QAAS,KAAKoG,EAAM/J,QAAQmU,QAAQpK,EAAM/J,QAAQmU,SAClDC,OAAQ,QAUR,SAAUC,EAAgB/V,GAC9B,MAAMsG,SAAEA,EAAQsP,QAAEA,GAAY5V,GACxBsL,QAAEA,EAAOgB,GAAEA,GAAOvB,IACxB,OAAO5K,EAAAqB,cAAA,KAAA,CAAIgK,UAAWc,EAAGhB,EAAQL,KAAM,CAAE,CAACK,EAAQsK,SAAUA,KAAatP,EAC3E,CAOM,SAAU0P,EAAqBhW,GACnC,OACEG,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAAKqB,cAAA,KAAA,KAAAxB,EAAMiW,MACX9V,EAAAqB,cAAA,KAAA,KAAKxB,EAAMsG,UAGjB,CCzCM,SAAU4P,GAAuBlW,GACrC,OAAOG,EAAAqB,cAAArB,EAAAwH,SAAA,KAAGwO,wBAAsBnW,EAAME,OACxC,CCFM,SAAUkW,GAAcpW,GAC5B,OAAOG,EAAAqB,cAAArB,EAAAwH,SAAA,KAAG0O,eAAarW,EAAME,OAC/B,CCHM,SAAUoW,GAAoBtW,GAClC,MAAMuW,EAAevW,EAAME,MAC3B,IAAKqW,EACH,OAAO,KAGT,MAAMC,EAAU,GAwBhB,OAtBID,EAAarW,OACfsW,EAAQ7V,KAAK4V,EAAarW,QAGxBqW,EAAazU,KAAOyU,EAAaE,UACnCD,EAAQ7V,KAAK,MAET4V,EAAazU,KACf0U,EAAQ7V,KAAK4V,EAAazU,KAGxByU,EAAazU,KAAOyU,EAAaE,QACnCD,EAAQ7V,KAAK,KAGX4V,EAAaE,QACfD,EAAQ7V,KAAK4V,EAAaE,QAG5BD,EAAQ7V,KAAK,MAGRR,EAAAqB,cAAArB,EAAAwH,SAAA,KAAG6O,EAAQzI,KAAK,IAAI2I,OAC7B,CC9BM,SAAUC,GAAqB3W,SACnC,MAAM4W,EAAgB5W,EAAME,MAC5B,OAAK0W,EAKHzW,EAAAqB,cAAArB,EAAAwH,SAAA,KACGiP,EAAchT,KACdgT,EAAchT,MAAQ,KACD,QAArB6D,EAAAmP,EAAcC,eAAO,IAAApP,OAAA,IAAE7B,KAAI,CAACiR,EAASvW,IACpCH,EAACqB,cAAA8U,GAAoB,CAAAxQ,IAAK,WAAaxF,EAAOJ,MAAO2W,OARlD,IAYX,CCdM,SAAUC,GAAiB9W,GAC/B,MAAM4D,EAAO5D,EAAME,MACnB,OAAK0D,EAIEzD,EAAAqB,cAAArB,EAAAwH,SAAA,KAAGoP,EAAeA,gBAACnT,EAAM5D,EAAMgX,UAH7B,IAIX,CCTM,SAAUC,GAAkBjX,WAChC,OACEG,EAAAqB,cAAA,MAAA,KACc,QAAXiG,EAAAzH,EAAME,aAAK,IAAAuH,OAAA,IAAEgP,YAAqB,QAAXlP,EAAAvH,EAAME,aAAK,IAAAqH,OAAA,IAAErH,MAG3C,CCLM,SAAUgX,GAAgBlX,GAC9B,OAAOG,EAAAqB,cAAArB,EAAAwH,SAAA,KAAGwP,iBAAenX,EAAME,OACjC,CCFM,SAAUkX,GAAapX,GAC3B,OAAOG,EAAAqB,cAAArB,EAAAwH,SAAA,KAAG0P,cAAYrX,EAAME,OAC9B,CCFM,SAAUoX,GAAatX,GAC3B,MAAME,EAAQF,EAAME,MACpB,OAAKA,EAKHC,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAAAqB,cAAC0V,GAAgB,CAAAhX,MAAOA,EAAMqX,kBAE9BpX,EAACqB,cAAA0V,GAAgB,CAAAhX,MAAOA,EAAMsX,eAPzB,IAUX,CCPM,SAAUC,GAAYzX,GAC1B,MAAM0X,EAAWC,EAAAA,eACXC,GAAEA,EAAEC,OAAEA,EAAM1I,MAAEA,EAAKhH,QAAEA,EAAO7B,SAAEA,GAAsBtG,EAAT8X,EAAIzO,EAAKrJ,EAApD,CAAA,KAAA,SAAA,QAAA,UAAA,aAEN,IAAIuF,EAwBN,SAAiBqS,GACf,GAAIA,EAAI,CACN,GAAkB,iBAAPA,EACT,OAUN,SAAuBA,GACrB,GAAIA,EAAGpT,WAAW,YAAcoT,EAAGpT,WAAW,aAAeoT,EAAGpT,WAAW,KACzE,OAAOoT,EAET,MAAO,IAAMA,CACf,CAfaG,CAAcH,GAChB,GAAI,iBAAkBA,EAC3B,OAeN,SAAyBA,GACvB,MAAO,IAAIA,EAAGI,gBAAgBJ,EAAG7G,IACnC,CAjBakH,CAAgBL,GAClB,GAAI,cAAeA,EACxB,OAiBN,SAA0BA,GACxB,MAAO,IAAIA,EAAGM,WAChB,CAnBaC,CAAiBP,EAE3B,CACD,MAAO,GACT,CAnCaQ,CAAQR,GAKnB,OAJIC,IACFtS,GAAQ,IAAMsS,GAId1X,EAAAqB,cAAC8D,SAAM1E,OAAAC,OAAA,CACL0E,KAAMA,EACM,aAAA4J,EACZhH,QAAUpG,IACRgE,EAAUhE,GACNoG,EACFA,IACSyP,GACTF,EAASnS,EACV,GAECuS,GAEHxR,EAGP,CC9BM,SAAU+R,GAAiBrY,GAC/B,IAAKA,EAAME,MACT,OAAO,KAGT,MAAMoY,EAAgBtY,EAAME,MAAM0H,SAAW5H,EAAME,MAAMgY,WAAaK,EAAAA,UAAUvY,EAAME,OAItF,OAAmB,IAAfF,EAAMwY,MAAkBxY,EAAME,MAAMgY,UAC/B/X,EAAAqB,cAACiW,GAAW,CAACG,GAAI5X,EAAME,OAAQoY,GAE/BnY,EAAAqB,cAAArB,EAAAwH,SAAA,KAAG2Q,EAEd,CCXM,SAAUG,GAAqBzY,aACnC,MAAM0Y,EAAW1Y,EAAM0Y,SACjB/S,EAAqB,QAAZ8B,EAAAzH,EAAM2F,cAAM,IAAA8B,EAAAA,EAAI,GACzBkR,EAAmC,QAApBrR,EAAa,QAAbC,EAAAmR,EAASvW,YAAI,IAAAoF,OAAA,EAAAA,EAAG,UAAI,IAAAD,OAAA,EAAAA,EAAAsR,KACzC,OACEzY,gCACGwF,EAAOC,KAAI,CAACC,EAAQvF,IACnBH,EAAKqB,cAAA,MAAA,CAAAsE,IAAK,GAAGxF,KAASqF,EAAOnF,UAC3BL,EAAAqB,cAACqX,GAAuB,CACtBC,cAAc,EACdJ,SAAUA,EACVC,aAAcA,EACdzY,MAAO2F,EACPkT,oBAAqB/Y,EAAM+Y,oBAC3BP,KAAMxY,EAAMwY,UAMxB,CCIM,SAAUK,GAAwB7Y,SACtC,MAAM0Y,SAAEA,EAAQC,aAAEA,EAAYzY,MAAEA,GAAUF,EAE1C,GAAsB,OAAlB0Y,eAAAA,EAAUM,OAAgBhZ,EAAM8Y,aAClC,MAAqB,eAAjBH,EACKxY,EAACqB,cAAAkE,EAAuB,CAAAC,OAAQzF,EAAOwE,SAAU1E,EAAM0E,WAG9DvE,EAACqB,cAAAiX,GACC,CAAAC,SAAUA,EACV/S,OAAQzF,EACR6Y,oBAAqB/Y,EAAM+Y,oBAC3BP,KAAMxY,EAAMwY,OAKlB,OAAQG,GACN,KAAKM,EAAYA,aAACC,QAChB,OAAO/Y,qCAAagD,IAAVjD,EAAsB,GAAKiZ,QAAQjZ,GAAOkZ,YACtD,KAAKH,EAAAA,aAAaI,aAClB,KAAKJ,EAAAA,aAAaL,KAClB,KAAKK,EAAAA,aAAaK,KAClB,KAAKL,EAAAA,aAAaM,QAClB,KAAKN,EAAAA,aAAaO,YAClB,KAAKP,EAAAA,aAAaQ,OAClB,KAAKR,EAAAA,aAAaS,YAClB,KAAKT,EAAAA,aAAaU,IAClB,KAAKV,EAAYA,aAAC3U,IAChB,OAAOnE,EAAAqB,cAAArB,EAAAwH,SAAA,KAAGzH,GACZ,KAAK+Y,EAAYA,aAACW,UAChB,OAAOzZ,gBAACkY,GAAgB,CAACnY,MAAO,CAAEgY,UAAWhY,GAASsY,KAAMxY,EAAMwY,OACpE,KAAKS,EAAAA,aAAaY,SAClB,KAAKZ,EAAYA,aAACa,QAChB,OAAO3Z,gCAAG4Z,EAAcA,eAAC7Z,IAC3B,KAAK+Y,EAAYA,aAACe,SAChB,OAAO7Z,EAAAqB,cAAA,MAAA,KAAMtB,GACf,KAAK+Y,EAAYA,aAACgB,QAChB,OAAO9Z,gBAACJ,EAAc,CAACG,MAAOA,IAChC,KAAK+Y,EAAYA,aAACiB,WAChB,OAAO/Z,EAAAqB,cAAArB,EAAAwH,SAAA,KAAGzH,eAAAA,EAAO2D,MACnB,KAAKoV,EAAYA,aAACkB,WAChB,OAAOha,EAACqB,cAAA4C,EAAkB,CAAAlE,MAAOA,EAAOwE,SAAU1E,EAAM0E,WAC1D,KAAKuU,EAAYA,aAACmB,gBAChB,OAAOja,gBAAC+V,GAAsB,CAAChW,MAAOA,IACxC,KAAK+Y,EAAYA,aAACoB,OAChB,OAAOla,gBAACiW,GAAa,CAAClW,MAAOA,IAC/B,KAAK+Y,EAAYA,aAACqB,cAChB,OAAOna,gBAACwW,GAAoB,CAACzW,MAAOA,IACtC,KAAK+Y,EAAYA,aAACsB,aAChB,OAAOpa,gBAACmW,GAAmB,CAACpW,MAAOA,IACrC,KAAK+Y,EAAYA,aAACuB,UAChB,OAAOra,gBAAC2W,GAAgB,CAAC5W,MAAOA,IAClC,KAAK+Y,EAAYA,aAACwB,WAChB,OAAOta,gBAAC8W,GAAiB,CAAC/W,MAAOA,IACnC,KAAK+Y,EAAYA,aAACyB,OAChB,OAAOva,gCAAGwa,EAAYA,aAACza,IACzB,KAAK+Y,EAAAA,aAAa2B,SAClB,KAAK3B,EAAYA,aAAC4B,SAChB,OAAO1a,gBAAC+W,GAAe,CAAChX,MAAOA,IACjC,KAAK+Y,EAAYA,aAAC6B,MAChB,OAAO3a,gBAACiX,GAAY,CAAClX,MAAOA,IAC9B,KAAK+Y,EAAYA,aAAC8B,MAChB,OAAO5a,gBAACmX,GAAY,CAACpX,MAAOA,IAC9B,KAAK+Y,EAAYA,aAAC+B,UAChB,OAAO7a,EAACqB,cAAA6W,GAAiB,CAAAnY,MAAOA,EAAOsY,KAAMxY,EAAMwY,OACrD,KAAKS,EAAYA,aAACgC,OAChB,OAAO9a,gCAAG+a,EAAYA,aAAChb,IACzB,KAAK+Y,EAAAA,aAAakC,OAClB,KAAKlC,EAAYA,aAACmC,aAChB,OACEjb,EAACqB,cAAA6Z,GACC,CAAAnb,MAAO,CAAEiC,KAAMwW,EAAczY,SAC7B0V,SAAS,EACTmD,oBAAqB/Y,EAAM+Y,sBAGjC,QACE,KAAKL,eAAAA,EAAU4C,MACb,MAAMC,MAAM,+BAA+Bvb,EAAM2Y,iDAEnD,OACExY,EAACqB,cAAA6Z,IACCnb,MAAO,CAAEiC,KAAMqZ,EAAaA,cAAe,UAAd9C,aAAA,EAAAA,EAAU4C,YAAI,IAAA7T,OAAA,EAAAA,EAAEkK,MAAM,MAAmBzR,SACtE0V,SAAS,EACTmD,oBAAqB/Y,EAAM+Y,sBAIrC,CAYgB,SAAA0C,GAAgBC,EAAqBJ,GACnD,MAAMK,EAAcC,EAAAA,sBAAsBF,EAASJ,GACnD,OAAKK,EAID5T,MAAM8T,QAAQF,GACT,CAACA,EAAY/V,KAAK7D,GAAMA,EAAE7B,QAAQyb,EAAY,GAAGxZ,MAGnD,CAACwZ,EAAYzb,MAAOyb,EAAYxZ,MAP9B,MAACgB,EAAW,YAQvB,CCxIM,SAAUkY,GAAuBrb,GACrC,MAAM8b,EAAa9b,EAAME,MACnBA,EAAQ4b,EAAW5b,MACzB,IAAKA,EACH,OAAO,KAGT,MAAM6b,EAAWD,EAAW3Z,KACtB6Z,EAAaC,EAAAA,aAAaC,MAAMH,GACtC,OAAKC,EAKc,iBAAV9b,GACP,SAAUA,GACoB,IAA9BU,OAAOuU,KAAKjV,GAAOM,QACG,iBAAfN,EAAM0D,KAKNzD,EAAMqB,cAAA,MAAA,KAAAtB,EAAM0D,MAInBzD,EAACqB,cAAAuU,EAAgB,CAAAH,QAAS5V,EAAM4V,SAC7BhV,OAAOub,QAAQH,EAAWI,YAAYxW,KAAKyW,IAC1C,MAAMvW,EAAMuW,EAAM,GAClB,GAAI/G,EAA2B1L,QAAQ9D,IAAQ,EAC7C,OAAO,KAET,MAAM4S,EAAW2D,EAAM,GAClB3D,EAAS4C,OACZ5C,EAAS4C,KAAOS,EAAW,IAAMjW,GAEnC,MAAOwW,EAAe3D,GAAgB8C,GAAgBK,EAAYhW,GAClE,OACE9F,EAAM+Y,uBACJuD,GAAkBvU,MAAM8T,QAAQS,IAA2C,IAAzBA,EAAc9b,QAE3D,KAGPL,EAAAqB,cAACwU,EAAoB,CAAClQ,IAAKA,EAAKmQ,KAAMsG,yBAAuBzW,IAC3D3F,EAAAqB,cAACqX,GAAuB,CACtBH,SAAUA,EACVC,aAAcA,EACdzY,MAAOoc,EACPvD,oBAAqB/Y,EAAM+Y,oBAC3BP,KAAMxY,EAAMwY,OAGhB,KA3CCrY,EAAAqB,cAAA,MAAA,KAAMua,qBA+CjB,CC5DM,SAAUS,GAAoBxc,GAClC,OACEG,EAAAqB,cAACC,EAAKA,MAAA,CAACG,QAAM,GACXzB,EAAMqB,cAAA,MAAA,KAAAxB,EAAMsG,UACZnG,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAACib,QAAMC,QAAO,CAAC3L,GAAI/Q,EAAM2c,QAASxN,MAAOnP,EAAMuE,MAAOqY,YAAa5c,EAAM4c,aAC/D,OAKlB,CCRM,SAAUC,GAAY7c,GAC1B,OACEG,EAACqB,cAAAib,EAAKA,MAACC,QAAO,CACZ3L,GAAI/Q,EAAM2c,QACVxN,MAAOnP,EAAMuE,MACbqY,YAAa5c,EAAM4c,YACnBtN,MAAO3B,EAAkB3N,EAAMoH,QAASpH,EAAM2c,UAE7C3c,EAAMsG,SAGb,CCnBA,MAAMmQ,GAAiB,CACrBuB,aAAc,SACdjH,GAAI,SACJ+L,WAAY,CACV,CACElZ,KAAM,YAWN,SAAUmZ,GAAgC7c,GAC9C,MAAMqD,EAAUD,KACT0Z,EAAUC,GAAejc,EAAAA,SAgClC,SACEuC,EACArD,GAEA,IAAKA,EACH,OAGF,GAAI,iBAAkBA,EACpB,OAAOA,EAGT,GAAI,cAAeA,EACjB,MAAwB,WAApBA,EAAMgY,UACDzB,GAGFlT,EAAQ2Z,mBAAmBhd,GAGpC,MACF,CArD0Did,CAAmB5Z,EAASrD,IAmBpF,OAjBA2Q,EAAAA,WAAU,KACR,IAAIuM,GAAa,EAajB,OAXKJ,GAAY9c,GAAS,cAAeA,GAASA,EAAMgY,WACtD3U,EACG8Z,cAAcnd,GACd8G,MAAMsW,IACDF,GACFH,EAAYK,EACb,IAEFnW,OAAM,IAAM8V,OAAY9Z,SAGdia,GAAa,CAAsB,GACjD,CAAC7Z,EAASyZ,EAAU9c,IAEhB8c,CACT,CCkCM,SAAUO,GACdC,EACA1X,EACA2X,EACAC,EACAxd,GAEA,MAAMgc,EAAQwB,EAAkBvb,KAChC,GAAI+Z,EAAM1b,OAAS,EACjB,IAAK,MAAM2B,KAAQ+Z,EAAO,CACxB,MAAMyB,EAAc7X,EAAI8X,QAAQ,MAAOC,EAAAA,WAAW1b,EAAKyW,OACnD+E,KAAeH,UACVA,EAAIG,EAEd,CAGH,OADAH,EAAIC,GAAYvd,EACTsd,CACT,CC5EA,SAASM,GAAkCnR,GACzC,MAAO,CACLzM,MAAOyM,EAAQiM,KACfzJ,OAiFgB4O,EAjFEpR,EAkFboR,EAAKnW,SAAWmW,EAAKnF,MAAQ,IAjFlCjM,WAgFJ,IAAoBoR,CA9EpB,CAEM,SAAUC,GAAqBhe,GACnC,MAAMuD,EAAUD,KACVoV,SAAEA,EAAQzX,aAAEA,GAAiBjB,GAC5Bie,EAAYC,GAAiBld,EAAQA,UAAWC,aAAA,EAAAA,EAAc2X,MAAO,CAAC3X,EAAa2X,MAAkB,KAErG1W,EAAMic,GAAWnd,EAAQA,UAC9BC,eAAAA,EAAc2X,MAAO,CAACkF,GAAkC7c,IAAiB,IAGrEmd,EAAUjd,EAAAA,SAChBid,EAAQ7c,QAAUW,EAElB,MAAMmc,EAAaC,eACVC,GAAgCvU,EAAAwE,UAAA,OAAA,GAAA,oBACrC,MAAMiI,EAAyB,QAAhBhP,EAAAiR,EAAS8F,eAAO,IAAA/W,OAAA,EAAAA,EAAEgX,SAE3BC,EAAqC,QAAlBnX,SADFhE,EAAQob,eAAelI,EAAQ8H,IACpBK,iBAAS,IAAArX,OAAA,EAAAA,EAAEsX,SACvCC,EAAU,IAAKV,EAAQ7c,SAE7B,IAAK,MAAMwd,KAAmBL,EACxBK,EAAgBnG,OAASkG,EAAQE,MAAMjB,GAASA,EAAK7d,QAAU6e,EAAgBnG,QACjFkG,EAAQne,KAAKmd,GAAkCiB,IAInDZ,EAAQW,EACT,KACD,CAACvb,EAASmV,EAAU0F,IA0BtB,OAJAvN,EAAAA,WAAU,KACRwN,EAAW,IAAIlX,MAAMwN,QAAQC,IAAI,GAChC,CAACyJ,IAGFle,EAAAqB,cAACyd,EAAAA,YAAW,CACV/c,KAAMA,EACNI,YAAatC,EAAMsC,YACnB4c,YAAU,EACVC,WAAS,EACTC,WAAS,EACTlf,MAAO+d,EACPpQ,OAAQ,CAAC3N,EAAemf,EAAmBtB,aACzC,QACwB,IAAtBE,EAAWzd,QACV6e,KACsB,QAAtB5X,EAAAsW,EAAKpR,QAAQ/E,eAAS,IAAAH,OAAA,EAAAA,EAAA6X,cAAc1N,SAAS1R,EAAMof,cAAc5I,YAC7C,QAAnBnP,EAAAwW,EAAKpR,QAAQiM,YAAM,IAAArR,OAAA,EAAAA,EAAA+X,cAAc1N,SAAS1R,EAAMof,cAAc5I,SACjE,EAEHpV,SAvCJ,SAAsBqE,GACpBuY,EAAcvY,GAEd,MAAM4Z,EAAY5Z,EAAO,GACzB,IAAI6Z,EACJ,GAAID,IACFC,EAAepB,EAAQ7c,QAAuCke,MAAM1B,GAASA,EAAK7d,QAAUyF,EAAO,MAC9F6Z,GAAa,CAEhBA,EAAc1B,GADK,CAAElF,KAAM2G,EAAW3X,QAAS2X,IAE/CpB,EAAQ,IAAKC,EAAQ7c,QAAwCie,GAC9D,CAGCxf,EAAMsB,UACRtB,EAAMsB,SAASke,aAAW,EAAXA,EAAa7S,QAE/B,EAuBG+S,eAAiBC,GAAU,YAAYA,IACvCC,SAAWD,GAAU7B,GAAkC,CAAElF,KAAM+G,EAAO/X,QAAS+X,KAGrF,CCzFM,SAAUE,GAAqB7f,GACnC,MAAOE,EAAOa,GAAYC,EAAAA,SAAsChB,EAAMiB,cAUtE,OACEd,EAACqB,cAAAwc,GACC,CAAAtF,SAAU1Y,EAAM0Y,SAChB9U,KAAM5D,EAAM4D,KACZtB,YAAatC,EAAMsC,YACnBrB,aAAcf,IAMsB4f,EANoB5f,EAOrD,CACLuW,OAA2B,QAAnBlP,EAAiB,QAAjBE,EAAAqY,EAAQC,cAAS,IAAAtY,OAAA,EAAAA,EAAA,UAAE,IAAAF,OAAA,EAAAA,EAAEkP,OAC7BmC,KAAyB,QAAnBoH,EAAiB,QAAjB1Y,EAAAwY,EAAQC,cAAS,IAAAzY,OAAA,EAAAA,EAAA,UAAE,IAAA0Y,OAAA,EAAAA,EAAEpH,KAC3BhR,QAA4B,QAAnBqY,EAAiB,QAAjBC,EAAAJ,EAAQC,cAAS,IAAAG,OAAA,EAAAA,EAAA,UAAE,IAAAD,OAAA,EAAAA,EAAErY,UAT5BtG,SAdJ,SAAsBD,GACpB,MAAM8e,EAAa9e,GA2Bd,CACLwC,MAFsC8I,EA1B0BtL,GA4BlDuG,QACdmY,OAAQ,CACN,CACEtJ,OAAQ9J,EAAQ8J,OAChBmC,KAAMjM,EAAQiM,KACdhR,QAAS+E,EAAQ/E,WAPzB,IAA0C+E,EAzBtC5L,EAASof,GACLngB,EAAMsB,UACRtB,EAAMsB,SAAS6e,EAElB,IAaH,IAA0CL,aAF1C,CCpBM,SAAUM,GAAUpgB,GACxB,MAAOE,EAAOa,GAAYC,EAAAA,SAA6BhB,EAAMiB,cAU7D,OACEd,EAAAqB,cAACwc,GAAoB,CACnBtF,SAAU1Y,EAAM0Y,SAChB9U,KAAM5D,EAAM4D,KACZtB,YAAatC,EAAMsC,YACnBrB,cAMyB2X,EANW1Y,EAOjC0Y,EAAO,CAAEA,aAASzV,GANrB7B,SAdJ,SAAsBD,GACpB,MAAMgf,EAuBD1T,OADsBA,EAtBWtL,UAuBjCsL,EAASiM,KADlB,IAA+BjM,EArB3B5L,EAASsf,GACLrgB,EAAMsB,UACRtB,EAAMsB,SAAS+e,EAElB,IAaH,IAA+BzH,CAF/B,CCpBM,SAAU0H,GAAYtgB,GAC1B,MAAOE,EAAOa,GAAYC,EAAAA,SAA6BhB,EAAMiB,cAU7D,OACEd,EAACqB,cAAAwc,GACC,CAAAtF,SAAU1Y,EAAM0Y,SAChB9U,KAAM5D,EAAM4D,KACZtB,YAAatC,EAAMsC,YACnBrB,aAAcf,IAMa6f,EANoB7f,EAO5C,CACLuW,OAAQsJ,EAAOtJ,OACfmC,KAAMmH,EAAOnH,KACbhR,QAASmY,EAAOnY,UATdtG,SAdJ,SAAsBD,GACpB,MAAM8e,EAAa9e,GA2Bd,CACLoV,QAF6B9J,EA1B0BtL,GA4BvCoV,OAChBmC,KAAMjM,EAAQiM,KACdhR,QAAS+E,EAAQ/E,SAJrB,IAAiC+E,EAzB7B5L,EAASof,GACLngB,EAAMsB,UACRtB,EAAMsB,SAAS6e,EAElB,IAaH,IAAiCJ,CAFjC,CCtBM,SAAUQ,GAAkBvgB,GAChC,MAAOuW,EAAciK,GAAmBxf,EAAAA,SAAShB,EAAMiB,cAEjD4G,EAAM1G,EAAAA,SAGZ,SAASsf,EAAuBpf,GAC1BA,GAA6C,IAAjCT,OAAOuU,KAAK9T,GAAUb,SACpCa,OAAW8B,GAEbqd,EAAgBnf,GACZrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CA0BD,OApCAwG,EAAItG,QAAUgV,EAqCZpW,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAACqB,cAAAK,EAAYA,4BACC,SACZZ,aAAcsV,aAAY,EAAZA,EAAcE,OAC5BnV,SAAWS,GA7BjB,SAAmB0U,GACjB,MAAMpV,iCAA8BwG,EAAItG,SAAS,CAAAkV,WAC5CA,UACIpV,EAASoV,OAElBgK,EAAuBpf,EACxB,CAwBOqf,CAAU3e,EAAEE,cAAc/B,OAE5BgC,KAAM,CAAC,GAAI,QAAS,QAAS,MAAO,QAAS,MAAO,WAEtD/B,EAACqB,cAAAK,EAAAA,4BACa,MACZZ,aAAcsV,aAAY,EAAZA,EAAczU,IAC5BR,SAAWS,GA7BjB,SAAgBD,GACd,MAAMT,iCAA8BwG,EAAItG,SAAS,CAAAO,QAC5CA,UACIT,EAASS,IAElB2e,EAAuBpf,EACxB,CAuBsBW,CAAOD,EAAEE,cAAc/B,OACxCgC,KAAM,CAAC,GAAI,OAAQ,OAAQ,OAAQ,MAAO,YAE5C/B,EAAAqB,cAACa,YAAS,CACRC,YAAY,QACZrB,aAAcsV,aAAY,EAAZA,EAAcrW,MAC5BoB,SAAWS,GA3BjB,SAAkB7B,GAChB,MAAMmB,iCAA8BwG,EAAItG,SAAS,CAAArB,UAC5CA,UACImB,EAASnB,MAElBugB,EAAuBpf,EACxB,CAqBsBN,CAASgB,EAAEE,cAAc/B,SAIlD,CC9DM,SAAUygB,GAAmB3gB,SACjC,MAAOuW,EAAcqK,GAAoB5f,EAAAA,SAAShB,EAAMiB,cAElD4G,EAAM1G,EAAAA,SAGZ,SAAS0f,EAAwBxf,GAC/Buf,EAAiBvf,GACbrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAkBD,OAzBAwG,EAAItG,QAAUgV,EA0BZpW,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAACqB,cAAAa,EAASA,UACK,CAAA,cAAArC,EAAM4D,KAAO,QAC1BA,KAAM5D,EAAM4D,KAAO,QACnBtB,YAAY,OACZmC,MAAO,CAAEO,MAAO,KAChB/D,aAAcsV,eAAAA,EAAc3S,KAC5BtC,SAAWS,GAxBjB,SAAiB6B,GACf,MAAMvC,iCAA+BwG,EAAItG,SAAS,CAAAqC,SAC7CA,UACIvC,EAASuC,KAElBid,EAAwBxf,EACzB,CAkBsByf,CAAQ/e,EAAEE,cAAc/B,SAE3CC,EAAAqB,cAAC+e,GAAiB,CAChB3c,KAAM5D,EAAM4D,KAAO,WACnB3C,aAAmC,UAArBsV,aAAY,EAAZA,EAAcM,eAAO,IAAApP,OAAA,EAAAA,EAAG,GACtCnG,SArBN,SAAoBuV,GAClB,MAAMxV,EAAQT,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAuBgH,EAAItG,SAAS,CAAAsV,QAASA,GAAW,CAACA,KAClEA,UACIxV,EAASwV,QAElBgK,EAAwBxf,EACzB,IAmBH,CCnCM,SAAU0f,GAAc/gB,GAC5B,OACEG,EAACqB,cAAAa,EAAAA,UACC,CAAA0O,GAAI/Q,EAAM4D,KACVA,KAAM5D,EAAM4D,KACC,cAAA5D,EAAM4D,KACnBtB,YAAatC,EAAMsC,YACnBH,KA+D8C,iBA9D9ClB,aAAc+f,GAAkBhhB,EAAMiB,cACtCqO,MAAO3B,EAAkB3N,EAAMoH,QAASpH,EAAM4D,MAC9CtC,SAAWS,IACT,GAAI/B,EAAMsB,SAAU,CAClB,MAAMD,EAAWU,EAAEE,cAAc/B,MACjCF,EAAMsB,SAAS2f,GAAkB5f,GAClC,IAIT,CAOM,SAAU2f,GAAkBE,GAChC,IAAKA,EACH,MAAO,GAMT,MAAM5H,EAAO,IAAIrV,KAAKid,GACtB,OAAKC,EAAAA,YAAY7H,GAKVA,EAAK8H,mBAAmB,MAAQ,IAAM9H,EAAK+H,mBAAmB,MAH5D,EAIX,CAOM,SAAUJ,GAAkBK,GAChC,IAAKA,EACH,MAAO,GAMT,MAAMhI,EAAO,IAAIrV,KAAKqd,GACtB,OAAKH,EAAAA,YAAY7H,GAKVA,EAAKpV,cAHH,EAIX,CCzEM,SAAUqd,GAAevhB,GAC7B,OACEG,EAAAqB,cAACggB,YAAS,CACRzQ,GAAI/Q,EAAM4D,KACVA,KAAM5D,EAAM4D,KAAI,cACJ,kBACZ3C,aAAcsX,EAASA,UAACvY,EAAMiB,cAC9BK,SAAWD,IACLrB,EAAMsB,UACRtB,EAAMsB,SAASmgB,KAAKC,MAAMrgB,GAC3B,GAIT,CCfM,SAAUsgB,GAAe3hB,aAC7B,MAAOE,EAAOa,GAAYC,EAAAA,SAAgChB,EAAMiB,cAE1DC,EAAWC,EAAAA,SAGjB,SAASC,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAkCD,OAzCAH,EAASK,QAAUrB,EA0CjBC,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAACqB,cAAAK,EAAYA,cACXZ,aAAcf,aAAA,EAAAA,EAAO4B,kBACT,MACZR,SAAWS,IACTC,OAtCQF,EAsCDC,EAAEE,cAAc/B,WArC7BkB,iCAAqBF,EAASK,SAAO,CAAEO,IAAKA,QAAYqB,KAD1D,IAAgBrB,CAsCoG,EAE9GI,KAAM,CAAC,GAAI,OAAQ,MAAO,QAAS,WAAY,WAAY,YAAa,YAE1E/B,EAAAqB,cAACa,EAASA,UACR,CAAAC,YAAY,SACZrB,aAA6B,QAAfwG,EAAAvH,aAAK,EAALA,EAAO0hB,cAAQ,IAAAna,OAAA,EAAAA,EAAAsG,KAAK,KAClCzM,SAAWS,IAAM8f,OAzCJD,EAyCc7f,EAAEE,cAAc/B,WAxC/CkB,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVK,EAASK,UACZqgB,OAAQA,EAASA,EAAOjQ,MAAM,UAAOxO,KAHzC,IAAmBye,KA2CfzhB,EAAAqB,cAACa,EAASA,UACR,CAAAC,YAAY,QACZrB,aAA4B,QAAdsG,EAAArH,aAAK,EAALA,EAAO4hB,aAAO,IAAAva,OAAA,EAAAA,EAAAwG,KAAK,KACjCzM,SAAWS,IAAMggB,OAvCLD,EAuCc/f,EAAEE,cAAc/B,WAtC9CkB,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVK,EAASK,UACZugB,MAAOA,EAAQA,EAAMnQ,MAAM,UAAOxO,KAHtC,IAAkB2e,KAyCd3hB,EAAAqB,cAACa,EAASA,UAAA,CAACC,YAAY,SAASrB,aAAcf,aAAK,EAALA,EAAO8hB,OAAQ1gB,SAAWS,IAAMkgB,OAlC/DD,EAkCyEjgB,EAAEE,cAAc/B,WAjC1GkB,iCACKF,EAASK,SAAO,CACnBygB,OAAQA,QAAkB7e,KAH9B,IAAmB6e,KAmCf7hB,EAAAqB,cAACa,EAASA,UACR,CAAAC,YAAY,SACZrB,aAA2B,QAAbqG,EAAApH,aAAA,EAAAA,EAAO2X,cAAM,IAAAvQ,OAAA,EAAAA,EAAEyG,KAAK,KAClCzM,SAAWS,IAAMmgB,OA/BJrK,EA+Bc9V,EAAEE,cAAc/B,WA9B/CkB,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVK,EAASK,UACZsW,OAAQA,EAASA,EAAOlG,MAAM,UAAOxO,KAHzC,IAAmB0U,CAgCb,IAGR,CCzEM,SAAUsK,GAAgBniB,GAC9B,MAAOE,EAAOa,GAAYC,EAAAA,SAAShB,EAAMiB,cAEzC,SAASG,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAED,OACElB,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAAAqB,cAACa,EAASA,UAAA,CACRC,YAAY,SACZrB,aAAcf,aAAK,EAALA,EAAOuW,OACrBnV,SAAWS,GAAMX,iCAAqBlB,GAAK,CAAEuW,OAAQ1U,EAAEE,cAAc/B,WAEvEC,EAAAqB,cAACa,EAASA,UACR,CAAAC,YAAY,QACZrB,aAAcf,aAAA,EAAAA,EAAOA,MACrBoB,SAAWS,GAAMX,EAAqBR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAX,IAAOA,MAAO6B,EAAEE,cAAc/B,WAI5E,CCvBM,SAAUkiB,GAAYpiB,GAC1B,MAAOE,EAAOa,GAAYC,EAAAA,SAAShB,EAAMiB,cAEzC,SAASG,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAED,OACElB,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAAAqB,cAACuf,GACC,CAAAnd,KAAM5D,EAAM4D,KAAO,SACnBtB,YAAY,QACZrB,aAAcf,aAAA,EAAAA,EAAOmiB,MACrB/gB,SAAWD,GAAaD,iCAAqBlB,GAAK,CAAEmiB,MAAOhhB,OAE7DlB,EAAAqB,cAACuf,GACC,CAAAnd,KAAM5D,EAAM4D,KAAO,OACnBtB,YAAY,MACZrB,aAAcf,aAAA,EAAAA,EAAOoiB,IACrBhhB,SAAWD,GAAaD,iCAAqBlB,GAAK,CAAEoiB,IAAKjhB,OAIjE,CC3BM,SAAUkhB,GAAcviB,SAC5B,MAAOE,EAAOa,GAAYC,EAAAA,SAAShB,EAAMiB,cAEzC,SAASG,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAED,OACElB,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAACqB,cAAAK,EAAYA,aACX,CAAA4C,MAAO,CAAEO,MAAO,IACH,cAAAhF,EAAM4D,KAAO,cAC1B3C,aAAcf,aAAA,EAAAA,EAAOsiB,WACrBtgB,KAAM,CAAC,GAAI,IAAK,KAAM,KAAM,KAC5BZ,SAAWS,GACTX,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVX,GAAK,CACRsiB,WAAYzgB,EAAEE,cAAc/B,WAIlCC,EAAAqB,cAACa,EAAAA,UAAS,CACR0O,GAAI/Q,EAAM4D,KACVA,KAAM5D,EAAM4D,mBACC5D,EAAM4D,KAAO,SAC1BzB,KAAK,SACLsI,KAAK,MACLnI,YAAY,QACZrB,aAA0B,QAAZwG,EAAAvH,aAAA,EAAAA,EAAOA,aAAK,IAAAuH,OAAA,EAAAA,EAAE2R,WAC5B9X,SAAWS,GACTX,EACKR,OAAAC,OAAAD,OAAAC,OAAA,GAAAX,GACH,CAAAA,MAAOuiB,GAAe1gB,EAAEE,cAAc/B,YAI5CC,EAACqB,cAAAa,aACCC,YAAY,OACC,cAAAtC,EAAM4D,KAAO,QAC1B3C,aAAcf,aAAA,EAAAA,EAAOwiB,KACrBphB,SAAWS,GACTX,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVX,GACH,CAAAwiB,KAAM3gB,EAAEE,cAAc/B,WAMlC,CAEA,SAASuiB,GAAe/hB,GACtB,GAAKA,EAGL,OAAOiiB,WAAWjiB,EACpB,CCpDM,SAAUkiB,GAAW5iB,GACzB,MAAOE,EAAOa,GAAYC,EAAAA,SAAShB,EAAMiB,cAEzC,SAASG,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAED,OACElB,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAAAqB,cAAC+gB,GAAa,CACZ3e,KAAM5D,EAAM4D,KAAO,OACnB3C,aAAcf,aAAA,EAAAA,EAAO2iB,IACrBvhB,SAAWuE,GACTzE,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVX,GACH,CAAA2iB,IAAKhd,OAKX1F,EAAAqB,cAAC+gB,GACC,CAAA3e,KAAM5D,EAAM4D,KAAO,QACnB3C,aAAcf,aAAK,EAALA,EAAO4iB,KACrBxhB,SAAWuE,GACTzE,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVX,GAAK,CACR4iB,KAAMjd,OAMlB,CCnCM,SAAUkd,GAAW/iB,GACzB,MAAOE,EAAOa,GAAYC,EAAAA,SAAShB,EAAMiB,cAEzC,SAASG,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAED,OACElB,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAAAqB,cAAC+gB,GAAa,CACZ3e,KAAM5D,EAAM4D,KAAO,aACnB3C,aAAcf,aAAA,EAAAA,EAAOqX,UACrBjW,SAAWuE,GACTzE,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVX,GACH,CAAAqX,UAAW1R,OAIjB1F,EAAAqB,cAAC+gB,GACC,CAAA3e,KAAM5D,EAAM4D,KAAO,eACnB3C,aAAcf,aAAK,EAALA,EAAOsX,YACrBlW,SAAWuE,GACTzE,EAAeR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVX,GAAK,CACRsX,YAAa3R,OAMzB,CCvCM,SAAUmd,GAAehjB,aAC7B,MAAMgd,EAAWD,GAAY/c,EAAME,OAC7B2D,EAAOmZ,EAAWiG,EAAgBA,iBAACjG,GAAqB,QAATvV,EAAAzH,EAAM4E,WAAG,IAAA6C,EAAAA,EAAI,GAC5Dyb,EAA8C,QAAnC3b,EAACyV,GAAYmG,EAAAA,YAAYnG,UAAU,IAAAzV,EAAAA,EAAIvH,EAAM2E,IACxDsH,EAAqB,QAAZ3E,EAAAtH,EAAMiM,cAAM,IAAA3E,EAAAA,EAAI,KAEzB8b,EAAWxiB,OAAAC,OAAA,CAAA,EAAQb,GAIzB,cAHOojB,EAAYljB,aACZkjB,EAAY5K,KAEfxY,EAAMwY,KAENrY,EAACqB,cAAAiW,GAAY,CAAAG,GAAIoF,GACf7c,EAAAqB,cAACqT,EAAMA,OAACjU,OAAAC,OAAA,CAAA8D,IAAKue,EAAUte,IAAKf,EAAMoI,OAAQA,GAAYmX,KAKrDjjB,gBAAC0U,EAAAA,OAAMjU,OAAAC,OAAA,CAAC8D,IAAKue,EAAUte,IAAKf,EAAMoI,OAAQA,GAAYmX,GAC/D,CCpBA,MAAMC,GAAuC,CAC3CC,SAAU,MACVC,KAAM,MACNC,QAAS,OACTC,aAAc,OACdC,cAAe,OACfC,eAAgB,MAChBC,iBAAkB,MAClBC,SAAU,MACVC,YAAa,OACbC,aAAc,MACdC,mBAAoB,OACpBC,KAAM,SAYF,SAAUC,GAA6ClkB,GAC3D,MAAMuD,EAAUD,IACVrC,EAAe8b,GAAY/c,EAAMiB,eAChCf,EAAOa,GAAYC,EAAQA,SAASC,EAAegiB,mBAAiBhiB,GAAgB,KACpFkjB,EAASC,GAAcpjB,EAAQA,UAAC,IAChCkB,EAAMic,GAAWnd,EAAQA,SAAqB,IAQrD,SAAeqd,EAAWE,4CACxB6F,GAAW,GACX,MAAMC,EAAahB,GAAarjB,EAAMgY,eAAiB,OACjDsM,EAAe,IAAIC,gBAAgB,CACvCF,CAACA,GAAaG,mBAAmBjG,GACjCkG,OAAQ,OAGJC,QAAkBnhB,EAAQohB,gBAAgB3kB,EAAMgY,aAAcsM,GACpEnG,EAAQuG,EAAU9e,KAAKoX,IAAQ,CAAQ9c,MAAO+iB,EAAgBA,iBAACjG,GAAWA,gBAC1EoH,GAAW,KACZ,CAeD,OAhCAvT,EAAAA,WAAU,KACJ5P,GACFF,EAASkiB,EAAAA,iBAAiBhiB,GAC3B,GACA,CAACA,EAAcF,IA6BhBZ,EAACqB,cAAAojB,EAAAA,aACC,CAAAC,cAAeC,GACf5kB,MAAOA,EACPgC,KAAMA,EACNI,YAAatC,EAAMsC,YACnByiB,QAAS,IAAM1G,EAAWne,GAC1BoB,SApBJ,SAA4B0jB,4CAE1B,OADAjkB,EAASikB,GACF3G,EAAW2G,KACnB,EAkBGC,aAhBJ,SAAsBlH,GACpBhd,EAASgd,EAAK7d,OACdie,EAAQ,IACJne,EAAMsB,UACRtB,EAAMsB,SAASyc,EAAKf,SAEvB,EAWGkI,aAAcf,EAAUhkB,EAAAqB,cAAC2jB,EAAAA,OAAM,CAACxc,KAAM,KAAS,MAGrD,CAEA,MAAMmc,GAAgBM,EAAUA,YAAsB,CAAC3d,EAAqCI,SAArC3H,MAAEA,EAAK8c,SAAEA,GAAQvV,EAAK4D,EAAMhC,EAAA5B,EAA5B,sBACrD,OACEtH,EAAKqB,cAAA,MAAAZ,OAAAC,OAAA,CAAAgH,IAAKA,GAASwD,GACjBlL,EAACqB,cAAAC,EAAAA,OAAMG,QAAM,GACXzB,EAAAqB,cAACwhB,GAAc,CAAC9iB,MAAO8c,IACvB7c,EAAAqB,cAAA,MAAA,KACErB,EAACqB,cAAA+N,OAAM,KAAArP,GACPC,EAAAqB,cAAC+N,OAAK,CAAA5G,KAAK,KAAKM,MAAM,UAClB+T,EAAqBqI,aAK/B,ICvFE,SAAUC,GAAetlB,GAC7B,MAAMulB,EAAcvlB,EAAMulB,YACpBC,EA8CR,SACEvkB,EACAskB,SAEA,MAAME,UAA2Bhe,EAAAxG,aAAA,EAAAA,EAAciX,gCAAWvG,MAAM,KAAK,GACrE,GAAI8T,EACF,OAAOA,EAGT,GAAIF,GAAeA,EAAY/kB,OAAS,EACtC,OAAO+kB,EAAY,GAGrB,MACF,CA5D8BG,CAAuB1lB,EAAMiB,aAAcskB,IAChErlB,EAAOa,GAAYC,EAAAA,SAAgChB,EAAMiB,eACzD+W,EAAc2N,GAAmB3kB,EAAQA,SAAqBwkB,GAEpDrkB,EAAAA,SACRI,QAAUrB,EAYnB,OAVwBiB,EAAAA,SACRI,QAAUyW,EAUxB7X,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC5B2jB,EACCplB,EAACqB,cAAAK,EAAYA,aACC,CAAA,cAAA,uCACZZ,aAAc+W,EACd1W,SAAWS,GAAM4jB,EAAgB5jB,EAAEE,cAAc/B,OACjDgC,KAAMqjB,IAGRplB,EAAAqB,cAACa,EAAAA,UAAS,CAAA,cACI,sCACZpB,aAAc+W,EACd1W,SAAWS,GAAM4jB,EAAgB5jB,EAAEE,cAAc/B,SAGrDC,EAAAqB,cAAC0iB,GAAa,CACZlM,aAAcA,EACdpU,KAAM5D,EAAM4D,KAAO,MACnBtB,YAAatC,EAAMsC,YACnBrB,aAAcf,EACdoB,SAAWyc,IA5BjB,IAAwB1c,IA6BD0c,EAAOha,EAAAA,gBAAgBga,QAAQ5a,EA5BpDpC,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EA0B6C,IAKlE,CC7CM,SAAUukB,GAAmB5lB,GACjC,MAAO2F,EAAQ2C,GAAatH,EAAAA,SAC1BhB,EAAMiB,cAAgB8G,MAAM8T,QAAQ7b,EAAMiB,cAAgBjB,EAAMiB,aAAe,IAG3EsH,EAAYpH,EAAAA,SAGlB,SAASqH,EAAiBC,GACxBH,EAAUG,GACNzI,EAAMsB,UACRtB,EAAMsB,SAASmH,EAElB,CAED,OATAF,EAAUhH,QAAUoE,EAUlBxF,EAAAqB,cAAA,QAAA,CAAOiD,MAAO,CAAEO,MAAO,OAAQ6gB,eAAgB,aAC7C1lB,EAAAqB,cAAA,WAAA,KACErB,EAAKqB,cAAA,MAAA,CAAAwD,MAAM,QACX7E,EAAAqB,cAAA,MAAA,CAAKwD,MAAM,QAEb7E,EAAAqB,cAAA,QAAA,KACGmE,EAAOC,KAAI,CAACC,EAAGvF,IACdH,EAAIqB,cAAA,KAAA,CAAAsE,IAAK,GAAGxF,KAASqF,EAAOnF,UAC1BL,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACskB,GAAqB,CACpBhN,cAAc,EACdJ,SAAU1Y,EAAM0Y,SAChB9U,KAAM5D,EAAM4D,KAAO,IAAMtD,EACzBW,aAAc4E,EACdvE,SAAWD,IACT,MAAMuH,EAAO,IAAKL,EAAUhH,SAC5BqH,EAAKtI,GAASe,EACdmH,EAAiBI,EAAK,KAI5BzI,EAAAqB,cAAA,KAAA,CAAIiD,MAAO,CAAEshB,UAAW,UACtB5lB,EAAAqB,cAACkH,EAAUA,WAAA,CACTnE,MAAM,SACNoE,KAAK,KACLR,QAAUpG,IACRgE,EAAUhE,GACV,MAAM6G,EAAO,IAAKL,EAAUhH,SAC5BqH,EAAKE,OAAOxI,EAAO,GACnBkI,EAAiBI,EAAK,GAGxBzI,EAAAqB,cAACuH,EAAeA,gBAAG,WAK3B5I,EAAAqB,cAAA,KAAA,KACErB,EAASqB,cAAA,KAAA,MACTrB,EAAAqB,cAAA,KAAA,CAAIiD,MAAO,CAAEshB,UAAW,UACtB5lB,EAAAqB,cAACkH,aACC,CAAAnE,MAAM,MACNoE,KAAK,KACLM,MAAM,QACNd,QAAUpG,IACRgE,EAAUhE,GACV,MAAM6G,EAAO,IAAKL,EAAUhH,SAC5BqH,EAAKjI,UAAKwC,GACVqF,EAAiBI,EAAK,GAGxBzI,EAACqB,cAAAwkB,EAAcA,yBAO7B,CClFA,MAAMC,GAAa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAUxD,SAAUC,GAAYlmB,GAC1B,MAAOE,EAAOa,GAAYC,EAAQA,SAAShB,EAAMiB,cAAgB,CAAA,IAC1DklB,EAAMC,GAAWplB,EAAQA,UAAC,GAE3BE,EAAWC,EAAAA,SAGjB,OAFAD,EAASK,QAAUrB,EAGjBC,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAACqB,cAAAC,EAAKA,OAACC,QAAQ,KAAKC,QAAKC,QAAM,GAC7BzB,EAAOqB,cAAA,OAAA,KAAA0Z,EAAYA,aAACha,EAASK,UAAY,aACzCpB,EAAAqB,cAAC4H,EAAMA,OAAA,CAACjB,QAAS,IAAMie,GAAQ,IAAK,SAEtCjmB,EAAAqB,cAAC6kB,GACC,CAAAC,QAASH,EACTllB,aAAcC,EAASK,QACvBglB,KAAOllB,IACDrB,EAAMsB,UACRtB,EAAMsB,SAASD,GAEjBN,EAASM,GACT+kB,GAAQ,EAAM,EAEhBI,SAAU,IAAMJ,GAAQ,KAIhC,CASA,SAASC,GAAmBrmB,WAC1B,MAAOE,EAAOa,GAAYC,EAAQA,SAAShB,EAAMiB,cAAgB,CAAA,GAE3DC,EAAWC,EAAAA,SAOjB,SAASslB,EAAUC,GACjB3lB,iCAAcG,EAASK,SAAS,CAAAmlB,WACjC,CAUD,SAASC,EAAaC,EAAgBC,GAChCA,EAON,SAAsBD,aACpB,MAAME,GAAmC,QAAxBvf,EAAgB,UAAhBrG,EAASK,eAAO,IAAAkG,OAAA,EAAAA,EAAEif,cAAM,IAAAnf,OAAA,EAAAA,EAAEwf,YAAa,GACnDD,EAASlV,SAASgV,IACrBH,yCAAenf,EAAApG,EAASK,8BAASmlB,QAAM,CAAEK,UAAW,IAAID,EAAUF,KAErE,CAXGI,CAAaJ,GAajB,SAAyBA,aACvB,MAAME,GAAmC,QAAxBvf,EAAgB,UAAhBrG,EAASK,eAAO,IAAAkG,OAAA,EAAAA,EAAEif,cAAM,IAAAnf,OAAA,EAAAA,EAAEwf,YAAa,GACpDD,EAASlV,SAASgV,IACpBH,EAAS7lB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,UAAMyG,EAAApG,EAASK,8BAASmlB,QAAM,CAAEK,UAAWD,EAASjZ,QAAQH,GAAMA,IAAMkZ,MAEpF,CAhBGK,CAAgBL,EAEnB,CAgBD,OAxCA1lB,EAASK,QAAUrB,EAyCjBC,EAACqB,cAAA0lB,EAAAA,MAAM,CAAA3iB,MAAM,SAAS4iB,iBAAiB,QAAQC,OAAQpnB,EAAMsmB,QAASe,QAAS,IAAMrnB,EAAMwmB,YACzFrmB,EAAKqB,cAAA,MAAA,CAAAiD,MAAO,CAAEY,QAAS,WAAY0gB,UAAW,SAC5C5lB,EAACqB,cAAAqb,IAAYtY,MAAM,YAAYoY,QAAS,uBACtCxc,EAAAqB,cAACuf,GAAc,CAAAnd,KAAM,sBAAuBtC,SAAWD,IAAaimB,OA1C1DC,EA0CmElmB,OAzCnFN,EAAQH,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMK,EAASK,SAAO,CAAEimB,MAAO,CAACD,MAD1C,IAAkBA,MA4CZpnB,EAACqB,cAAAqb,IAAYtY,MAAM,eAAeoY,QAAS,wBACzCxc,EAACqB,cAAAC,EAAKA,OAACC,QAAQ,KAAKC,QAAKC,QAAM,GAC7BzB,EAACqB,cAAAa,aACCF,KAAK,SACLsI,KAAM,EACNsG,GAAG,uBACHnN,KAAK,uBACL3C,aAA6B,QAAfwG,EAAAvH,eAAAA,EAAOwmB,cAAQ,IAAAjf,OAAA,EAAAA,EAAAggB,OAC7BnmB,SAAWS,GA5CvB,SAAmB2lB,SACjBjB,EAAe7lB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAgB,QAAhB4G,EAAAvG,EAASK,eAAO,IAAAkG,OAAA,EAAAA,EAAEif,QAAM,CAAEe,OAAQC,IAClD,CA0C4BC,CAAUC,SAAS7lB,EAAEE,cAAc/B,UAEtDC,EAAAqB,cAACK,EAAYA,aACX,CAAAkP,GAAG,2BACHnN,KAAK,2BACL3C,aAA6B,QAAfsG,EAAArH,aAAK,EAALA,EAAOwmB,cAAQ,IAAAnf,OAAA,EAAAA,EAAAsgB,WAC7BvmB,SAAWS,GA9CvB,SAAuB+lB,SACrBrB,EAAe7lB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAgB,QAAhB4G,EAAAvG,EAASK,eAAO,IAAAkG,OAAA,EAAAA,EAAEif,QAAM,CAAEmB,WAAYC,IACtD,CA4C4BC,CAAchmB,EAAEE,cAAc/B,OAC/CgC,KAAM,CACJ,CAAEiN,MAAO,MAAOjP,MAAO,KACvB,CAAEiP,MAAO,OAAQjP,MAAO,MACxB,CAAEiP,MAAO,QAASjP,MAAO,MACzB,CAAEiP,MAAO,OAAQjP,MAAO,UAKhCC,EAAAqB,cAACqb,GAAW,CAACtY,MAAM,aACjBpE,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAK,EAAAC,QACtB,GAAAqkB,GAAWrgB,KAAKghB,GACfzmB,EAAAqB,cAACrB,EAAMwH,SAAQ,CAAC7B,IAAK8gB,GACnBzmB,EAAAqB,cAAA,QAAA,CAAOmb,QAAS,wBAA0BiK,GAAMA,EAAIoB,OAAO,GAAGC,eAC9D9nB,EAAAqB,cAACqS,EAAQA,SACP,CAAA9C,GAAI,wBAA0B6V,EAC9BhjB,KAAM,wBAA0BgjB,EAChCtlB,SAAWS,GAAM4kB,EAAaC,EAAkB7kB,EAAEE,cAAciL,iBAO5E/M,EAAAqB,cAAC4H,SAAO,CAAAjB,QAAS,IAAMnI,EAAMumB,KAAKrmB,IAAmB,MAG3D,CC5GM,SAAU4lB,GAAsB9lB,aACpC,MAAM0Y,EAAW1Y,EAAM0Y,SACjBC,EAA6C,QAA9BlR,EAAAzH,EAAMkoB,2BAAwB,IAAAzgB,EAAAA,EAAkB,QAAlBH,EAAa,QAAbC,EAAAmR,EAASvW,YAAI,IAAAoF,OAAA,EAAAA,EAAG,UAAE,IAAAD,OAAA,EAAAA,EAAEsR,KACjEhV,EAAO5D,EAAM4D,KACb1D,EAAQF,EAAMiB,aAEpB,GAAqB,MAAjByX,EAASM,MAAgBhZ,EAAM8Y,aACjC,MAAqB,eAAjBH,EACKxY,gBAACkI,EAAoB,CAACzE,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAEzEnB,EAAAqB,cAACokB,GAAmB,CAAAlN,SAAUA,EAAU9U,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAGlG,MAAM6mB,EAAgBzP,EAASvW,KAC/B,OAAIgmB,EAAc3nB,OAAS,EAClBL,EAAAqB,cAAC4mB,GAA+BxnB,OAAAC,OAAA,CAAAwnB,uBAAwBF,GAAmBnoB,IAE3EG,EAACqB,cAAA8mB,GAA2B1nB,OAAAC,OAAA,CAAA0nB,sBAAuBJ,EAAc,IAAQnoB,GAEpF,CAMM,SAAUooB,GAA+BpoB,GAC7C,MAAMmoB,EAAgBnoB,EAAMqoB,uBAC5B,IAAIG,EACAxoB,EAAMkoB,sBACRM,EAAsBL,EAAc1I,MAAMlW,GAAMA,EAAEqP,OAAS5Y,EAAMkoB,uBAE9DM,IACHA,EAAsBL,EAAc,IAEtC,MAAOM,EAAcC,GAAmB1nB,EAAQA,SAACwnB,GACjD,OACEroB,EAACqB,cAAAC,EAAAA,MAAM,CAAAC,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC7BzB,EAACqB,cAAAK,EAAAA,aACC,CAAA4C,MAAO,CAAEO,MAAO,SAChB/D,aAAcwnB,aAAA,EAAAA,EAAc7P,KAC5BtX,SAAWS,IACT2mB,EACEP,EAAc1I,MACXtd,GAAgCA,EAAKyW,OAAS7W,EAAEE,cAAc/B,QAElE,EAEHgC,KAAMimB,EAAcviB,KAAKzD,IAAiC,CACxDjC,MAAOiC,EAAKyW,KACZzJ,MAAOhN,EAAKyW,WAGhBzY,EAAAqB,cAAC8mB,GAA0B1nB,OAAAC,OAAA,CAAA,EACrBb,EAAK,CACTuoB,sBAAuBE,EACvBnnB,SAAWD,IACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAAUrB,EAAM4D,KAAKga,QAAQ,MAAOC,aAAW4K,EAAa7P,OAC5E,KAKX,CAMM,SAAU0P,GAA2BtoB,SACzC,MAAM0Y,EAAW1Y,EAAM0Y,SACjBC,EAAe3Y,EAAMuoB,sBAAsB3P,KAC3ChV,EAAO5D,EAAM4D,KACb1D,EAAQF,EAAMiB,aAEpB,OAAQ0X,GAIN,KAAKM,EAAAA,aAAaI,aAClB,KAAKJ,EAAAA,aAAaW,UAClB,KAAKX,EAAAA,aAAaQ,OAClB,KAAKR,EAAAA,aAAajV,KAClB,KAAKiV,EAAAA,aAAaU,IAClB,KAAKV,EAAYA,aAAC3U,IAChB,OACEnE,gBAACkC,EAAAA,UAAS,CACR0O,GAAInN,EACJA,KAAMA,gBACOA,EACb3C,aAAcf,EACdoB,SAAWS,IACL/B,EAAMsB,UACRtB,EAAMsB,SAASS,EAAEE,cAAc/B,MAChC,EAEHoP,MAAO3B,EAAkB3N,EAAMoH,QAASxD,KAG9C,KAAKqV,EAAYA,aAACK,KAChB,OACEnZ,EAACqB,cAAAa,EAASA,UACR,CAAAF,KAAK,OACL4O,GAAInN,EACJA,KAAMA,EACO,cAAAA,EACb3C,aAAcf,EACdoB,SAAWS,IACL/B,EAAMsB,UACRtB,EAAMsB,SAASS,EAAEE,cAAc/B,MAChC,EAEHoP,MAAO3B,EAAkB3N,EAAMoH,QAASxD,KAG9C,KAAKqV,EAAAA,aAAaY,SAClB,KAAKZ,EAAYA,aAACa,QAChB,OAAO3Z,EAAAqB,cAACuf,GAAc,CAAAnd,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,SAAU8F,QAASpH,EAAMoH,UAClG,KAAK6R,EAAAA,aAAa0P,QAClB,KAAK1P,EAAAA,aAAaM,QAClB,KAAKN,EAAAA,aAAaO,YAClB,KAAKP,EAAYA,aAACS,YAChB,OACEvZ,EAACqB,cAAAa,EAASA,WACRF,KAAK,SACLsI,KAAMkO,IAAiBM,eAAa0P,QAAU,MAAQ,IACtD5X,GAAInN,EACJA,KAAMA,EACO,cAAAA,EACb3C,aAAcf,EACdoB,SAAWS,IACL/B,EAAMsB,UACRtB,EAAMsB,SAASS,EAAEE,cAAc2mB,cAChC,IAIT,KAAK3P,EAAYA,aAACL,KAChB,OAAOzY,EAAAqB,cAAC4e,GAAU,CAAA1H,SAAUA,EAAU9U,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACzF,KAAK2X,EAAYA,aAACC,QAChB,OACE/Y,EAACqB,cAAAqS,EAAAA,SACC,CAAA9C,GAAInN,EACJA,KAAMA,EAAI,cACGA,EACbyR,iBAAkBnV,EAClBoB,SAAWS,IACL/B,EAAMsB,UACRtB,EAAMsB,SAASS,EAAEE,cAAciL,QAChC,IAIT,KAAK+L,EAAYA,aAACe,SAChB,OACE7Z,gBAAC0oB,EAAAA,SAAQ,CACP9X,GAAInN,EACJA,KAAMA,gBACOA,EACb3C,aAAcf,EACdoB,SAAWS,IACL/B,EAAMsB,UACRtB,EAAMsB,SAASS,EAAEE,cAAc/B,MAChC,IAQT,KAAK+Y,EAAYA,aAACgB,QAChB,OAAO9Z,gBAACW,EAAY,CAAC8C,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACxE,KAAK2X,EAAYA,aAACiB,WAChB,OAAO/Z,gBAACuD,EAAe,CAACE,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC3E,KAAK2X,EAAYA,aAACkB,WAChB,OAAOha,gBAACgJ,EAAe,CAACvF,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC3E,KAAK2X,EAAYA,aAACmB,gBAChB,OAAOja,EAAAqB,cAACqe,GAAqB,CAAAnH,SAAUA,EAAU9U,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACpG,KAAK2X,EAAYA,aAACoB,OAChB,OAAOla,EAAAqB,cAAC8e,GAAY,CAAA5H,SAAUA,EAAU9U,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC3F,KAAK2X,EAAYA,aAACqB,cAChB,OAAOna,gBAACwgB,GAAkB,CAAC/c,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC9E,KAAK2X,EAAYA,aAACsB,aAChB,OAAOpa,gBAACogB,GAAiB,CAAC3c,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC7E,KAAK2X,EAAYA,aAAC6P,UAChB,OAAO3oB,gBAACohB,GAAc,CAAC3d,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC1E,KAAK2X,EAAYA,aAACuB,UAChB,OAAOra,gBAACwhB,GAAc,CAAC/d,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC1E,KAAK2X,EAAYA,aAACwB,WAChB,OAAOta,gBAACgiB,GAAe,CAACve,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WAC3E,KAAK2X,EAAYA,aAACyB,OAChB,OAAOva,gBAACiiB,GAAW,CAACxe,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACvE,KAAK2X,EAAAA,aAAa4B,SAClB,KAAK5B,EAAYA,aAAC2B,SAChB,OAAOza,gBAACoiB,GAAa,CAAC3e,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACzE,KAAK2X,EAAYA,aAAC6B,MAChB,OAAO3a,gBAACyiB,GAAU,CAAChf,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACtE,KAAK2X,EAAYA,aAAC8B,MAChB,OAAO5a,gBAAC4iB,GAAU,CAACnf,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACtE,KAAK2X,EAAYA,aAAC+B,UAChB,OACE7a,EAACqB,cAAA8jB,GACC,CAAA1hB,KAAMA,EACN3C,aAAcf,EACdqlB,YAAawD,GAAerQ,GAC5BpX,SAAUtB,EAAMsB,WAGtB,KAAK2X,EAAYA,aAACgC,OAChB,OAAO9a,gBAAC+lB,GAAW,CAACtiB,KAAMA,EAAM3C,aAAcf,EAAOoB,SAAUtB,EAAMsB,WACvE,KAAK2X,EAAAA,aAAakC,OAClB,KAAKlC,EAAYA,aAACmC,aAChB,OACEjb,EAACqB,cAAAwnB,GACC,CAAAjN,SAAUpD,EACV1X,aAAcf,EACdoB,SAAUtB,EAAMsB,SAChB8F,QAASpH,EAAMoH,UAGrB,QACE,OACEjH,EAACqB,cAAAwnB,GACC,CAAAjN,SAAUP,EAAaA,cAAc,QAAb/T,EAAAiR,EAAS4C,YAAI,IAAA7T,OAAA,EAAAA,EAAEkK,MAAM,MAC7C1Q,aAAcf,EACdoB,SAAUtB,EAAMsB,SAChB8F,QAASpH,EAAMoH,UAIzB,CAEA,SAAS2hB,GAAerQ,aACtB,OAAyC,QAAlCpR,UAAAC,EAAc,QAAdE,EAAAiR,aAAQ,EAARA,EAAUvW,YAAI,IAAAsF,OAAA,EAAAA,EAAG,yBAAIwhB,qBAAa,IAAA3hB,OAAA,EAAAA,EAAE1B,KAAK4D,GAAMA,EAAEmI,MAAM,KAAKuX,OACrE,CC9PM,SAAUF,GAAqBhpB,SACnC,MAAOE,EAAOa,GAAYC,EAAQA,SAA4B,QAAtByG,EAAAzH,EAAMiB,oBAAgB,IAAAwG,EAAAA,EAAA,CAAE,GAEhE,SAASrG,EAAgBC,GACvBN,EAASM,GACLrB,EAAMsB,UACRtB,EAAMsB,SAASD,EAElB,CAED,MAAM0a,EAAW/b,EAAM+b,SACjBC,EAAaC,EAAAA,aAAaC,MAAMH,GACtC,IAAKC,EACH,OAAO7b,EAAAqB,cAAA,MAAA,KAAMua,sBAGf,MAAMD,EAAa,CAAE3Z,KAAM4Z,EAAU7b,SAErC,OACEC,EAACqB,cAAA0N,EAAKA,WACHtO,OAAOub,QAAQH,EAAWI,YAAYxW,KAAKyW,IAC1C,MAAMvW,EAAMuW,EAAM,GAClB,GAAY,OAARvW,GAAgBwP,EAA2B1L,QAAQ9D,IAAQ,EAC7D,OAAO,KAET,MAAM4S,EAAW2D,EAAM,GACvB,IAAK3D,EAASvW,KACZ,OAAO,KAGT,MAAOma,EAAe3D,GAAgB8C,GAAgBK,EAAYhW,GAElE,OAA6B,IAAzB4S,EAASvW,KAAK3B,QAA0C,YAA1BkY,EAASvW,KAAK,GAAGyW,KAE/CzY,gBAACqc,GAAmB,CAClB1W,IAAKA,EACLvB,MAAOgY,EAAsBA,uBAACzW,GAC9B8W,YAAalE,EAASyQ,WACtBxM,QAAS7W,GAET3F,EAAAqB,cAACskB,GAAqB,CACpBpN,SAAUA,EACV9U,KAAMkC,EACN7E,aAAcqb,EACd4L,oBAAqBvP,EACrBvR,QAASpH,EAAMoH,QACf9F,SAAU,CAACD,EAAeoc,KACxBrc,EAAgBmc,GAAiBrd,EAAO4F,EAAK2X,QAAAA,EAAY3X,EAAKuW,EAAM,GAAIhb,GAAU,KAQ1FlB,EAAAqB,cAACqb,GAAW,CACV/W,IAAKA,EACLvB,MAAOgY,yBAAuBzW,GAC9B8W,YAAalE,EAASyQ,WACtBxM,QAAS7W,EACTsB,QAASpH,EAAMoH,SAEfjH,EAAAqB,cAACskB,GAAqB,CACpBpN,SAAUA,EACV9U,KAAMkC,EACN7E,aAAcqb,EACd4L,oBAAqBvP,EACrBvR,QAASpH,EAAMoH,QACf9F,SAAU,CAACD,EAAeoc,KACxBrc,EAAgBmc,GAAiBrd,EAAO4F,EAAK2X,QAAAA,EAAY3X,EAAKuW,EAAM,GAAIhb,GAAU,IAIxF,IAIV,CC3FA,MAAM0J,GAAYC,EAAAA,cAAcS,IAAW,CACzC2d,MAAO,CACLpkB,MAAO,IAEP,OAAQ,CACNqkB,WAAY,SACZC,SAAU,GACVjkB,QAAS,EACT0gB,UAAW,UAGb,OAAQ,CACN1gB,QAAS,WAGX,cAAe,CACbL,MAAO,GACPC,OAAQ,GACRgE,MAAOwC,EAAMiK,OAAOjK,EAAM8d,cAAc,GACxCD,SAAU,GACVD,WAAY,IACZtD,UAAW,SACX1gB,QAAS,EACTmkB,gBAAiB/d,EAAMiK,OAAOjK,EAAM8d,cAAc,GAClDzT,OAAQ,EACR2T,aAAc,MACdC,OAAQ,WAGV,oBAAqB,CACnBF,gBAAiB/d,EAAMiK,OAAOjK,EAAM8d,cAAc,IAGpD,uBAAwB,CACtBC,gBAAiB,cACjBE,OAAQ,UACRzgB,MAAOwC,EAAMiK,OAAOC,KAAK,GACzB0T,WAAY,eAgBZ,SAAUM,GAAerQ,GAC7B,OAAOA,EAAKsQ,eAAe,UAAW,CAAEC,MAAO,SAAY,IAAMvQ,EAAKwQ,aACxE,CASM,SAAUC,GAAc/pB,GAC5B,MAAMsL,QAAEA,GAAYP,MACdif,cAAEA,EAAa7hB,QAAEA,GAAYnI,GAC5B6pB,EAAOI,GAAYjpB,EAAQA,SAAOkpB,IAEzC,SAASC,EAAUC,GACjBH,GAAUI,IACR,MAAMC,EAAW,IAAIrmB,KAAKomB,EAAUE,WAGpC,OAFAD,EAASL,SAASI,EAAUG,WAAaJ,GACzCJ,EAAcM,GACPA,CAAQ,GAElB,CAED,MAAMG,EAAOC,EAAAA,SAAQ,IAsDvB,SAAmBC,EAAiBC,GAClC,MAAMld,EAAI,IAAIzJ,KAAK0mB,EAAUb,cAAea,EAAUH,YAChDC,EAAiC,GACvC,IAAII,EAA8B,GAGlC,IAAK,IAAI/gB,EAAI,EAAGA,EAAI4D,EAAEod,SAAUhhB,IAC9B+gB,EAAIlqB,UAAKwC,GAGX,KAAOuK,EAAE8c,aAAeG,EAAUH,YAChCK,EAAIlqB,KAAK,CACP2Y,KAAM,IAAIrV,KAAKyJ,EAAE6c,WACjBQ,UAAWC,GAAetd,EAAGkd,KAGZ,IAAfld,EAAEod,WACJL,EAAK9pB,KAAKkqB,GACVA,EAAM,IAGRnd,EAAEud,QAAQvd,EAAEwd,UAAY,GAI1B,GAAmB,IAAfxd,EAAEod,SAAgB,CACpB,IAAK,IAAIhhB,EAAI4D,EAAEod,SAAUhhB,EAAI,EAAGA,IAC9B+gB,EAAIlqB,UAAKwC,GAEXsnB,EAAK9pB,KAAKkqB,EACX,CAED,OAAOJ,CACT,CAvF6BU,CAAUtB,EAAO7pB,EAAM4qB,QAAQ,CAACf,EAAO7pB,EAAM4qB,QAExE,OACEzqB,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAACC,QAAK,CAAC+N,SAAS,QAAQ9N,QAAQ,KAAKC,MAAI,EAACC,QAAM,GAC9CzB,EAAAqB,cAAA,IAAA,CAAGiD,MAAO,CAAEqQ,KAAM,IAAM6U,GAAeE,IACvC1pB,EAACqB,cAAAC,SAAM+N,SAAS,QAAQ9N,QAAQ,MAC9BvB,EAAAqB,cAAC4H,EAAAA,OAAO,CAAAgiB,QAAQ,UAAS,aAAY,iBAAiBjjB,QAAS,IAAMgiB,GAAW,IAEvE,KACThqB,EAAAqB,cAAC4H,EAAAA,OAAO,CAAAgiB,QAAQ,UAAS,aAAY,aAAajjB,QAAS,IAAMgiB,EAAU,IAAE,OAKjFhqB,EAAAqB,cAAA,QAAA,CAAOgK,UAAWF,EAAQ8d,OACxBjpB,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAYqB,cAAA,KAAA,KAAA,OACZrB,EAAYqB,cAAA,KAAA,KAAA,OACZrB,EAAYqB,cAAA,KAAA,KAAA,OACZrB,EAAYqB,cAAA,KAAA,KAAA,OACZrB,EAAYqB,cAAA,KAAA,KAAA,OACZrB,EAAYqB,cAAA,KAAA,KAAA,OACZrB,EAAAqB,cAAA,KAAA,KAAA,SAGJrB,EAAAqB,cAAA,QAAA,KACGipB,EAAK7kB,KAAI,CAACylB,EAAMC,IACfnrB,EAAAqB,cAAA,KAAA,CAAIsE,IAAK,QAAUwlB,GAChBD,EAAKzlB,KAAI,CAACghB,EAAK2E,IACdprB,sBAAI2F,IAAK,OAASylB,GACf3E,GACCzmB,EAAAqB,cAAC4H,EAAAA,OAAO,CAAA6D,UAAW2Z,EAAImE,UAAW5iB,QAAS,IAAMA,EAAQye,EAAItN,OAC1DsN,EAAItN,KAAK4R,mBAWhC,UAEgBhB,KACd,MAAMtf,EAAS,IAAI3G,KAGnB,OAFA2G,EAAOqgB,QAAQ,GACfrgB,EAAO4gB,SAAS,EAAG,EAAG,EAAG,GAClB5gB,CACT,CA2CA,SAASogB,GAAepE,EAAWgE,GAEjC,IAAK,MAAMa,KAAQb,EAAO,CACxB,MAAMc,EAAY,IAAIznB,KAAKwnB,EAAKpJ,OAChC,GACEqJ,EAAU5B,gBAAkBlD,EAAIkD,eAChC4B,EAAUlB,aAAe5D,EAAI4D,YAC7BkB,EAAUR,YAActE,EAAIsE,UAE5B,OAAO,CAEV,CAED,OAAO,CACT,CCnLM,SAAUS,GAAa3rB,GAC3B,MAAME,MAAEA,EAAKsY,KAAEA,GAAkBxY,EAAT8X,EAASzO,EAAArJ,EAA3B,CAAA,QAAA,SACAgd,EAAWD,GAAY7c,GAC7B,IAAK8c,EACH,OAAO,KAGT,MAAMnZ,EAAOof,mBAAiBjG,GAE9B,OAAOxE,EACLrY,EAACqB,cAAAiW,GAAY7W,OAAAC,OAAA,CAAA+W,GAAIoF,GAAclF,GAC5BjU,GAGH1D,EAAAqB,cAAC+N,OAAK3O,OAAAC,OAAA,CAAAuT,UAAU,QAAW0D,GACxBjU,EAGP,CCnBM,SAAU+nB,GAAc5rB,GAC5B,OACEG,EAACqB,cAAAC,EAAKA,MAAC,CAAAC,QAAQ,MACbvB,EAACqB,cAAAwhB,IAAera,KAAM,GAAIsD,OAAQ,GAAI/L,MAAOF,EAAME,MAAOsY,KAAMxY,EAAMwY,OACtErY,EAAAqB,cAACmqB,GAAa,CAAAzrB,MAAOF,EAAME,MAAOsY,KAAMxY,EAAMwY,OAGpD,CCFA,MAAMzN,GAAYC,EAAAA,cAAcS,IAAW,CACzC2d,MAAO,CACLtT,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzCkQ,eAAgB,WAEhB,aAAc,CACZ/P,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzCtQ,QAAS,IAIbwmB,YAAa,CACXC,WAAkC,SAAtBrgB,EAAMsgB,YAAyBtgB,EAAMiK,OAAOsW,IAAI,GAAKvgB,EAAMiK,OAAOsW,IAAI,GAClFlW,OAAQ,eAAerK,EAAMiK,OAAOsW,IAAI,KACxC/iB,MAAOwC,EAAMiK,OAAOsW,IAAI,GACxB3C,WAAY,IAEZ,OAAQ,CACNvT,OAAQ,eAAerK,EAAMiK,OAAOsW,IAAI,WASxC,SAAUC,GAAwBjsB,WACtC,MAAMksB,EAAmBnP,GAAY/c,EAAME,OACrCisB,EAAWpP,GAAsC,QAA1BtV,EAAAykB,aAAA,EAAAA,EAAkBC,gBAAQ,IAAA1kB,OAAA,EAAAA,EAAG,IAC1D,IAAKykB,EACH,OAAO,KAGT,IAAIE,EAAc,GAElB,GAAIF,EAAiBG,eAAiBH,EAAiBG,cAAc7rB,OAAS,EAAG,CAC/E,MAAM8rB,EAAKJ,EAAiBG,cAAc,IACtB,QAAhB9kB,EAAA+kB,EAAGjoB,mBAAa,IAAAkD,OAAA,EAAAA,EAAA/C,WAAW,gBAAiB8nB,EAAGpqB,OACjDkqB,EAAc7a,OAAOgb,KAAKD,EAAGpqB,MAEhC,CAED,GAAIiqB,eAAAA,EAAUK,KACZ,IAAK,MAAMA,KAAQL,EAASK,KAC1BJ,GAAeI,EAAK3oB,KAAO,OAI/B,OACE1D,gBAAC+O,EAAAA,MAAK,KACJ/O,EAAAqB,cAACyN,QAA+B,KAAA,qBAChC9O,EAACqB,cAAAC,SAAMgO,GAAG,KAAK/N,QAAS,IACrBwqB,EAAiBO,SAChBtsB,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAC+N,OAAI,CAAC5G,KAAK,KAAK+jB,UAAU,YAAYzjB,MAAM,UAErC,WACP9I,EAAAqB,cAAC+N,EAAAA,KAAI,KACHpP,EAAAqB,cAACoqB,GAAa,CAAC1rB,MAAOgsB,EAAiBO,QAASjU,MAAM,MAI3D0T,EAAiBS,oBAChBT,EAAiBS,mBAAmB/mB,KAAKgnB,GACvCzsB,EAAKqB,cAAA,MAAA,CAAAsE,IAAK8mB,EAAY1U,WACpB/X,EAAAqB,cAAC+N,OAAI,CAAC5G,KAAK,KAAK+jB,UAAU,YAAYzjB,MAAM,UAErC,eACP9I,EAAAqB,cAAC+N,EAAAA,KAAI,KACHpP,EAAAqB,cAACoqB,GAAa,CAAC1rB,MAAO0sB,EAAapU,MAAM,QAIhD0T,EAAiBW,QAChB1sB,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAC+N,OAAI,CAAC5G,KAAK,KAAK+jB,UAAU,YAAYzjB,MAAM,UAErC,UACP9I,EAACqB,cAAA+N,EAAAA,KAAM,KAAAwK,EAAcA,eAACmS,EAAiBW,UAG1CX,EAAiBY,QAChB3sB,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAC+N,OAAI,CAAC5G,KAAK,KAAK+jB,UAAU,YAAYzjB,MAAM,UAErC,UACP9I,EAACqB,cAAA+N,EAAAA,KAAM,KAAAsO,EAAUA,WAACqO,EAAiBY,WAIxCZ,EAAiBthB,QAAUzK,EAACqB,cAAAurB,GAAiB,CAAA7sB,MAAOgsB,EAAiBthB,SACrEwhB,GAAejsB,2BAAMisB,EAAY1V,QAGxC,CAMM,SAAUqW,GAAiB/sB,SAC/B,MAAMsL,QAAEA,GAAYP,KACpB,OACE5K,EAAOqB,cAAA,QAAA,CAAAgK,UAAWF,EAAQ8d,OACxBjpB,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAaqB,cAAA,KAAA,KAAA,QACbrB,EAAcqB,cAAA,KAAA,KAAA,SACdrB,EAAwBqB,cAAA,KAAA,KAAA,mBACxBrB,EAAAqB,cAAA,KAAA,KAAA,oBAGJrB,EAAAqB,cAAA,QAAA,aACGiG,EAAAzH,EAAME,4BAAO0F,KAAI,CAAConB,EAAa1sB,IAC9BH,EAAAqB,cAACyrB,GAAc,CAACnnB,IAAK,OAASxF,EAAOJ,MAAO8sB,OAKtD,CAMA,SAASC,GAAejtB,GACtB,MAAMsL,QAAEA,EAAOgB,GAAEA,GAAOvB,KAClBiiB,EAAcjQ,GAAY/c,EAAME,OACtC,IAAK8sB,EACH,OAAO,KAGT,MAAME,EAsDR,SAAoBF,eAClB,MAAMpU,EAAmD,QAA5CoH,EAAuC,kBAAvCzY,UAAAE,EAAAulB,EAAYG,qCAAiB,yBAAIpN,cAAM,IAAAzY,OAAA,EAAAA,EAAG,UAAE,IAAA0Y,OAAA,EAAAA,EAAEpH,KAC3D,MAAgB,OAATA,GAA0B,OAATA,GAA0B,OAATA,GAA0B,MAATA,CAC5D,CAzDmBwU,CAAWJ,GAE5B,OACE7sB,EAAAqB,cAAA,KAAA,CAAIgK,UAAWc,EAAG,CAAE,CAAChB,EAAQugB,aAAcqB,KACzC/sB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACiW,GAAW,CAACG,GAAIoV,GACf7sB,EAACqB,cAAA0U,IAAuBhW,MAAO8sB,EAAYpU,SAG/CzY,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAC6rB,GAAwB,CAAAntB,MAAO8sB,KAElC7sB,EAAAqB,cAAA,KAAA,KACErB,EAACqB,cAAA8rB,IAAsBptB,MAAO8sB,EAAYO,kBAE5CptB,EAAAqB,cAAA,KAAA,KACGwrB,EAAYG,gBAAkBH,EAAYG,eAAe3sB,OAAS,GACjEL,EAAAqB,cAAC0U,GAAsB,CAAChW,MAAO8sB,EAAYG,eAAe,MAKpE,CAMA,SAASE,GAAwBrtB,GAC/B,MAAMwtB,EAAMxtB,EAAME,MAClB,OAAOC,gCAAGstB,EAAsBA,uBAACD,GACnC,CAMA,SAASF,GAAsBttB,GAC7B,MAAM0tB,EAAQ1tB,EAAME,OAASF,EAAME,MAAMM,OAAS,GAAKR,EAAME,MAAM,GACnE,OAAKwtB,EAGDA,EAAM7pB,KACD1D,EAAGqB,cAAArB,EAAAwH,SAAA,KAAA+lB,EAAM7pB,MAEX1D,gBAACiX,GAAY,CAAClX,MAAOwtB,IALnB,IAMX,CC5LA,MAAM3iB,GAAYC,EAAAA,cAAcS,IAAW,CACzCR,KAAM,CACJ4a,eAAgB,WAChB7gB,MAAO,OAEP,OAAQ,CACNyQ,UAAW,eAAehK,EAAMiK,OAAOC,KAAK,MAG9C,aAAc,CACZtQ,QAAS,GAAGoG,EAAM/J,QAAQ8T,QAAQ/J,EAAM/J,QAAQ8T,OAChDmY,cAAe,QAInBC,QAAS,CACP3kB,MAAOwC,EAAMiK,OAAOsW,IAAI,GACxB6B,eAAgB,gBAGlBC,MAAO,CACL7kB,MAAOwC,EAAMiK,OAAOqY,MAAM,QASxB,SAAUC,GAAkBhuB,GAChC,MAAMsL,QAAEA,GAAYP,KACdxH,EAAUD,KACT2qB,EAAQC,GAAaltB,EAAQA,WAMpC,GAJA6P,EAAAA,WAAU,KACRtN,EAAQ4qB,cAAcnuB,EAAMouB,SAASpW,cAAchR,KAAKknB,GAAW/mB,MAAMwN,QAAQC,IAAI,GACpF,CAACrR,EAASvD,EAAMouB,SAASpW,gBAEvBiW,EACH,OAAO,KAGT,MAAMjS,EAAaiS,EAAO/R,MAAMlc,EAAMouB,SAASpW,cAC/C,OAAKgE,EAKH7b,EAAOqB,cAAA,QAAA,CAAAgK,UAAWF,EAAQL,MACxB9K,EAAAqB,cAAA,WAAA,KACErB,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEO,MAAO,SACrB7E,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEO,MAAO,SACrB7E,EAAKqB,cAAA,MAAA,CAAAiD,MAAO,CAAEO,MAAO,UAEvB7E,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAiBqB,cAAA,KAAA,KAAA,YACjBrB,EAAeqB,cAAA,KAAA,KAAA,UACfrB,EAAAqB,cAAA,KAAA,KAAA,WAGJrB,EAAAqB,cAAA,QAAA,KACGZ,OAAOub,QAAQH,EAAWI,YAAYxW,KAAKyW,IAC1C,MAAMvW,EAAMuW,EAAM,GAClB,GAAY,OAARvW,GAAwB,SAARA,EAClB,OAAO,KAGT,MAAM4S,EAAW2D,EAAM,IAChBgS,EAAuBC,GAAwB7S,GAAgB8S,EAAYA,aAACvuB,EAAMouB,UAAWtoB,IAC7F0oB,EAAsBC,GAAuBhT,GAAgB8S,EAAYA,aAACvuB,EAAM0uB,SAAU5oB,GACjG,OAAI6oB,GAAQN,IAA0BM,GAAQH,IAI1CjW,EAASA,UAAC8V,KAA2B9V,EAASA,UAACiW,GAH1C,KAQPruB,EAAAqB,cAAA,KAAA,CAAIsE,IAAKA,GACP3F,EAAAqB,cAAA,KAAA,KAAK+a,EAAsBA,uBAACzW,IAC5B3F,EAAAqB,cAAA,KAAA,CAAIgK,UAAWF,EAAQsiB,SACrBztB,EAAAqB,cAACqX,GACC,CAAAH,SAAUA,EACVC,aAAc2V,EACdpuB,MAAOmuB,EACPtV,qBAAqB,KAGzB5Y,EAAAqB,cAAA,KAAA,CAAIgK,UAAWF,EAAQwiB,OACrB3tB,EAACqB,cAAAqX,IACCH,SAAUA,EACVC,aAAc8V,EACdvuB,MAAOsuB,EACPzV,qBAAqB,KAI3B,MAvDD,IA4DX,CAEA,SAAS4V,GAAQzuB,GACf,OACGA,GACA6H,MAAM8T,QAAQ3b,IAA2B,IAAjBA,EAAMM,QACb,iBAAVN,GAAoD,IAA9BU,OAAOuU,KAAKjV,GAAOM,MAErD,CC5GM,SAAUouB,GAAc5uB,GAC5B,MAAMuD,EAAUD,IACVpD,EAAQ6c,GAAY/c,EAAME,QACzB+tB,EAAQC,GAAaltB,EAAQA,WAQpC,OANA6P,EAAAA,WAAU,KACJ3Q,GACFqD,EAAQ4qB,cAAcjuB,EAAM8X,cAAchR,KAAKknB,GAAW/mB,MAAMwN,QAAQC,IACzE,GACA,CAACrR,EAASrD,IAER+tB,GAAW/tB,EAKdC,gBAACkb,GAAsB,CACrBnb,MAAO,CAAEiC,KAAMjC,EAAM8X,aAAc9X,SACnC6Y,oBAAqB/Y,EAAM+Y,sBANtB,IASX,CChBa,MAAA8V,WAAsB1uB,EAAM2uB,UAGvCC,YAAY/uB,GACVgvB,MAAMhvB,GACNwO,KAAK3L,MAAQ,EACd,CAEDosB,gCAAgC3f,GAC9B,MAAO,CAAEA,QACV,CAED4f,kBAAkB5f,EAAc6f,GAC9Bxa,QAAQrF,MAAM,kBAAmBA,EAAO6f,EACzC,CAEDC,SACE,OAAI5gB,KAAK3L,MAAMyM,MAEXnP,EAAAqB,cAACuR,EAAAA,MAAK,CAACC,KAAM7S,EAAAqB,cAACyR,kBAAe,CAACtK,KAAM,KAAQpE,MAAM,uBAAuB0E,MAAM,OAC5EomB,EAAoBA,qBAAC7gB,KAAK3L,MAAMyM,QAKhCd,KAAKxO,MAAMsG,QACnB,EC3BG,SAAUgpB,GAAStvB,GACvB,OAAOG,gBAACiL,EAAS,KAAEpL,EAAMsG,SAC3B,CASM,SAAUipB,GAAavvB,WAC3B,MAAMgd,SAAEA,EAAQvZ,QAAEA,EAAO4B,QAAEA,EAAOmqB,eAAEA,GAA8BxvB,EAAXqL,EAAMhC,EAAKrJ,EAA5D,CAAA,WAAA,UAAA,UAAA,mBACA2D,EAASF,QAAAA,EAAwB,QAAbgE,EAAAuV,EAASyS,YAAI,IAAAhoB,OAAA,EAAAA,EAAE9D,OAEzC,OACExD,EAACqB,cAAA2K,EAAkBvL,OAAAC,OAAA,CAAA,cAAA,gBAAgB6K,MAAM,GAAUL,GACjDlL,EAAAqB,cAACC,QAAM,CAAA+N,SAAS,QAAQ9N,QAAS,EAAGguB,GAAG,KAAKhc,GAAG,MAC7CvT,EAAAqB,cAACwhB,GAAc,CAAC9iB,MAAOyD,EAAQ6U,MAAM,EAAM7P,KAAK,OAChDxI,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEqQ,KAAM,IAClB3U,EAAAqB,cAAC+N,EAAAA,KAAI,CAAC5G,KAAK,MACTxI,EAAAqB,cAACmqB,GAAa,CAAA1iB,MAAM,OAAO8L,OAAQ,IAAK7U,MAAOyD,EAAQ6U,MAAM,KAE/DrY,EAAAqB,cAAC+N,EAAAA,KAAI,CAAC5G,KAAK,MACTxI,EAACqB,cAAAiW,IAAYxO,MAAM,SAAS2O,GAAI5X,EAAMgd,UACnCjD,iBAAkC,QAAnBxS,EAAAvH,EAAMgd,SAASyS,YAAI,IAAAloB,OAAA,EAAAA,EAAEooB,cAEvCxvB,EAAAqB,cAAC+N,OAAI,CAAC6E,UAAU,OAAOnL,MAAM,SAASymB,GAAI,GAEnC,KACPvvB,EAAAqB,cAACiW,GAAY,CAAAxO,MAAM,SAAS2O,GAAI5X,EAAMgd,UACnChd,EAAMgd,SAAShF,gBAIrBwX,GACCrvB,EAACqB,cAAAouB,EAAAA,MAAKpgB,SAAS,aAAaxD,OAAO,KAAKhH,MAAO,KAC7C7E,EAACqB,cAAAouB,OAAKC,OAAM,KACV1vB,EAAAqB,cAACkH,EAAAA,WAAU,CAACuD,OAAO,KAAI,aAAa,eAAe6jB,EAAAA,mBAAmB9vB,EAAMgd,aAC1E7c,EAACqB,cAAAuuB,WAAW,QAGfP,IAIPrvB,EAAAqB,cAACqtB,GAAa,KACXxpB,GAAWlF,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEY,QAAS,qBAAuBrF,EAAMsG,WAC9DjB,GAAWlF,EAAAqB,cAAArB,EAAAwH,SAAA,KAAG3H,EAAMsG,WAI9B,CC9DM,SAAU0pB,GAAsBtL,GACpCA,EAAUuL,KAAKC,GACjB,CAEA,SAASA,GAAuBC,EAAaC,GAC3C,MAAMC,EAAYC,GAAiBH,GAC7BI,EAAYD,GAAiBF,GACnC,OAAIC,EAAYE,EACP,EAELF,EAAYE,GACN,EAEHhG,GAAQ4F,GAAK5F,GAAQ6F,EAC9B,CAEA,SAASE,GAAiBtT,GACxB,MAAMwT,EAAYxT,EAAiBwT,SACnC,MAAwB,iBAAbA,GACF,CAAEC,KAAM,EAAGC,KAAM,EAAGC,OAAQ,GAAIH,IAElC,CACT,CAEA,SAASjG,GAAQvN,SACf,GAA8B,kBAA1BA,EAAShF,cAAoCgF,EAAS4T,KACxD,OAAO,IAAI3sB,KAAK+Y,EAAS4T,MAAMrG,UAGjC,IAC6B,qBAA1BvN,EAAShF,cACkB,UAA1BgF,EAAShF,cACiB,gBAA1BgF,EAAShF,eACXgF,EAAS6P,OAET,OAAO,IAAI5oB,KAAK+Y,EAAS6P,QAAQtC,UAGnC,GAA8B,sBAA1BvN,EAAShF,cAAwCgF,EAAS1D,KAC5D,OAAO,IAAIrV,KAAK+Y,EAAS1D,MAAMiR,UAGjC,MAAM1Q,EAAwB,QAAbpS,EAAAuV,EAASyS,YAAI,IAAAhoB,OAAA,EAAAA,EAAEkoB,YAChC,OAAK9V,EAGE,IAAI5V,KAAK4V,GAAU0Q,UAFjB,CAGX,CCbA,MAAMxf,GAAYC,EAAAA,cAAcS,IAAW,CACzColB,cAAe,CACbrH,gBAAiB/d,EAAMiK,OAAOob,KAAK,QAWjC,SAAUC,GAAqC/wB,GACnD,MAAM0X,EAAWC,EAAAA,cACXpU,EAAUD,IACV0tB,EAASztB,EAAQ0tB,aACjBC,EAAW/vB,SAAyB,MACpC6b,EAAWD,GAAY/c,EAAME,QAC5BixB,EAASC,GAAcpwB,EAAQA,YAC/BqwB,EAAOC,GAAYtwB,EAAQA,SAAa,IACzCuwB,EAAsBvxB,EAAMuxB,oBAE5BC,EAAWrwB,SAAmBkwB,GACpCG,EAASjwB,QAAU8vB,EAEnB,MAAMI,EAAenT,EAAAA,aAAY,KAC/B,IAAKtB,EAGH,OAFAsU,EAAS,SACTF,EAAW,CAAY,GAGzB7tB,EAAQmuB,aAAaH,EAAoBvU,IAAWhW,KAAK2qB,GAAqBxqB,MAAMwN,QAAQC,IAAI,GAC/F,CAACrR,EAASyZ,EAAUuU,IAUvB,SAASI,EAAoBC,GAC3B,MAAMC,EAAW,GAEjB,GAAID,EAAcvV,MAAO,CACvB,IAAK,MAAMyV,KAAcF,EAAcvV,MAAO,CAC5C,MAAM0V,EAASD,EAAW9U,SAC1B,GAAK+U,IAKe,YAAhBA,EAAO5vB,MACTivB,EAAWW,GAGTA,EAAO1V,OACT,IAAK,MAAMA,KAAS0V,EAAO1V,MACrBA,EAAMW,UACR6U,EAASlxB,KAAK0b,EAAMW,SAI3B,CAEDgT,GAAsB6B,GACtBA,EAASG,SACV,CAEDV,EAASO,EACV,CAMD,SAASI,EAAavN,GACpB,MAAMmN,EAAW,IAAIL,EAASjwB,WAAYmjB,GAC1CsL,GAAsB6B,GACtBA,EAASG,UACTV,EAASO,EACV,CAqDD,SAASK,EACPC,EACA3B,GAEA,OAAOjtB,EAAQ6uB,eAAcxxB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMsxB,GAAe,CAAA3B,aACnD,CAED,SAAS6B,EAAMF,GACbD,EAAYC,EAAe,QAAQnrB,KAAKyqB,GAActqB,MAAMwN,QAAQC,IACrE,CAED,SAAS0d,EAAQH,GACfD,EAAYC,EAAe,WAAWnrB,KAAKyqB,GAActqB,MAAMwN,QAAQC,IACxE,CAED,SAAS2d,EAAUC,GACjB9a,EAAS,IAAI8a,EAAaxa,gBAAgBwa,EAAazhB,KACxD,CAED,SAAS0hB,EAAOD,GACd9a,EAAS,IAAI8a,EAAaxa,gBAAgBwa,EAAazhB,UACxD,CAED,SAAS2hB,EAASF,GAChB9a,EAAS,IAAI8a,EAAaxa,gBAAgBwa,EAAazhB,YACxD,CAED,SAAS4hB,EAAiBC,SACxBlb,EAAS,IAAIkb,EAAQ5a,gBAAgB4a,EAAQ7hB,uBAAetJ,EAAAmrB,EAAQnD,2BAAMoD,YAC3E,CAwBD,OA1JAhiB,EAAAA,WAAU,KACR4gB,GAAc,GACb,CAACA,IAwJCzU,EASH7c,gBAACmvB,GAAQ,KACNtvB,EAAM8yB,qBACL3yB,gBAACgM,EAAK,KACJhM,EAACqB,cAAA2L,EACC,CAAAC,OAAO,gBACPC,SAAWC,IAlHrB,IAAuBylB,IAmHGzlB,EAASzJ,KAlH5BmZ,GAAahd,EAAM8yB,qBAIxBvvB,EACGyvB,eAAehzB,EAAM8yB,oBAAoB9V,EAAUgU,EAAQ+B,IAC3D/rB,MAAM4D,IACLqnB,EAAa,CAACrnB,GAAQ,IAEvBzD,MAAMwN,QAAQC,KA2GP,MAAM2J,EAAQ2S,EAAS3vB,QACnBgd,IACFA,EAAMre,MAAQ,GACdqe,EAAM0U,QACP,GAGH9yB,EAAAqB,cAACC,QAAK,CAACC,QAAQ,KAAKE,QAAO,EAAA6C,MAAO,CAAEO,MAAO,SACzC7E,EAAAqB,cAACwhB,GAAc,CAAC9iB,MAAO8wB,IACvB7wB,EAACqB,cAAAa,EAASA,UACR,CAAAuB,KAAK,OACLiE,IAAKqpB,EACL5uB,YAAY,cACZmC,MAAO,CAAEO,MAAO,OAAQN,SAAU,OAEpCvE,EAAAqB,cAACkH,aAAW,CAAAvG,KAAK,SAAS8J,OAAO,KAAKhD,MAAM,OAAOmiB,QAAQ,UACzDjrB,EAAAqB,cAAC0xB,EAAWA,YAAC,CAAAvqB,KAAM,MAErBxI,EAAAqB,cAACgF,EAAgB,CACfU,SAvHd,SAAqB8B,GACdgU,GAAahd,EAAMmzB,aAIxB5vB,EACGyvB,eAAehzB,EAAMmzB,YAAYnW,EAAUgU,EAAQhoB,IACnDhC,MAAM4D,GAAWqnB,EAAa,CAACrnB,MAC/B5D,MAAK,IACJosB,EAAAA,mBAAmB,CACjBriB,GAAI,sBACJ9H,MAAO,OACP1E,MAAO,kBACP8uB,QAAS,GACTrgB,KAAM7S,EAACqB,cAAA8xB,EAASA,WAAC3qB,KAAM,KACvB4qB,UAAW,QAGdpsB,OAAOqsB,GACNJ,qBAAmB,CACjBriB,GAAI,sBACJ9H,MAAO,MACP1E,MAAO,eACP8uB,QAAShE,EAAoBA,qBAACmE,GAC9BxgB,KAAM7S,EAACqB,cAAAiyB,EAAaA,eAAC9qB,KAAM,KAC3B4qB,UAAW,OAGlB,EA4Fa3sB,cA3Dd,WACE8sB,mBAAiB,CACf3iB,GAAI,sBACJoT,SAAS,EACT5f,MAAO,yBACP8uB,QAAS,iBACTE,WAAW,EACXI,eAAe,GAElB,EAmDa5sB,iBAjDd,SAA0BhF,GACxBqxB,qBAAmB,CACjBriB,GAAI,sBACJoT,SAAS,EACT5f,MAAO,eACP8uB,QAASO,GAAmB7xB,GAC5BwxB,WAAW,EACXI,eAAe,GAElB,IA0Ce3zB,GACAG,EAACqB,cAAAkH,EAAAA,WAAe9H,OAAAC,OAAA,CAAA,EAAAb,GAAOiM,OAAO,KAAKhD,MAAM,OAAOmiB,QAAQ,WACtDjrB,EAAAqB,cAAC0H,EAAeA,gBAAA,CAACP,KAAM,WAQpC0oB,EAAMzrB,KAAKmY,UACV,GAAIA,EAAK/F,eAAiBgF,EAAShF,cAAgB+F,EAAKhN,KAAOiM,EAASjM,GACtE,OACE5Q,EAACqB,cAAAqyB,GACC,CAAA/tB,IAAc,QAAT2B,EAAAsW,EAAK0R,YAAI,IAAAhoB,OAAA,EAAAA,EAAEorB,UAChB1B,QAASA,EACTnU,SAAUe,EACVwU,UAAWI,IAIjB,MAAM7sB,EAAM,GAAGiY,EAAK/F,gBAAgB+F,EAAKhN,KACzC,OAAQgN,EAAK/F,cACX,IAAK,aACH,OAAO7X,EAACqB,cAAAsyB,GAAuB,CAAAhuB,IAAKA,EAAKkX,SAAUe,EAAMwU,UAAWA,IACtE,IAAK,gBACH,OACEpyB,EAACqB,cAAAuyB,GACC,CAAAjuB,IAAKA,EACLkX,SAAUe,EACVsU,MAAyB,SAAlBtU,EAAKyS,SAAsB6B,OAAQlvB,EAC1CmvB,QAA2B,SAAlBvU,EAAKyS,SAAsB8B,OAAUnvB,EAC9CovB,UAAWA,EACXE,OAAQA,EACRC,SAAUA,IAGhB,IAAK,mBACH,OACEvyB,EAACqB,cAAAwyB,GACC,CAAAluB,IAAKA,EACLkX,SAAUe,EACVwU,UAAWA,EACXE,OAAQA,EACRC,SAAUA,IAGhB,IAAK,QACH,OACEvyB,EAACqB,cAAAyyB,GAAkB,CAAAnuB,IAAKA,EAAKkX,SAAUe,EAAMwU,UAAWA,EAAWE,OAAQA,EAAQC,SAAUA,IAEjG,QACE,OACEvyB,EAAAqB,cAAC+tB,GAAY,CAACzpB,IAAKA,EAAKkX,SAAUe,EAAM1Y,SAAS,GAC/ClF,EAAAqB,cAACotB,GAAa,CAAC1uB,MAAO6d,EAAMhF,qBAAqB,KAGxD,KA/FH5Y,EAAAqB,cAACsN,EAAAA,OAAM,CAACrK,MAAO,CAAEO,MAAO,OAAQC,OAAQ,SACtC9E,EAAAqB,cAAC2jB,SAAM,MAkGf,CAWA,SAAS+O,GAA0Cl0B,GACjD,OACEG,EAAAqB,cAACouB,EAAIA,KAACuE,SAAQ,KACZh0B,EAACqB,cAAAouB,EAAAA,KAAKwE,MAA2B,KAAA,YAChCp0B,EAAMqyB,OACLlyB,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAAC8yB,EAAAA,QAAQ,CAAA3rB,KAAM,KACrBR,QAAS,IAAOnI,EAAMqyB,MAAgCryB,EAAMgd,uBAChD,OAAO8S,EAAkBA,mBAAC9vB,EAAMgd,oBAK/Chd,EAAMsyB,SACLnyB,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAAC+yB,EAAAA,cAAc,CAAA5rB,KAAM,KAC3BR,QAAS,IAAOnI,EAAMsyB,QAAkCtyB,EAAMgd,uBAClD,SAAS8S,EAAkBA,mBAAC9vB,EAAMgd,sBAKjDhd,EAAMuyB,WACLpyB,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACgzB,EAAAA,gBAAgB,CAAA7rB,KAAM,KAC7BR,QAAS,IAAOnI,EAAMuyB,UAAoCvyB,EAAMgd,uBACpD,WAAW8S,EAAkBA,mBAAC9vB,EAAMgd,wBAKnDhd,EAAMyyB,QACLtyB,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACizB,EAAAA,SAAS,CAAA9rB,KAAM,KACtBR,QAAS,IAAOnI,EAAMyyB,OAAiCzyB,EAAMgd,uBACjD,QAAQ8S,EAAkBA,mBAAC9vB,EAAMgd,qBAKhDhd,EAAM0yB,UACLvyB,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAACqB,cAAAouB,EAAAA,KAAKwE,MAA8B,KAAA,eACpCj0B,EAACqB,cAAAouB,EAAIA,KAACyE,KAAI,CACRprB,MAAM,MACN+J,KAAM7S,gBAACu0B,EAAAA,UAAS,CAAC/rB,KAAM,KACvBR,QAAS,IAAOnI,EAAM0yB,SAAmC1yB,EAAMgd,uBACnD,UAAU8S,EAAAA,mBAAmB9vB,EAAMgd,wBAQ3D,CAMA,SAAS6W,GAAoB7zB,GAC3B,MAAM20B,EAiBR,SAAqBxD,EAAiByB,GACpC,MAAMzW,EAAUgV,EAAQ9U,MAClB/b,EAAQ6b,EAAQyY,WAAWvY,IAAS,IAAA5U,EAAAF,EAAAD,EAAC,OAAsB,UAAN,QAAhBG,EAAA4U,EAAMW,gBAAU,IAAAvV,OAAA,EAAAA,EAAAgoB,YAAM,IAAAloB,OAAA,EAAAA,EAAAsrB,sBAAcvrB,EAAAsrB,EAAQnD,2BAAMoD,UAAS,IACtG,GAAIvyB,GAAS6b,EAAQ3b,OAAS,EAC5B,OAEF,OAAO2b,EAAQ7b,EAAQ,GAAG0c,QAC5B,CAxBmB6X,CAAY70B,EAAMmxB,QAASnxB,EAAMgd,UAClD,OAAI2X,EAEAx0B,gBAACovB,GAAY,CAACvS,SAAUhd,EAAMgd,SAAU3X,SAAS,EAAMmqB,eAAgBrvB,gBAAC+zB,GAAqBtzB,OAAAC,OAAA,CAAA,EAAKb,KAChGG,EAAAqB,cAACwsB,GAAiB,CAACI,SAAUuG,EAAUjG,QAAS1uB,EAAMgd,YAKxD7c,gBAACovB,GAAY,CAACvS,SAAUhd,EAAMgd,SAAU3X,SAAS,EAAMmqB,eAAgBrvB,gBAAC+zB,GAAqBtzB,OAAAC,OAAA,CAAA,EAAKb,KAChGG,EAAgBqB,cAAA,KAAA,KAAA,WAChBrB,EAAAqB,cAACotB,GAAa,CAAC1uB,MAAOF,EAAMgd,SAAUjE,qBAAqB,IAInE,CAWA,SAASgb,GAA0B/zB,WACjC,MAAMsL,QAAEA,GAAYP,KAEdS,GADWxL,EAAMgd,SAASwT,UAAwC,YAA5BxwB,EAAMgd,SAASwT,cAC/BrtB,EAAYmI,EAAQulB,cAChD,OACE1wB,EAAAqB,cAAC+tB,GAAY,CACXvS,SAAUhd,EAAMgd,SAChBvZ,QAASzD,EAAMgd,SAASgU,OACxB3rB,SAAS,EACTmG,UAAWA,EACXgkB,eAAgBrvB,EAAAqB,cAAC0yB,GAAqBtzB,OAAAC,OAAA,GAAKb,KAE3CG,EAAAqB,cAAA,IAAA,KAAiC,QAA7B+F,EAAyB,QAAzBE,EAAAzH,EAAMgd,SAAS8X,eAAU,IAAArtB,OAAA,EAAAA,EAAA,UAAI,IAAAF,OAAA,EAAAA,EAAAwrB,eAGvC,CAEA,SAASkB,GAAkBj0B,SACzB,MAAMqE,EAAsC,QAAxBoD,EAAAzH,EAAMgd,SAAS+X,eAAS,IAAAttB,OAAA,EAAAA,EAAApD,YACtCgB,EACJhB,IACCA,EAAYG,WAAW,YACvBH,EAAYG,WAAW,WACR,oBAAhBH,EACF,OACElE,gBAACovB,GAAY,CAACvS,SAAUhd,EAAMgd,SAAU3X,UAAWA,EAASmqB,eAAgBrvB,EAACqB,cAAA0yB,GAA0BtzB,OAAAC,OAAA,CAAA,EAAAb,KACrGG,EAAAqB,cAAC4C,EAAiB,CAAClE,MAAOF,EAAMgd,SAAS+X,UAG/C,CAEA,SAASjB,GAAuB9zB,GAC9B,OACEG,gBAACovB,GAAY,CAACvS,SAAUhd,EAAMgd,SAAU3X,SAAS,EAAMmqB,eAAgBrvB,gBAAC+zB,GAAqBtzB,OAAAC,OAAA,CAAA,EAAKb,KAChGG,EAAAqB,cAACwzB,EAAAA,WAAU,KACT70B,EAAMqB,cAAA,MAAA,KAAAxB,EAAMgd,SAASiY,cAI7B,CAEA,SAASjB,GAA6Bh0B,GACpC,OACEG,gBAACovB,GAAY,CAACvS,SAAUhd,EAAMgd,SAAU3X,SAAS,EAAMmqB,eAAgBrvB,gBAAC+zB,GAAqBtzB,OAAAC,OAAA,CAAA,EAAKb,KAChGG,EAACqB,cAAAyqB,GAAwB,CAAA/rB,MAAOF,EAAMgd,WAG5C,CAEA,SAAS4W,GAAmB7xB,GAC1B,GAAIA,EAAEmzB,iBAAkB,CACtB,MAAMC,EAAW,IAAMpzB,EAAEqzB,OAAUrzB,EAAEszB,MACrC,MAAO,aAAaC,GAAevzB,EAAEqzB,aAAaE,GAAevzB,EAAEszB,UAAUF,EAAQI,QAAQ,KAC9F,CACD,MAAO,aAAaD,GAAevzB,EAAEqzB,SACvC,CAEA,SAASE,GAAeE,GACtB,GAAa,GAATA,EACF,MAAO,SAET,MAAMzzB,EAAI0zB,KAAKC,MAAMD,KAAK7gB,IAAI4gB,GAASC,KAAK7gB,IAAI,OAChD,OAAQ4gB,EAAQC,KAAKE,IAAI,KAAM5zB,IAAIwzB,QAAQ,GAAK,IAAM,SAASvN,OAAOjmB,GAAK,GAC7E,CCleM,SAAU6zB,GAAgB51B,GAC9B,IAAIE,EAEJ,IACEA,EAAQ21B,EAAYA,aAAC71B,EAAMsb,KAAMtb,EAAMgd,SAIxC,CAHC,MAAOnO,GAEP,OADA8F,QAAQmhB,KAAK,mBAAoBjnB,GAC1B,IACR,CAED,GAAI3O,EAAMM,OAAS,EACjB,MAAM,IAAI+a,MACR,4FACYrb,EAAMM,2BACdihB,KAAKlJ,UAAUrY,EAAO,KAAM,OAGpC,OAAOC,gBAAC0Y,GAAuB,CAAC3Y,MAAOA,EAAM,IAAM,GAAIyY,aAAc3Y,EAAM2Y,cAC7E,CCdA,MAAMod,GAAqD,CACzDtc,OAAQ,CAACuc,WAASC,OAAQD,EAAQA,SAACE,IAAKF,WAASG,SAAUH,EAAQA,SAACI,OACpEC,SAAU,CAACL,WAASC,OAAQD,EAAQA,SAACE,IAAKF,WAASG,SAAUH,EAAQA,SAACI,OACtEE,MAAO,CAACN,EAAQA,SAACC,OAAQD,EAAAA,SAASE,KAClChe,UAAW,CAAC8d,EAAQA,SAACC,OAAQD,EAAAA,SAASE,KACtCK,QAAS,CACPP,EAAAA,SAASC,OACTD,EAAAA,SAASQ,WACTR,EAAAA,SAASS,aACTT,EAAAA,SAASU,UACTV,EAAAA,SAASW,uBACTX,EAAAA,SAASY,qBAEXC,SAAU,CACRb,EAAAA,SAASC,OACTD,EAAAA,SAASQ,WACTR,EAAAA,SAASS,aACTT,EAAAA,SAASU,UACTV,EAAAA,SAASW,uBACTX,EAAAA,SAASY,qBAEXtd,KAAM,CACJ0c,EAAAA,SAASC,OACTD,EAAAA,SAASQ,WACTR,EAAAA,SAASS,aACTT,EAAAA,SAASU,UACTV,EAAAA,SAASW,uBACTX,EAAAA,SAASY,oBACTZ,EAAAA,SAASc,aACTd,EAAAA,SAASe,YACTf,EAAAA,SAASgB,eAEXC,SAAU,CACRjB,EAAAA,SAASC,OACTD,EAAAA,SAASQ,WACTR,EAAAA,SAASS,aACTT,EAAAA,SAASU,UACTV,EAAAA,SAASW,uBACTX,EAAAA,SAASY,oBACTZ,EAAAA,SAASc,aACTd,EAAAA,SAASe,YACTf,EAAAA,SAASgB,gBAIPE,GAA0C,CAC9CC,GAAI,SACJC,GAAI,aACJC,GAAI,eACJC,GAAI,YACJC,GAAI,yBACJC,GAAI,sBACJC,GAAI,eACJC,GAAI,cACJC,GAAI,gBACJ9Y,SAAU,WACV+Y,MAAO,QACP/zB,KAAM,OACNg0B,IAAK,MACLC,MAAO,QACPC,MAAO,QACPC,GAAI,KACJ,SAAU,SACV,UAAW,UACXC,QAAS,WAQK,SAAAC,GAAW/O,EAA2BgP,GACpD,OAAAv3B,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACKsoB,GAAU,CACbgP,QAASA,EACTC,OAAQ,EACRx0B,UAAMT,GAEV,CAcgB,SAAAk1B,GAAoBlP,EAA2BvQ,GAC7D,OAAOsf,GACL/O,GACCA,EAAWgP,SAAW,IAAItqB,QAAQyqB,GAAMA,EAAE1f,OAASA,IAExD,CAUM,SAAU2f,GACdpP,EACAqP,EACAC,EACAv4B,EACAw4B,GAEIA,IACFvP,EAAakP,GAAoBlP,EAAYqP,IAG/C,MAAMG,EAAwB,GAM9B,OALIxP,EAAWgP,SACbQ,EAAYh4B,QAAQwoB,EAAWgP,SAEjCQ,EAAYh4B,KAAK,CAAEiY,KAAM4f,EAAOI,SAAUH,EAAIv4B,MAAOA,GAAS,KAEvDg4B,GAAW/O,EAAYwP,EAChC,CA4BgB,SAAAE,GAAa1P,EAA2B7oB,GACtD,IAAK6oB,EAAWgP,QACd,OAAOhP,EAET,MAAM2P,EAAa,IAAI3P,EAAWgP,SAElC,OADAW,EAAWhwB,OAAOxI,EAAO,GAEpBM,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAsoB,IACHgP,QAASW,EACTl1B,UAAMT,GAEV,CAOgB,SAAA41B,GAAmB5P,EAA2BqP,GAC5D,OAAOQ,GAAa7P,EAAYqP,GAAQ,EAC1C,CAOgB,SAAAS,GAAe9P,EAA2BqP,GACxD,OAAOQ,GAAa7P,EAAYqP,EAAO,EACzC,CAOgB,SAAAU,GAAkB/P,EAA2BqP,GAC3D,OAAOQ,GAAa7P,EAAYqP,EAAO,EACzC,CAYA,SAASQ,GAAa7P,EAA2BqP,EAAepO,GAC9D,MAAM+O,EAAY,IAAIl1B,KACtBk1B,EAAUlO,QAAQkO,EAAUjO,UAAYd,GACxC+O,EAAU3N,SAAS,EAAG,EAAG,EAAG,GAE5B,MAAM4N,EAAU,IAAIn1B,KAAKk1B,EAAU5O,WAInC,OAHA6O,EAAQnO,QAAQmO,EAAQlO,UAAY,GACpCkO,EAAQC,QAAQD,EAAQ7O,UAAY,GAE7B+O,GAAqBnQ,EAAYqP,EAAOW,EAAWC,EAC5D,CAOgB,SAAAG,GAAmBpQ,EAA2BqP,GAC5D,OAAOgB,GAAerQ,EAAYqP,GAAQ,EAC5C,CAOgB,SAAAiB,GAAmBtQ,EAA2BqP,GAC5D,OAAOgB,GAAerQ,EAAYqP,EAAO,EAC3C,CAOgB,SAAAkB,GAAmBvQ,EAA2BqP,GAC5D,OAAOgB,GAAerQ,EAAYqP,EAAO,EAC3C,CAYA,SAASgB,GAAerQ,EAA2BqP,EAAepO,GAChE,MAAM+O,EAAY,IAAIl1B,KACtBk1B,EAAUlP,SAASkP,EAAU3O,WAAaJ,GAC1C+O,EAAUlO,QAAQ,GAClBkO,EAAU3N,SAAS,EAAG,EAAG,EAAG,GAE5B,MAAM4N,EAAU,IAAIn1B,KAAKk1B,EAAU5O,WAMnC,OALA6O,EAAQnP,SAASmP,EAAQ5O,WAAa,GACtC4O,EAAQnO,QAAQ,GAChBmO,EAAQ5N,SAAS,EAAG,EAAG,EAAG,GAC1B4N,EAAQC,QAAQD,EAAQ7O,UAAY,GAE7B+O,GAAqBnQ,EAAYqP,EAAOW,EAAWC,EAC5D,CAOgB,SAAAO,GAAoBxQ,EAA2BqP,GAC7D,MAAMW,EAAY,IAAIl1B,KACtBk1B,EAAUlP,SAAS,GACnBkP,EAAUlO,QAAQ,GAClBkO,EAAU3N,SAAS,EAAG,EAAG,EAAG,GAI5B,OAAO8N,GAAqBnQ,EAAYqP,EAAOW,EAF/B,IAAIl1B,KAGtB,CASM,SAAUq1B,GAAqBnQ,EAA2BqP,EAAeoB,EAAUC,GAIvF,OAFA1Q,EAAa2Q,GADb3Q,EAAakP,GAAoBlP,EAAYqP,GACFA,EAAOxC,EAAAA,SAASW,uBAAwBiD,GACnFzQ,EAAa2Q,GAAkB3Q,EAAYqP,EAAOxC,EAAAA,SAASY,oBAAqBiD,EAElF,CASA,SAASC,GAAkB3Q,EAA2BqP,EAAeC,EAAcv4B,GACjF,OAAOq4B,GAAUpP,EAAYqP,EAAOC,EAAIv4B,EAAMgE,cAChD,CAOM,SAAU61B,GAAiB5Q,EAA2BqP,EAAet4B,GAAQ,GACjF,OAAOq4B,GAAUpP,EAAYqP,EAAOxC,EAAAA,SAASgE,QAAS95B,EAAMkZ,WAC9D,CAOgB,SAAA6gB,GAAU9Q,EAA2BiP,GACnD,OAAIjP,EAAWiP,SAAWA,EACjBjP,EAETvoB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACKsoB,GACH,CAAAiP,SACAx0B,UAAMT,GAEV,CAQgB,SAAA+2B,GAAQ/Q,EAA2BgR,SAGjD,OAAOF,GAAU9Q,GADEgR,EAAO,IADI,QAAhB1yB,EAAA0hB,EAAWiR,aAAK,IAAA3yB,EAAAA,EAAI4yB,wBAGpC,UAQgBC,GAAQnR,EAA2B8G,EAAcsK,GAC/D,OAAItK,IAASuK,GAAarR,SAAwBhmB,IAATo3B,GAAsBA,IAASE,GAAiBtR,GAChFA,EAGJvoB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAsoB,GACH,CAAAuR,UAAW,CACT,CACE9hB,KAAMqX,EACN0K,aAAcJ,IAGlB32B,UAAMT,GAEV,CAiBM,SAAUq3B,GAAarR,GAC3B,MAAMuR,EAAYvR,EAAWuR,UAC7B,IAAKA,GAAkC,IAArBA,EAAUl6B,OAC1B,OAEF,MAAMg4B,EAAQkC,EAAU,GAAG9hB,KAC3B,OAAO4f,EAAMh0B,WAAW,KAAOg0B,EAAMoC,OAAO,GAAKpC,CACnD,CAEM,SAAUiC,GAAiBtR,GAC/B,MAAMuR,EAAYvR,EAAWuR,UAC7B,SAAKA,GAAkC,IAArBA,EAAUl6B,WAGnBk6B,EAAU,GAAGC,UACxB,CAOM,SAAUE,GAAmBC,GACjC,OAAO/E,GAAuB+E,EAAY34B,KAC5C,CAQM,SAAU44B,GAAYtC,SAC1B,OAAwB,UAAjBvB,GAAcuB,UAAG,IAAAhxB,EAAAA,EAAI,EAC9B,CAOM,SAAUuzB,GAAqBl1B,GACnC,IAAIm1B,EAAMn1B,EAQV,OALIm1B,EAAIrpB,SAAS,OACfqpB,EAAMA,EAAItpB,MAAM,KAAKuX,OAIX,OAAR+R,EACK,KAIG,cAARA,EACK,cAITA,EAAMA,EAAIrd,QAAQ,MAAO,IAGzBqd,EAAMA,EAAIrd,QAAQ,WAAY,OAG9Bqd,EAAMA,EAAIrd,QAAQ,QAAS,KAG3Bqd,EAAMA,EAAIrd,QAAQ,OAAQ,KAG1Bqd,EAAMA,EAAIvkB,OAGHukB,EAAItpB,MAAM,MAAM/L,IAAIiY,cAAY9P,KAAK,KAC9C,CAQgB,SAAAmtB,GAAYle,EAAoBwb,WAC9C,MAAM1yB,EAAM0yB,EAAM50B,KAClB,MAAY,OAARkC,EACKkX,EAASjM,GAGN,mBAARjL,EACkB,UAAbkX,EAASyS,YAAI,IAAAhoB,OAAA,EAAAA,EAAEorB,UAGZ,iBAAR/sB,EACKiU,EAAcA,eAAc,QAAbxS,EAAAyV,EAASyS,YAAI,IAAAloB,OAAA,EAAAA,EAAEooB,aAInC6I,EAAM9a,mBAAqB,GAAGV,EAAShF,gBAAgBwgB,EAAM50B,SAAW40B,EAAM9a,kBAAkBpC,KAmBtG,SAA6B0B,EAAoBU,aAC/C,MAAMpC,GAAgD,QAAzChU,EAAoC,QAApCC,EAAwB,QAAxBE,EAAAiW,EAAkBpC,YAAM,IAAA7T,OAAA,EAAAA,EAAAkK,MAAM,YAAM,IAAApK,OAAA,EAAAA,EAAA2hB,aAAK,IAAA5hB,OAAA,EAAAA,EAAE6zB,WAAW,MAAO,MAAO,IAC1Ej7B,EAAOyY,GAAgB8C,GAAgB,CAAEtZ,KAAM6a,EAAShF,aAAc9X,MAAO8c,GAAY1B,GAChG,IAAKpb,EACH,OAAO,KAGT,OACEC,EAAAqB,cAACqX,GAAuB,CACtBH,SAAUgF,EACV/E,aAAcA,EACdzY,MAAOA,EACPwE,SAAU,IACVqU,qBAAqB,EACrBP,MAAM,GAGZ,CAnCW4iB,CAAoBpe,EAAUwb,EAAM9a,mBAIzC8a,EAAMlU,cAA8C,IAA9BkU,EAAMlU,aAAa9jB,QAAgBg4B,EAAM50B,OAAS40B,EAAMlU,aAAa,GAAG1L,KAwCpG,SACEoE,EACA8d,EACApd,GAEA,MAAMxd,EAAQm7B,EAAAA,kBAAkBP,EAAYltB,WAAsB,CAAC,CAAEzL,KAAM6a,EAAShF,aAAc9X,MAAO8c,KACzG,IAAK9c,GAA0B,IAAjBA,EAAMM,OAClB,OAAO,KAGT,GAAIkd,EACF,OACEvd,EAAAqB,cAACqX,GAAuB,CACtBF,aAAczY,EAAM,GAAGiC,KACvBjC,MAAOA,EAAM,GAAGA,MAChBwE,SAAU,IACVqU,qBAAqB,EACrBP,MAAM,IAKZ,OACErY,gCACGD,EAAM0F,KAAI,CAACC,EAAGvF,IACbH,EAAMqB,cAAA,OAAA,CAAAsE,IAAK,GAAGxF,KAASJ,EAAMM,UACb,iBAANqF,EAAiB4b,KAAKlJ,UAAU1S,GAAMA,KAKxD,CAtEWy1B,CAA2Bte,EAAUwb,EAAMlU,aAAa,GAAIkU,EAAM9a,mBAIpE,IACT,CChfM,SAAU6d,GAAkBv7B,SAChC,MAAO6C,EAAOC,GAAY9B,WAAS,CACjCw6B,OAAQ/Z,KAAKC,MAAMnJ,EAASA,UAACvY,EAAMw7B,WAG/BC,EAAet6B,SAA0B,MACzCu6B,EAAcv6B,SAA0B,MAkD9C,SAASw6B,YACP,MAAMC,EAAsC,QAAvBn0B,EAAA5E,EAAM24B,OAAOK,cAAU,IAAAp0B,EAAAA,EAAA,GACtC3B,EAA0B,QAApByB,EAAAk0B,EAAal6B,eAAO,IAAAgG,OAAA,EAAAA,EAAErH,MAClC,GAAI4F,EAAK,CACP,MAAMg2B,EAAY,IAAIF,EAAc91B,GACpChD,EAAS,CACP04B,OAAM56B,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDgC,EAAM24B,SACTK,OAAQC,KAGb,CACF,CAMD,SAASC,YACP,MAAMH,EAAsC,QAAvBn0B,EAAA5E,EAAM24B,OAAOK,cAAU,IAAAp0B,EAAAA,EAAA,GACtC3B,EAAyB,QAAnByB,EAAAm0B,EAAYn6B,eAAO,IAAAgG,OAAA,EAAAA,EAAErH,MACjC,GAAI4F,EAAK,CACP,MAAMg2B,EAAY,IAAIF,GACtBE,EAAUhzB,OAAOgzB,EAAUlyB,QAAQ9D,GAAM,GACzChD,EAAS,CACP04B,OAAM56B,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDgC,EAAM24B,SACTK,OAAQC,KAGb,CACF,CAkDD,SAASE,EAAWH,EAAkB/xB,EAAWmyB,GAC/C,MAAMC,EAAOL,EAAO/xB,GACpB+xB,EAAO/xB,GAAK+xB,EAAOI,GACnBJ,EAAOI,GAAKC,CACb,CAED,GAvIArrB,EAAAA,WAAU,KACR/N,EAAS,CAAE04B,OAAQx7B,EAAMw7B,QAAS,GACjC,CAACx7B,EAAMw7B,UAqILx7B,EAAMsmB,QACT,OAAO,KAGT,MAAMtO,EAAehY,EAAMw7B,OAAOxjB,aAC5BmkB,EAAUlgB,EAAAA,aAAaC,MAAMlE,GAE7BqH,EAAkC,QAAvB5X,EAAA5E,EAAM24B,OAAOK,cAAU,IAAAp0B,EAAAA,EAAA,GAClCsjB,EA4FR,SAAuB/O,GACrB,MAAMpR,EAAS,GACTuK,EAAO,IAAIinB,IACXC,EAAQ,IAAID,IAGlB,IAAK,MAAMt2B,KAAOlF,OAAOuU,KAAK6G,EAAWI,YACvCxR,EAAOjK,KAAKmF,GACZqP,EAAKmnB,IAAIx2B,EAAIwZ,eACb+c,EAAMC,IAAItB,GAAqBl1B,IAIjC,GAAIkW,EAAWsI,aACb,IAAK,MAAM1L,KAAQhY,OAAOuU,KAAK6G,EAAWsI,cAAe,CACvD,MAAM1gB,EAAOo3B,GAAqBpiB,GAC7BzD,EAAKonB,IAAI3jB,IAAUyjB,EAAME,IAAI34B,KAChCgH,EAAOjK,KAAKiY,GACZzD,EAAKmnB,IAAI1jB,GACTyjB,EAAMC,IAAItB,GAAqBpiB,IAElC,CAGH,OAAOhO,CACT,CArHoB4xB,CAAcL,GAC7BtuB,QAAQ2qB,KAAWnZ,aAAQ,EAARA,EAAUzN,SAAS4mB,MACtCvI,OAEH,OACE9vB,gBAAC+mB,EAAKA,MAAA,CAAC3iB,MAAM,SAAS4iB,iBAAiB,QAAQC,OAAQpnB,EAAMsmB,QAASe,QAASrnB,EAAMwmB,UACnFrmB,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAA,QAAA,CAAOiD,MAAO,CAAEmH,OAAQ,SACtBzL,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,KAAA,CAAIi7B,QAAS,EAAGC,MAAM,UAEjB,aACLv8B,EAAIqB,cAAA,KAAA,CAAAi7B,QAAS,EAAGC,MAAM,UAEjB,cAGTv8B,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,KAAA,CAAIi7B,QAAS,EAAGC,MAAM,UACpBv8B,EAAAqB,cAAA,SAAA,CACEqG,IAAK4zB,EACL9yB,KAAM,GACNg0B,SAAU,EACVl4B,MAAO,CAAEO,MAAO,SAChB43B,UAAY76B,GA/J5B,SAAgCA,GAChB,UAAVA,EAAE+D,KACJ61B,GAEH,CA2JiCkB,CAAuB96B,GACzC+6B,cAAe,KArJ7BnB,GAqJ+D,EAAA,cACrC,aAEX5Q,EAAUnlB,KAAKE,GACd3F,EAAQqB,cAAA,SAAA,CAAAsE,IAAKA,EAAK5F,MAAO4F,GACtBk1B,GAAqBl1B,QAK9B3F,EAAAqB,cAAA,KAAA,CAAIi7B,QAAS,EAAGC,MAAM,UACpBv8B,EAAAqB,cAAA,SAAA,CACEqG,IAAK6zB,EACL/yB,KAAM,GACNg0B,SAAU,EACVl4B,MAAO,CAAEO,MAAO,SAChB43B,UAAY76B,GA5J5B,SAA+BA,GACf,UAAVA,EAAE+D,KACJi2B,GAEH,CAwJiCgB,CAAsBh7B,GACxC+6B,cAAe,KAlJ7Bf,GAkJ8D,EACpC,cAAA,YAEX1c,EAASzZ,KAAKE,GACb3F,EAAQqB,cAAA,SAAA,CAAAsE,IAAKA,EAAK5F,MAAO4F,GACtBk1B,GAAqBl1B,UAOlC3F,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAIqB,cAAA,KAAA,CAAAk7B,MAAM,UACRv8B,EAAAqB,cAAC4H,SAAM,CAACwM,SAAO,EAACwV,QAAQ,UAAUjjB,QAASwzB,GAAU,QAIvDx7B,EAAIqB,cAAA,KAAA,CAAAk7B,MAAM,UACRv8B,EAAAqB,cAAC4H,SAAM,CAACwM,SAAO,EAACwV,QAAQ,UAAUjjB,QAAS4zB,GAAa,WAI1D57B,EAAIqB,cAAA,KAAA,CAAAk7B,MAAM,UACRv8B,EAAAqB,cAAC4H,SAAM,CAACwM,SAAO,EAACwV,QAAQ,UAAUjjB,QA/HhD,mBACE,MAAMyzB,EAAsC,QAAvBn0B,EAAA5E,EAAM24B,OAAOK,cAAU,IAAAp0B,EAAAA,EAAA,GACtC+wB,EAA2B,QAAnBjxB,EAAAm0B,EAAYn6B,eAAO,IAAAgG,OAAA,EAAAA,EAAErH,MACnC,GAAIs4B,EAAO,CACT,MAAMsD,EAAY,IAAIF,GAChBt7B,EAAQw7B,EAAUlyB,QAAQ4uB,GAChCwD,EAAWF,EAAWx7B,EAAOA,EAAQ,GAErCwC,EAAS,CACP04B,OAAM56B,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDgC,EAAM24B,SACTK,OAAQC,KAGb,CACF,GAgHgE,OAIrD37B,EAAIqB,cAAA,KAAA,CAAAk7B,MAAM,UACRv8B,EAAAqB,cAAC4H,EAAAA,OAAO,CAAAwM,SAAQ,EAAAwV,QAAQ,UAAUjjB,QA/GhD,mBACE,MAAMyzB,EAAsC,QAAvBn0B,EAAA5E,EAAM24B,OAAOK,cAAU,IAAAp0B,EAAAA,EAAA,GACtC+wB,EAA2B,QAAnBjxB,EAAAm0B,EAAYn6B,eAAO,IAAAgG,OAAA,EAAAA,EAAErH,MACnC,GAAIs4B,EAAO,CACT,MAAMsD,EAAY,IAAIF,GAChBt7B,EAAQw7B,EAAUlyB,QAAQ4uB,GAChCwD,EAAWF,EAAWx7B,EAAOA,EAAQ,GAErCwC,EAAS,CACP04B,OAAM56B,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACDgC,EAAM24B,SACTK,OAAQC,KAGb,CACF,GAkGsB,aAMnB37B,EAAAqB,cAAC4H,SAAO,CAAAjB,QAAS,IAAMnI,EAAMumB,KAAK1jB,EAAM24B,SAAoB,MAGlE,CC/OM,SAAUwB,GAAyBh9B,WACvC,MAAMgY,aAAEA,EAAYnK,OAAEA,GAAW7N,EAE3B86B,EAA4D,QAA9CvzB,UAAAE,EAAAwU,EAAAA,aAAaC,MAAMlE,yBAAesM,oBAAY,IAAA/c,OAAA,EAAAA,EAAGsG,EAAO+K,MAC5E,GAAIkiB,EAAa,CACf,GAAyB,cAArBA,EAAY34B,KACd,OAAOhC,EAACqB,cAAAmqB,GAAa,CAAAzrB,MAAO,CAAEgY,UAAWrK,EAAO3N,SAGlD,MAAM+8B,EAAqBC,EAAAA,0BAA0BllB,EAAc8iB,GACnE,GAAoB,iBAAhBjtB,EAAO+K,MAA2BqkB,EAAmB96B,OAASg7B,EAAmBA,oBAACC,SACpF,OAAOj9B,EAAAqB,cAAArB,EAAAwH,SAAA,KAAGoS,iBAAelM,EAAO3N,OAEnC,CAED,OAAOC,EAAGqB,cAAArB,EAAAwH,SAAA,KAAAkG,EAAO3N,MACnB,CCTM,SAAUm9B,GAAuBr9B,SACrC,MACM4D,EAAO,eAEb,OAHgBs5B,EAAAA,0BAA0Bl9B,EAAMgY,aAAchY,EAAM86B,aAGpD34B,MACd,KAAKg7B,EAAmBA,oBAACG,UACvB,OACEn9B,EAAAqB,cAAC8jB,GAAc,CACb1hB,KAAMA,EACN3C,aAAc,CAAEiX,UAAWlY,EAAMiB,cACjCskB,YAA8B,QAAjB9d,EAAAzH,EAAM86B,mBAAW,IAAArzB,OAAA,EAAAA,EAAEjC,OAChClE,SAAWi8B,IACLA,EACFv9B,EAAMsB,SAASi8B,EAAarlB,WAE5BlY,EAAMsB,SAAS,GAChB,IAKT,KAAK67B,EAAmBA,oBAACK,QACvB,OACEr9B,EAACqB,cAAAqS,EAAQA,UACPjQ,KAAMA,EACO,cAAAA,EACbyR,eAAuC,SAAvBrV,EAAMiB,aACtBK,SAAWS,GAAM/B,EAAMsB,SAASS,EAAEE,cAAciL,QAAQkM,cAI9D,KAAK+jB,EAAmBA,oBAACM,KACvB,OACEt9B,EAACqB,cAAAa,EAAAA,UACC,CAAAF,KAAK,OACLyB,KAAMA,EACO,cAAAA,EACb3C,aAAcjB,EAAMiB,aACpBK,SAAWS,GAAM/B,EAAMsB,SAASS,EAAEE,cAAc/B,SAItD,KAAKi9B,EAAmBA,oBAACC,SACvB,OAAOj9B,gBAAC4gB,GAAa,CAACnd,KAAMA,EAAM3C,aAAcjB,EAAMiB,aAAcK,SAAUtB,EAAMsB,WAEtF,KAAK67B,EAAmBA,oBAACO,OACvB,OACEv9B,EAACqB,cAAAa,EAAAA,UACC,CAAAF,KAAK,SACLyB,KAAMA,EACO,cAAAA,EACb3C,aAAcjB,EAAMiB,aACpBK,SAAWS,GAAM/B,EAAMsB,SAASS,EAAEE,cAAc/B,SAItD,KAAKi9B,EAAmBA,oBAACQ,SACvB,OACEx9B,gBAACoiB,GAAa,CACZ3e,KAAMA,EACN3C,aAAc28B,GAAiB59B,EAAMiB,cACrCK,SAAWu8B,IACLA,EACF79B,EAAMsB,SAAS,GAAGu8B,EAAY39B,SAE9BF,EAAMsB,SAAS,GAChB,IAKT,QACE,OACEnB,gBAACkC,EAASA,UAAA,CACRuB,KAAMA,gBACOA,EACb3C,aAAcjB,EAAMiB,aACpBoO,UAAWrP,EAAMqP,UACjB/N,SAAWS,GAAM/B,EAAMsB,SAASS,EAAEE,cAAc/B,OAChDoC,YAAY,iBAItB,CAEA,SAASs7B,GAAiB19B,GACxB,GAAIA,EAAO,CACT,MAAO49B,EAAaC,EAAcC,GAAc99B,EAAMyR,MAAM,KAC5D,GAAImsB,EACF,MAAO,CACL59B,MAAOyiB,WAAWmb,GAClBrnB,OAAQsnB,EACRrb,KAAMsb,EAGX,CAEH,CC3FM,SAAUC,GAAmBj+B,GACjC,MAAOw7B,EAAQ0C,GAAal9B,WAAwBygB,KAAKC,MAAMnJ,YAAUvY,EAAMw7B,WACxE2C,EAAcC,GAAmBp9B,EAAAA,UAAkB,GAEpDq9B,EAAYl9B,SAAsBq6B,GAWxC,GAVA6C,EAAU98B,QAAUi6B,EAEpB3qB,EAAAA,WAAU,KACRqtB,EAAUzc,KAAKC,MAAMnJ,EAAAA,UAAUvY,EAAMw7B,SAA0B,GAC9D,CAACx7B,EAAMw7B,UAMLx7B,EAAMsmB,QACT,OAAO,KAGT,MAAMtO,EAAehY,EAAMw7B,OAAOxjB,aAC5BsM,EAAerI,EAAYA,aAACC,MAAMlE,GAAcsM,aAChD6T,EAAUqD,EAAOrD,SAAW,GAElC,OACEh4B,EAACqB,cAAA0lB,EAAAA,MAAM,CAAA3iB,MAAM,UAAU4iB,iBAAiB,QAAQxe,KAAM,IAAKye,OAAQpnB,EAAMsmB,QAASe,QAASrnB,EAAMwmB,UAC/FrmB,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,WAAA,KACErB,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEO,MAAO,OACrB7E,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEO,MAAO,OACrB7E,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEO,MAAO,OACrB7E,EAAKqB,cAAA,MAAA,CAAAiD,MAAO,CAAEO,MAAO,QAEvB7E,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAcqB,cAAA,KAAA,KAAA,SACdrB,EAAkBqB,cAAA,KAAA,KAAA,aAClBrB,EAAcqB,cAAA,KAAA,KAAA,SACdrB,EAAAqB,cAAA,KAAA,KAAA,aAGJrB,EAAAqB,cAAA,QAAA,KACG22B,EAAQvyB,KAAI,CAACiI,EAAgBvN,IACxBA,IAAU69B,EAEVh+B,EAAAqB,cAAC88B,GAAc,CACbx4B,IAAK,UAAUxF,KAAS63B,EAAQ33B,eAChCwX,aAAcA,EACdsM,aAAcA,EACdrjB,aAAc4M,EACd0wB,OAAO,OACPhY,KAAOiY,IACL,MAAM1F,EAAa,IAAIX,GACvBW,EAAWx4B,GAASk+B,EACpBN,EAAUhG,GAAWmG,EAAU98B,QAASu3B,IACxCsF,GAAiB,EAAE,EAErB5X,SAAU,IAAM4X,GAAiB,KAKnCj+B,EAACqB,cAAAi9B,GACC,CAAA34B,IAAK,UAAUxF,KAAS63B,EAAQ33B,iBAChCwX,aAAcA,EACdsM,aAAcA,EACdzW,OAAQA,EACR4kB,OAAQ,IAAM2L,EAAgB99B,GAC9BoyB,SAAU,IAAMwL,EAAUrF,GAAawF,EAAU98B,QAASjB,QAKlEH,EAACqB,cAAA88B,IAAetmB,aAAcA,EAAcsM,aAAcA,EAAcia,OAAO,MAAMhY,KA9D/F,SAAqB1Y,GACnBqwB,EAAU3F,GAAU8F,EAAU98B,QAASsM,EAAO+K,KAAM/K,EAAO+qB,SAAU/qB,EAAO3N,OAC7E,OAgEGC,EAACqB,cAAAC,SAAM+N,SAAS,QAAQC,GAAG,MACzBtP,EAAAqB,cAAC4H,EAAAA,OAAO,CAAAjB,QAAS,IAAMnI,EAAMumB,KAAK8X,EAAU98B,iBAIpD,CAUA,SAASk9B,GAAiBz+B,GACxB,MAAM6N,OAAEA,GAAW7N,EACnB,OACEG,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,KAAA,KAAKw5B,GAAqBntB,EAAO+K,OACjCzY,EAAAqB,cAAA,KAAA,KAAKu5B,GAAYltB,EAAO+qB,WACxBz4B,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACw7B,GAAwB,CAAChlB,aAAchY,EAAMgY,aAAcnK,OAAQA,KAEtE1N,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAC4H,SAAM,CAACwM,SAAO,EAACwV,QAAQ,UAAUjjB,QAASnI,EAAMyyB,QAExC,QACTtyB,EAAAqB,cAAC4H,EAAAA,OAAO,CAAAwM,SAAQ,EAAAwV,QAAQ,UAAUjjB,QAASnI,EAAM0yB,qBAMzD,CAWA,SAAS4L,GAAet+B,SACtB,MAAOE,EAAOa,GAAYC,EAAQA,SAAgC,QAAvByG,EAAAzH,EAAMiB,oBAAiB,IAAAwG,EAAAA,EAAA,CAAa,GACzEvG,EAAWC,SAAejB,GAChCgB,EAASK,QAAUrB,EAcnB,MAAM46B,EAAc96B,EAAMskB,aAAapkB,EAAM0Y,MACvC8lB,EAAY5D,GAAeD,GAAmBC,GAEpD,OACE36B,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACK,EAAYA,aAAA,CAAA,cACC,eACZZ,aAAcC,EAASK,QAAQqX,KAC/BtX,SAAWS,IAAM48B,OArBFte,EAqBgBte,EAAEE,cAAc/B,WApBrDa,EAAQH,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMK,EAASK,UAASqX,KAAMyH,KADxC,IAAuBA,CAqBsC,EACrDne,KAAMtB,OAAOuU,KAAKnV,EAAMskB,cAAc1e,KAAKg5B,IAAK,CAAQ1+B,MAAO0+B,EAAOzvB,MAAO6rB,GAAqB4D,UAGtGz+B,EAAAqB,cAAA,KAAA,KACGk9B,GACCv+B,EAAAqB,cAACK,eAAY,CAAA,cACC,mBACZZ,aAAcf,EAAM04B,SACpBt3B,SAAWS,IAAM88B,OA1BAC,EA0BkB/8B,EAAEE,cAAc/B,WAzB3Da,EAAQH,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMK,EAASK,UAASq3B,SAAUkG,KAD5C,IAA2BA,CA0BoD,EACrE58B,KAAM,CAAC,MAAOw8B,EAAU94B,KAAK6yB,IAAQ,CAAEv4B,MAAOu4B,EAAItpB,MAAO4rB,GAAYtC,WAI3Et4B,EAAAqB,cAAA,KAAA,KACGs5B,GAAe56B,EAAM04B,UACpBz4B,EAAAqB,cAAC67B,GAAsB,CACrBrlB,aAAchY,EAAMgY,aACpB8iB,YAAaA,EACb75B,aAAcf,EAAMA,MACpBoB,SAjCV,SAAwBy9B,GACtBh+B,EAAQH,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMK,EAASK,UAASrB,MAAO6+B,IACxC,KAmCG5+B,EAAAqB,cAAA,KAAA,KACGtB,EAAM0Y,MAAQ1Y,EAAM04B,UAAY14B,EAAMA,OACrCC,gBAACiJ,EAAMA,OAAA,CACLwM,SAAO,EACPwV,QAAQ,UACRjjB,QAAS,KACPnI,EAAMumB,KAAKrlB,EAASK,SACpBR,EAAS,CAAY,EAAC,GAGvBf,EAAMu+B,QAGVv+B,EAAMwmB,UACLrmB,gBAACiJ,EAAMA,OAAA,CAACwM,SAAO,EAACwV,QAAQ,UAAUjjB,QAASnI,EAAMwmB,qBAO3D,CCrMM,SAAUwY,GAAwBh/B,SACtC,MAAOE,EAAOa,GAAYC,EAAQA,SAA+B,QAAtByG,EAAAzH,EAAMiB,oBAAgB,IAAAwG,EAAAA,EAAA,IAEjE,IAAKzH,EAAMsmB,UAAYtmB,EAAM86B,cAAgB96B,EAAM6N,OACjD,OAAO,KAGT,SAAS0Y,IACPvmB,EAAMumB,KAAW3lB,OAAAC,OAAAD,OAAAC,OAAA,GAAAb,EAAM6N,QAAiB,CAAE3N,UAC3C,CAED,OACEC,EAACqB,cAAA0lB,EAAAA,MAAM,CAAA3iB,MAAOvE,EAAMuE,MAAOoE,KAAK,KAAKye,OAAQpnB,EAAMsmB,QAASe,QAASrnB,EAAMwmB,UACzErmB,EAAAqB,cAAA,MAAA,CAAKiD,MAAO,CAAEO,MAAO,MACnB7E,EAAAqB,cAAC2L,EAAI,CAACE,SAAUkZ,GACdpmB,EAACqB,cAAA67B,GACC,CAAArlB,aAAchY,EAAMgY,aACpB8iB,YAAa96B,EAAM86B,YACnB75B,aAAcf,EACdmP,WAAW,EACX/N,SAAUP,MAIhBZ,EAACqB,cAAA4H,UAAOjB,QAASoe,GAAiB,MAGxC,CCJM,SAAU0Y,GAAgBj/B,GAC9B,IAAKA,EAAMskB,aACT,OAAO,KAeT,SAAShjB,EAAS6nB,GAChBnpB,EAAMsB,SAAS6nB,EAChB,CAGD,OAAkC,IAA9BnpB,EAAMskB,aAAa9jB,OAEnBL,EAACqB,cAAA09B,GACC,CAAA1D,OAAQx7B,EAAMw7B,OACdV,YAAa96B,EAAMskB,aAAa,GAChC6a,OAtBN,SAAgBrE,EAA8BP,GAC5Cj5B,EAASg5B,GAAQt6B,EAAMw7B,OAAQV,EAAYliB,KAAgB2hB,GAC5D,EAqBK6E,SAfN,SAAkBtE,EAA8BlC,GAC9C54B,EAAMo/B,SAAStE,EAAa,CAAEliB,KAAMkiB,EAAYliB,KAAgBggB,WAAU14B,MAAO,IAClF,EAcKoB,SAAUA,EACV+9B,QArBN,SAAiBvE,GACfx5B,EAAS+2B,GAAoBr4B,EAAMw7B,OAAQV,EAAYliB,MACxD,IA0BCzY,EAACqB,cAAAouB,EAAIA,KAACuE,SAAQ,KACXn0B,EAAMskB,aAAa1e,KAAKk1B,GACvB36B,EAACqB,cAAAouB,EAAIA,KAACyE,MAAKvuB,IAAKg1B,EAAYliB,MAAOoiB,GAAqBF,EAAYliB,SAI5E,CAWA,SAASsmB,GAAuBl/B,GAC9B,OAAQA,EAAM86B,YAAY34B,MACxB,IAAK,OACH,OAAOhC,EAACqB,cAAA89B,GAAsB1+B,OAAAC,OAAA,CAAA,EAAAb,IAChC,IAAK,SACL,IAAK,WACH,OAAOG,EAACqB,cAAA+9B,GAAyB3+B,OAAAC,OAAA,CAAA,EAAAb,IACnC,IAAK,YACH,OAAOG,EAACqB,cAAAg+B,GAA2B5+B,OAAAC,OAAA,CAAA,EAAAb,IACrC,IAAK,SACL,IAAK,QACL,IAAK,MACH,OAAOG,EAACqB,cAAAi+B,GAAsB7+B,OAAAC,OAAA,CAAA,EAAAb,IAChC,QACE,OAAOG,EAAAqB,cAAArB,EAAAwH,SAAA,mCAA8B3H,EAAM86B,YAAY34B,MAE7D,CAEA,SAASm9B,GAAkBt/B,GACzB,MAAM86B,YAAEA,GAAgB96B,EAClB4Y,EAAOkiB,EAAYliB,KACzB,OACEzY,EAAAqB,cAACouB,EAAIA,KAACuE,SAAQ,KACZh0B,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAK,CAAArhB,KAAM7S,EAAAqB,cAACk+B,EAAAA,kBAAiB,CAAC/2B,KAAM,KAAQR,QAAS,IAAMnI,EAAMm/B,OAAOrE,GAAa,IAE/E,yBACZ36B,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAK,CAAArhB,KAAM7S,EAAAqB,cAACm+B,EAAAA,mBAAkB,CAACh3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMm/B,OAAOrE,GAAa,IAEhF,yBACZ36B,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAo+B,EAASA,UAAC,CAAAj3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASC,SAElF,aACZ91B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAq+B,EAAYA,aAAC,CAAAl3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASQ,aAErF,qBACZr2B,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAs+B,EAAaA,cAAC,CAAAn3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASe,cAEtF,aACZ52B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAACqB,cAAAu+B,EAAeA,gBAAC,CAAAp3B,KAAM,KAC7BR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASc,eAG1C,YACZ32B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAw+B,EAAmBA,oBAAC,CAAAr3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASC,SAE5F,cACZ91B,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACy+B,eAAY,CAACt3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMsB,SAAS43B,GAAkBl5B,EAAMw7B,OAAQ5iB,KAGpD,YACZzY,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAAAqB,cAACy+B,eAAY,CAACt3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMsB,SAAS23B,GAAej5B,EAAMw7B,OAAQ5iB,KAE5F,SACZzY,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACy+B,eAAY,CAACt3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMsB,SAASy3B,GAAmB/4B,EAAMw7B,OAAQ5iB,KAGrD,aACZzY,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACy+B,eAAY,CAACt3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMsB,SAASo4B,GAAmB15B,EAAMw7B,OAAQ5iB,KAGrD,cACZzY,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACy+B,eAAY,CAACt3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMsB,SAASm4B,GAAmBz5B,EAAMw7B,OAAQ5iB,KAGrD,cACZzY,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACy+B,eAAY,CAACt3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMsB,SAASi4B,GAAmBv5B,EAAMw7B,OAAQ5iB,KAGrD,cACZzY,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAACy+B,eAAY,CAACt3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMsB,SAASq4B,GAAoB35B,EAAMw7B,OAAQ5iB,KAGtD,gBACZzY,EAAAqB,cAAC0+B,GAAoBt/B,OAAAC,OAAA,GAAAb,IAG3B,CAEA,SAASu/B,GAAqBv/B,GAC5B,MAAM86B,YAAEA,GAAgB96B,EACxB,OACEG,EAAAqB,cAACouB,EAAIA,KAACuE,SAAQ,KACZh0B,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAK,CAAArhB,KAAM7S,EAAAqB,cAACk+B,EAAAA,kBAAiB,CAAC/2B,KAAM,KAAQR,QAAS,IAAMnI,EAAMm/B,OAAOrE,GAAa,IAE/E,4BACZ36B,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAK,CAAArhB,KAAM7S,EAAAqB,cAACm+B,EAAAA,mBAAkB,CAACh3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMm/B,OAAOrE,GAAa,IAEhF,4BACZ36B,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAo+B,EAASA,UAAC,CAAAj3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASC,SAElF,aACZ91B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAq+B,EAAYA,aAAC,CAAAl3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASQ,aAErF,qBACZr2B,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAACqB,cAAAu+B,EAAeA,gBAAC,CAAAp3B,KAAM,KAC7BR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASS,eAG1C,mBACZt2B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAACqB,cAAA2+B,EAAYA,aAAC,CAAAx3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASW,yBAG1C,+BACZx2B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAs+B,EAAaA,cAAC,CAAAn3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASU,YAEtF,gBACZv2B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CACRrhB,KAAM7S,EAACqB,cAAA2+B,EAAYA,aAAC,CAAAx3B,KAAM,KAC1BR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASY,sBAG1C,4BACZz2B,EAAAqB,cAAC0+B,GAAoBt/B,OAAAC,OAAA,GAAAb,IAG3B,CAEA,SAASw/B,GAAuBx/B,GAC9B,MAAM86B,YAAEA,GAAgB96B,EACxB,OACEG,EAAAqB,cAACouB,EAAIA,KAACuE,SAAQ,KACZh0B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAo+B,EAASA,UAAC,CAAAj3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASC,SAElF,aACZ91B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAq+B,EAAYA,aAAC,CAAAl3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASE,MAErF,qBACZ/1B,EAAAqB,cAAC0+B,GAAoBt/B,OAAAC,OAAA,GAAAb,IAG3B,CAEA,SAASy/B,GAAkBz/B,GACzB,MAAM86B,YAAEA,GAAgB96B,EACxB,OACEG,EAAAqB,cAACouB,EAAIA,KAACuE,SAAQ,KACZh0B,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAK,CAAArhB,KAAM7S,EAAAqB,cAACk+B,EAAAA,kBAAiB,CAAC/2B,KAAM,KAAQR,QAAS,IAAMnI,EAAMm/B,OAAOrE,GAAa,IAE/E,eACZ36B,EAACqB,cAAAouB,EAAAA,KAAKyE,KAAK,CAAArhB,KAAM7S,EAAAqB,cAACm+B,EAAAA,mBAAkB,CAACh3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMm/B,OAAOrE,GAAa,IAEhF,eACZ36B,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAo+B,EAASA,UAAC,CAAAj3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASC,SAElF,aACZ91B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAq+B,EAAYA,aAAC,CAAAl3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASE,MAErF,qBACZ/1B,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAA4+B,EAAUA,WAAC,CAAAz3B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASG,WAEnF,eACZh2B,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAA6+B,EAAaA,cAAC,CAAA13B,KAAM,KAAQR,QAAS,IAAMnI,EAAMo/B,SAAStE,EAAa9E,WAASC,SAEtF,uBACZ91B,EAAAqB,cAAC0+B,GAAoBt/B,OAAAC,OAAA,GAAAb,IAG3B,CAEA,SAASkgC,GAAgBlgC,GACvB,MAAM86B,YAAEA,GAAgB96B,EAClB4Y,EAAOkiB,EAAYliB,KACzB,OACEzY,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAIA,KAACyE,KAAI,CAACrhB,KAAM7S,EAAAqB,cAAC8+B,aAAU,CAAC33B,KAAM,KAAQR,QAAS,IAAMnI,EAAMsB,SAASy4B,GAAiB/5B,EAAMw7B,OAAQ5iB,KAE5F,WACZzY,EAAAqB,cAACouB,OAAKyE,KAAI,CACRrhB,KAAM7S,EAAAqB,cAAC++B,EAAAA,cAAa,CAAC53B,KAAM,KAC3BR,QAAS,IAAMnI,EAAMsB,SAASy4B,GAAiB/5B,EAAMw7B,OAAQ5iB,GAAM,KAGzD,eACZzY,EAACqB,cAAAouB,OAAKpc,QAAU,MAChBrT,EAAAqB,cAACouB,EAAAA,KAAKyE,KAAI,CAACrhB,KAAM7S,EAACqB,cAAAg/B,EAAAA,MAAM,CAAA73B,KAAM,KAAQR,QAAS,IAAMnI,EAAMq/B,QAAQvE,IAAY,iBAKrF,CClPA,SAAS2F,GAAmBzoB,EAAsBpU,SAChD,GAAa,iBAATA,EACF,MAAO,CACLA,KAAM,eACN0gB,aAAc,CACZ,CACEtM,aAAc,kBACd0oB,KAAM,CAAC,YACP9nB,KAAM,eACNhV,KAAM,eACNzB,KAAM,OACNyL,WAAY,+BAMpB,GAAa,mBAAThK,EACF,MAAO,CACLA,KAAM,iBACN0gB,aAAc,CACZ,CACEtM,aAAc,kBACd0oB,KAAM,CAAC,YACP9nB,KAAM,aACNhV,KAAM,aACNzB,KAAM,QACNyL,WAAY,6BAMpB,MAAMoO,EAAaC,EAAAA,aAAaC,MAAMlE,GAChC2oB,EAAwD3kB,EAAWI,WAAWxY,GAC9Eg9B,EAA0E,QAA1Bn5B,EAAAuU,EAAWsI,oBAAe,IAAA7c,OAAA,EAAAA,EAAA7D,EAAK0b,eAKrF,GAAIqhB,GAA0BC,EAC5B,MAAO,CAAEh9B,OAAM8Z,kBAAmBijB,EAAwBrc,aAAc,CAACsc,IAO3E,GAAID,EAAwB,CAC1B,IAAIrc,EACJ,GAAItI,EAAWsI,aAAc,CAC3B,MAAMhJ,EAAO,GAAGtD,KAAgBpU,EAAKu3B,WAAW,MAAO,MACvD7W,EAAe1jB,OAAO+E,OAAOqW,EAAWsI,cAAczW,QAAQrE,IAAK,IAAA/B,EAAC,OAAY,QAAZA,EAAA+B,EAAEoE,kBAAU,IAAAnG,OAAA,EAAAA,EAAEmK,SAAS0J,EAAK,IACpE,IAAxBgJ,EAAa9jB,SACf8jB,OAAenhB,EAElB,CACD,MAAO,CAAES,OAAM8Z,kBAAmBijB,EAAwBrc,eAC3D,CAQD,GAAIsc,EAAkB,CAEpB,MAAO,CAAEh9B,OAAM8Z,kBADCwf,EAAAA,0BAA0BllB,EAAc4oB,GACdljB,kBAAmB4G,aAAc,CAACsc,GAC7E,CAKD,MAAO,CAAEh9B,OACX,CC3FM,MAAOi9B,WAA0BC,MAGrC/R,YAAY5F,GACV6F,MAAM,UACNxgB,KAAK2a,WAAaA,CACnB,EAGG,MAAO4X,WAAwBD,MAGnC/R,YAAY7b,GACV8b,MAAM,QACNxgB,KAAK0E,SAAWA,CACjB,EAGG,MAAO8tB,WAAyBF,MAIpC/R,YAAY/R,EAAoBikB,GAC9BjS,MAAM,SACNxgB,KAAKwO,SAAWA,EAChBxO,KAAKyyB,aAAeA,CACrB,EA8BH,MAAMl2B,GAAYC,EAAAA,cAAcS,IAAW,CACzCR,KAAM,CACJvG,SAAU,OACVw8B,SAAU,OACVnb,UAAW,OACXob,aAAc,QAGhB/X,MAAO,CACLM,OAAQ,WAGV0X,GAAI,CACF,UAAW,CACT5X,gBAAuC,SAAtB/d,EAAMsgB,YAAyBtgB,EAAMiK,OAAO2rB,KAAK,GAAK51B,EAAMiK,OAAOC,KAAK,KAI7F2rB,GAAI,CACFj8B,QAAS,gBAGXk8B,QAAS,CACPv8B,MAAO,OACPK,QAAS,GAAGoG,EAAM/J,QAAQmU,QAAQpK,EAAM/J,QAAQoK,OAEhD,UAAW,CACT0d,gBAAuC,SAAtB/d,EAAMsgB,YAAyBtgB,EAAMiK,OAAO2rB,KAAK,GAAK51B,EAAMiK,OAAOC,KAAK,KAI7F3C,KAAM,CACJhO,MAAO,GACPC,OAAQ,GACRwkB,aAAc,QASZ,SAAU+X,GAAcxhC,aAC5B,MAAMsL,QAAEA,GAAYP,KACdxH,EAAUD,KACTm+B,EAAcC,GAAmB1gC,EAAQA,UAAU,IACnDoG,EAASmH,GAAcvN,EAAQA,YAChCw6B,OAAEA,EAAMmG,OAAEA,GAAW3hC,GAEpB6C,EAAOC,GAAY9B,WAA6B,CACrDqe,SAAU,CAAE,EACZuiB,oBAAoB,EACpBC,qBAAqB,EACrBC,qBAAqB,IAGjBC,EAAW5gC,SAA2B0B,GAsE5C,SAASm/B,EAAiBC,GACpBjiC,EAAMsB,UACRtB,EAAMsB,SAAS,IAAIu/B,GAAkBoB,GAExC,CAQD,SAASC,EAAengC,EAAqBib,GACvC9W,EAAenE,EAAEyD,SAKJ,IAAbzD,EAAEogC,SAKNp8B,EAAUhE,GAEO,IAAbA,EAAEogC,QAAgBniC,EAAMmI,SAC1BnI,EAAMmI,QAAQ,IAAI64B,GAAiBhkB,EAAUjb,IAG9B,IAAbA,EAAEogC,QAAgBniC,EAAMoiC,YAC1BpiC,EAAMoiC,WAAW,IAAIpB,GAAiBhkB,EAAUjb,IAEnD,CArGDggC,EAASxgC,QAAUsB,EAEnBgO,EAAAA,WAAU,KACRtC,OAAWpL,GACXI,EACGi4B,OACCA,EAAOxjB,aACPqqB,EAAAA,kBAAuBzhC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAA26B,GAAQ,CAAAnG,MAAO,WAAYwG,YAAQ14B,MAE3D6D,MAAMkM,IACLpQ,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMkhC,EAASxgC,UAAS+gC,eAAgBpvB,KAC5CyuB,GACFA,EAAO,IAAIZ,GAAgB7tB,GAC5B,IAEF/L,OAAOqsB,IACN1wB,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMkhC,EAASxgC,UAAS+gC,oBAAgBn/B,KAChDoL,EAAWilB,EAAO,GAClB,GACH,CAACjwB,EAASi4B,EAAQmG,IAoFrB9wB,EAAAA,WAAU,KACR6wB,GAAgB,GAChBn+B,EACG4qB,cAAcnuB,EAAMw7B,OAAOxjB,cAC3BhR,MAAK,IAAM06B,GAAgB,KAC3Bv6B,MAAMwN,QAAQC,IAAI,GACpB,CAACrR,EAASvD,EAAMw7B,OAAOxjB,eAG1B,KADmBypB,IAAmC,UAAP,OAAZxlB,EAAAA,mBAAA,IAAAA,oBAAA,EAAAA,EAAAA,aAAcC,aAAK,IAAAzU,OAAA,EAAAA,EAAGzH,EAAMw7B,OAAOxjB,gBAEpE,OACE7X,EAAAqB,cAACsN,EAAAA,OAAM,CAACrK,MAAO,CAAEO,MAAO,OAAQC,OAAQ,SACtC9E,EAAAqB,cAAC2jB,SAAM,OAKb,MAAMod,EAAiBviC,EAAMwiC,kBACvB3G,ED5OF,SAA8BL,GAClC,MAAMxjB,EAAewjB,EAAOxjB,aACtB6jB,EAAS,GAEf,IAAK,MAAMj4B,KAAQ43B,EAAOK,QAAU,CAAC,KAAM,gBACzCA,EAAOl7B,KAAK8/B,GAAmBzoB,EAAcpU,IAE/C,OAAOi4B,CACT,CCoOiB4G,CAAoBjH,GAC7BxjB,EAAewjB,EAAOxjB,aACtB0qB,EAAa7/B,EAAMy/B,eACnBnmB,EAAUumB,aAAA,EAAAA,EAAYrmB,MACtBqI,EAAYvI,aAAO,EAAPA,EAASvW,KAAK7D,GAAMA,EAAEib,WAElC2lB,EAAgB,SAChBC,EAAc,OACdC,EAAW,GACXC,EAAWvxB,OAAOwxB,WAAa,IAErC,OACE5iC,uBAAKqL,UAAWF,EAAQL,mBAAkB,mBACtCjL,EAAMgjC,aACN7iC,EAACqB,cAAAC,QAAM,CAAA+N,SAAS,QAAQyzB,GAAG,MACzB9iC,EAAAqB,cAACC,EAAAA,MAAK,CAACC,QAAS,GACdvB,EAAAqB,cAAC4H,EAAMA,OACL,CAAAwM,SACA,EAAAwV,QAASuX,EACT15B,MAAO25B,EACPM,SAAU/iC,EAAAqB,cAAC2hC,EAAUA,WAAC,CAAAx6B,KAAMk6B,IAC5B16B,QAAS,IAAMrF,EAAclC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAkhC,EAASxgC,SAAO,CAAEqgC,oBAAoB,MAG5D,UACTzhC,EAAAqB,cAAC4H,EAAMA,OACL,CAAAwM,SACA,EAAAwV,QAASuX,EACT15B,MAAO25B,EACPM,SAAU/iC,EAAAqB,cAAC4hC,EAAWA,YAAC,CAAAz6B,KAAMk6B,IAC7B16B,QAAS,IAAMrF,EAAclC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAkhC,EAASxgC,SAAO,CAAEsgC,qBAAqB,MAG7D,WACR7hC,EAAMqjC,OACLljC,gBAACiJ,EAAMA,OAAA,CACLwM,SAAO,EACPwV,QAASuX,EACT15B,MAAO25B,EACPM,SAAU/iC,EAAAqB,cAAC8hC,eAAY,CAAC36B,KAAMk6B,IAC9B16B,QAASnI,EAAMqjC,kBAKjBP,GAAY9iC,EAAMujC,UAClBpjC,EAAAqB,cAAC4H,SAAM,CACLwM,SACA,EAAAwV,QAASuX,EACT15B,MAAO25B,EACPM,SAAU/iC,EAAAqB,cAACgiC,EAAeA,gBAAA,CAAC76B,KAAMk6B,IACjC16B,QAASnI,EAAMujC,wBAKjBT,GAAY9iC,EAAM0yB,UAClBvyB,EAACqB,cAAA4H,EAAAA,OACC,CAAAwM,WACAwV,QAASuX,EACT15B,MAAO25B,EACPM,SAAU/iC,EAACqB,cAAAkzB,EAASA,WAAC/rB,KAAMk6B,IAC3B16B,QAAS,IAAOnI,EAAM0yB,SAAoC9xB,OAAOuU,KAAKtS,EAAMwc,YAAU,cAKxFyjB,GAAY9iC,EAAMyjC,QAClBtjC,EAACqB,cAAA4H,EAAAA,OACC,CAAAwM,WACAwV,QAASuX,EACT15B,MAAO25B,EACPM,SAAU/iC,EAAAqB,cAACkiC,EAAAA,gBAAe,CAAC/6B,KAAMk6B,IACjC16B,QAAS,IAAOnI,EAAMyjC,OAAkC7iC,OAAOuU,KAAKtS,EAAMwc,YAGnE,YAGZqjB,GACCviC,EAAAqB,cAAC+N,EAAIA,KAAA,CAAC5G,KAAK,KAAKM,MAAM,UAyOlC,SAAkBuyB,EAAuBnG,SACvC,OAAOI,KAAKkO,IAAItO,GAAyB,QAAjB5tB,EAAA+zB,EAAOpD,cAAU,IAAA3wB,EAAAA,EAAA,GAAK,EAChD,CA1Oem8B,CAASpI,EAAQkH,EAAWrN,WA4O3C,SAAgBmG,EAAuBnG,WACrC,OAAOI,KAAKkO,IAAItO,IAA0B,QAAjB5tB,EAAA+zB,EAAOpD,cAAU,IAAA3wB,EAAAA,EAAA,GAAK,IAAsB,QAAhBF,EAAAi0B,EAAOpB,aAAS,IAAA7yB,EAAAA,EAAA8yB,EAAAA,sBACvE,CA9O8DwJ,CAAOrI,EAAQkH,EAAWrN,aAAqB,IAC9E,QAAhB9tB,EAAAm7B,EAAWrN,aAAK,IAAA9tB,OAAA,EAAEA,EAAAqiB,mBAK3BzpB,EAAAqB,cAACsiC,EAAKA,MAAC,CAAAt4B,UAAWF,EAAQ8d,OACxBjpB,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACG+gC,GACCpiC,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,QAAA,CACEW,KAAK,WACLjC,MAAM,UAAS,aACJ,eAAc,cACb,eACZgN,QAtKhB,mBACE,MAAMrK,EAAQk/B,EAASxgC,QACvB,aAAKkG,EAAA5E,EAAMy/B,qCAAgBjmB,QAA+C,IAAtCxZ,EAAMy/B,eAAejmB,MAAM7b,OAC7D,OAAO,EAET,IAAK,MAAMuB,KAAKc,EAAMy/B,eAAejmB,MACnC,IAAc,QAAV9U,EAAAxF,EAAEib,gBAAQ,IAAAzV,OAAA,EAAAA,EAAEwJ,MAAOlO,EAAMwc,SAAStd,EAAEib,SAASjM,IAC/C,OAAO,EAGX,OAAO,CACR,CA2JwBgzB,GACTziC,SAAWS,GAxL3B,SAAgCA,SAC9BA,EAAEkE,kBAEF,MACMiH,EADKnL,EAAEyD,OACM0H,QACb82B,EAAc,CAAA,EACd1B,EAAiC,QAAhB76B,EAAAs6B,EAASxgC,eAAO,IAAAkG,OAAA,EAAAA,EAAE66B,eACrCp1B,IAAWo1B,eAAAA,EAAgBjmB,QAC7BimB,EAAejmB,MAAMpU,SAASoU,WACV,UAAdA,EAAMW,gBAAQ,IAAAvV,OAAA,EAAAA,EAAEsJ,MAClBizB,EAAY3nB,EAAMW,SAASjM,KAAM,EAClC,IAGLjO,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMkhC,EAASxgC,UAAS8d,SAAU2kB,IAC3C,CAyKgCC,CAAuBliC,MAI7C85B,EAAOj2B,KAAK4yB,GACXr4B,EAAIqB,cAAA,KAAA,CAAAsE,IAAK0yB,EAAM50B,MACbzD,EAAAqB,cAACouB,EAAIA,KAAA,CAAC5jB,OAAO,KAAKhH,MAAO,IAAKwK,SAAS,cACrCrP,EAACqB,cAAAouB,OAAKC,OAAM,KACV1vB,EAAAqB,cAACiT,EAAcA,eAAC,CAAAjJ,UAAWF,EAAQi2B,SACjCphC,EAAAqB,cAACC,QAAM,CAAA+N,SAAS,QAAQ5N,QAAM,GAC5BzB,EAAAqB,cAAC+N,OAAK,CAAAwF,OAAQ,IAAKpM,KAAK,MACrBqyB,GAAqBxC,EAAM50B,OAE9BzD,EAAAqB,cAACsN,EAAMA,OAAC,CAAAtD,UAAWF,EAAQ0H,MACzB7S,EAAAqB,cAAC0iC,EAAyBA,0BAAA,CAACv7B,KAAM,GAAIw7B,OAAQ,UAKrDhkC,EAACqB,cAAAy9B,IACCzD,OAAQx7B,EAAMw7B,OACdlX,aAAckU,EAAMlU,aACpB8a,SAAU,CAACtE,EAAajtB,KACtB/K,iCACKi/B,EAASxgC,SAAO,CACnBugC,qBAAqB,EACrBsC,wBAAyBtJ,EACzBuJ,mBAAoBx2B,IACpB,EAEJvM,SAAWsJ,IACTo3B,EAAiBp3B,EAAO,UAOlC5K,EAAMskC,aACNnkC,EAAAqB,cAAA,KAAA,KACG+gC,GAAkBpiC,EAAMqB,cAAA,KAAA,MACxBq6B,EAAOj2B,KAAK4yB,GACXr4B,EAAIqB,cAAA,KAAA,CAAAsE,IAAK0yB,EAAM50B,MACZ40B,EAAMlU,cACLnkB,EAAAqB,cAAC+iC,GAAiB,CAChBvsB,aAAcA,EACdsM,aAAckU,EAAMlU,aACpB6T,QAASn4B,EAAMw7B,OAAOrD,eAQpCh4B,EACGqB,cAAA,QAAA,KAAAkjB,aAAA,EAAAA,EAAW9e,KACToX,GACCA,GACE7c,EACEqB,cAAA,KAAA,CAAAsE,IAAKkX,EAASjM,GACdvF,UAAWF,EAAQ81B,iBACP,qBACZj5B,QAAUpG,GAAMmgC,EAAengC,EAAGib,GAClColB,WAAargC,GAAMmgC,EAAengC,EAAGib,IAEpCulB,GACCpiC,EAAAqB,cAAA,KAAA,KACErB,EACEqB,cAAA,QAAA,CAAAW,KAAK,WACLjC,MAAM,wBACM,eAAc,aACd,gBAAgB8c,EAASjM,KACrC7D,UAAWrK,EAAMwc,SAASrC,EAASjM,IACnCzP,SAAWS,GAhRjC,SAAmCA,EAAsBgP,GACvDhP,EAAEkE,kBAEF,MACMiH,EADKnL,EAAEyD,OACM0H,QACb82B,mBAAmBjC,EAASxgC,QAAQ8d,UACtCnS,EACF82B,EAAYjzB,IAAM,SAEXizB,EAAYjzB,GAErBjO,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMkhC,EAASxgC,UAAS8d,SAAU2kB,IAC3C,CAoQsCQ,CAA0BziC,EAAGib,EAASjM,OAI5D8qB,EAAOj2B,KAAK4yB,GACXr4B,EAAAqB,cAAA,KAAA,CAAIsE,IAAK0yB,EAAM50B,MAAOs3B,GAAYle,EAAUwb,WAOnC,KAAtB9T,aAAS,EAATA,EAAWlkB,SACVL,EAAAqB,cAAC4J,EAAS,KACRjL,EAAAqB,cAACsN,EAAAA,OAAM,KACL3O,EAAAqB,cAAC+N,OAAI,CAAC5G,KAAK,KAAKM,MAAM,UAAQ,qBAMb9F,KAAtBu/B,aAAA,EAAAA,EAAYrN,QAAuBqN,EAAWrN,MAAQ,GACrDl1B,EAAAqB,cAACsN,EAAAA,OAAM,CAAC21B,EAAE,KAAKj7B,EAAE,MACfrJ,EAAAqB,cAACkjC,aACC,CAAAvK,KAAMwK,GAAQnJ,GACdnG,MAAOuP,GAAcpJ,EAAQkH,EAAWrN,OACxC/zB,SAAWujC,GAAY7C,EAAiB9H,GAAQsB,EAAQqJ,IACxDC,iBAAmB3K,IACjB,OAAQA,GACN,IAAK,OACH,MAAO,gBACT,IAAK,OACH,MAAO,YACT,QACE,OACH,KAKR/yB,GACCjH,EAAAqB,cAAA,MAAA,CAAA,cAAiB,gBACfrB,EAAKqB,cAAA,MAAA,CAAAiD,MAAO,CAAEshB,UAAW,SAAWtE,KAAKlJ,UAAUnR,OAASjE,EAAW,KAG3EhD,EAACqB,cAAA+5B,IACCC,OAAQx7B,EAAMw7B,OACdlV,QAASyb,EAASxgC,QAAQqgC,mBAC1Brb,KAAO3b,IACLo3B,EAAiBp3B,GACjB9H,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHkhC,EAASxgC,UACZqgC,oBAAoB,IACpB,EAEJpb,SAAU,KACR1jB,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHkhC,EAASxgC,UACZqgC,oBAAoB,IACpB,IAGNzhC,EAACqB,cAAAy8B,IACCzC,OAAQx7B,EAAMw7B,OACdlV,QAASyb,EAASxgC,QAAQsgC,oBAC1Btb,KAAO3b,IACLo3B,EAAiBp3B,GACjB9H,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHkhC,EAASxgC,UACZsgC,qBAAqB,IACrB,EAEJrb,SAAU,KACR1jB,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHkhC,EAASxgC,UACZsgC,qBAAqB,IACrB,IAGN1hC,EAACqB,cAAAw9B,IACCl5B,IAAkC,UAA7BjD,EAAMuhC,+BAAuB,IAAA98B,OAAA,EAAAA,EAAEsR,KACpC0N,QAASyb,EAASxgC,QAAQugC,oBAC1Bv9B,MAAO,QACPyT,aAAcA,EACd8iB,YAAaj4B,EAAMuhC,wBACnBv2B,OAAQhL,EAAMwhC,mBACdpjC,aAAc,GACdslB,KAAO1Y,IACLm0B,EAAiBzJ,GAAUv4B,EAAMw7B,OAAQ3tB,EAAO+K,KAAM/K,EAAO+qB,SAAU/qB,EAAO3N,QAC9E4C,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHkhC,EAASxgC,UACZugC,qBAAqB,IACrB,EAEJtb,SAAU,KACR1jB,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHkhC,EAASxgC,UACZugC,qBAAqB,IACrB,IAKZ,CAEa,MAAAiD,GAAwB5kC,EAAM6kC,KAAKxD,IAQhD,SAAS+C,GAAkBvkC,SACzB,MAAMm4B,GAAwB,QAAb1wB,EAAAzH,EAAMm4B,eAAO,IAAA1wB,EAAAA,EAAI,IAAIoG,QAAQyqB,GAAMt4B,EAAMskB,aAAa7E,MAAMjW,GAAMA,EAAEoP,OAAS0f,EAAE1f,SAChG,OAAuB,IAAnBuf,EAAQ33B,OACHL,0CAIPA,gCACGg4B,EAAQvyB,KAAI,CAACiI,EAAgBvN,IAC5BH,EAAKqB,cAAA,MAAA,CAAAsE,IAAK,UAAUxF,KAAS63B,EAAQ33B,UAClCu6B,GAAYltB,EAAO+qB,cAEpBz4B,EAAAqB,cAACw7B,GAAyB,CAAAhlB,aAAchY,EAAMgY,aAAcnK,OAAQA,OAK9E,CAEA,SAAS82B,GAAQnJ,GACf,OAAO/F,KAAKC,OAAO8F,EAAOpD,QAAU,IAAMoD,EAAOpB,OAASC,yBAAyB,CACrF,CAEA,SAASuK,GAAcpJ,EAAuBnG,GAC5C,MAAM4P,EAAWzJ,EAAOpB,OAASC,uBACjC,OAAO5E,KAAKyP,KAAK7P,EAAQ4P,EAC3B,CC1iBM,SAAUE,GAAcnlC,iBAC5B,MAAMuD,EAAUD,KACT2qB,EAAQC,GAAaltB,EAAQA,YAC7BoG,EAASmH,GAAcvN,EAAQA,YAChC2e,MAAEA,EAAKkc,OAAEA,GAAW77B,GACnBkT,EAAUkyB,GAAepkC,EAAQA,YACjCqe,EAAUgmB,GAAerkC,EAAQA,SAA4B,CAAE,GAEhEskC,EAAcnkC,EAAAA,SACpBmkC,EAAY/jC,QAAU2R,EAEtB,MAAMwoB,EAAcv6B,SAAkC,CAAA,GAoDtD,SAAS+gC,EAAengC,EAAqBib,GACvC9W,EAAenE,EAAEyD,UAKrBO,EAAUhE,GAEO,IAAbA,EAAEogC,QAAgBniC,EAAMmI,SAC1BnI,EAAMmI,QAAQ,IAAI64B,GAAiBhkB,EAAUjb,IAG9B,IAAbA,EAAEogC,QAAgBniC,EAAMoiC,YAC1BpiC,EAAMoiC,WAAW,IAAIpB,GAAiBhkB,EAAUjb,IAEnD,CAlED25B,EAAYn6B,QAAU8d,EAEtBxO,EAAAA,WAAU,KACRtC,OAAWpL,GACXI,EAAQgiC,QAAQ5lB,GAAO3Y,KAAKo+B,GAAaj+B,MAAMoH,EAAW,GACzD,CAAChL,EAASoc,IA+Db9O,EAAAA,WAAU,KACRtN,EACG4qB,cAAcnuB,EAAMgY,cACpBhR,MAAMw+B,IAGLtX,EAASttB,OAAAC,OAAA,CAAA,EAAM2kC,GAAY,IAE5Br+B,MAAMwN,QAAQC,IAAI,GACpB,CAACrR,EAASvD,EAAMgY,eAGnB,KADmC,QAAhBvQ,EAAAwmB,aAAM,EAANA,EAAQ/R,aAAQ,IAAAzU,OAAA,EAAAA,EAAAzH,EAAMgY,eAEvC,OAAO7X,EAAAqB,cAAC2jB,EAAMA,OAAA,MAGhB,MAAMod,EAAiBviC,EAAMwiC,kBAE7B,OACEriC,EAAAqB,cAAA,MAAA,CAAKikC,cAAgB1jC,GAAMgE,EAAUhE,iBAAgB,kBACnD5B,EAAAqB,cAACsiC,EAAAA,MAAK,KACJ3jC,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACG+gC,GACCpiC,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,QAAA,CACEW,KAAK,WACLjC,MAAM,UAAS,aACJ,eAAc,cACb,eACZgN,QA5DhB,mBACE,MAAMwX,EAAuC,QAA3Bnd,EAAqB,QAArBE,EAAA69B,EAAY/jC,eAAS,IAAAkG,OAAA,EAAAA,EAAAvF,YAAM,IAAAqF,OAAA,EAAAA,EAAAm+B,aAC7C,IAAKhhB,GAAkC,IAArBA,EAAUlkB,OAC1B,OAAO,EAET,IAAK,MAAMwc,KAAY0H,EACrB,IAAI1H,aAAA,EAAAA,EAAUjM,MAAO2qB,EAAYn6B,QAAQyb,EAASjM,IAChD,OAAO,EAGX,OAAO,CACR,CAiDwBgzB,GACTziC,SAAWS,GA9E3B,SAAgCA,WAC9BA,EAAEkE,kBAEF,MACMiH,EADKnL,EAAEyD,OACM0H,QACb82B,EAAc,CAAA,EACdtf,EAAuC,QAA3Bnd,EAAqB,QAArBE,EAAA69B,EAAY/jC,eAAS,IAAAkG,OAAA,EAAAA,EAAAvF,YAAM,IAAAqF,OAAA,EAAAA,EAAAm+B,aACzCx4B,GAAWwX,GACbA,EAAUzc,SAAS+U,KACbA,eAAAA,EAAUjM,MACZizB,EAAYhnB,EAASjM,KAAM,EAC5B,IAGLs0B,EAAYrB,EACb,CA+DgCC,CAAuBliC,MAI7C85B,EAAOj2B,KAAK4yB,GACXr4B,EAAIqB,cAAA,KAAA,CAAAsE,IAAK0yB,EAAM50B,MAAO40B,EAAM50B,UAIlCzD,EACGqB,cAAA,QAAA,KAA8B,QAA9B8F,EAAgB,QAAhBC,EAAA2L,aAAA,EAAAA,EAAUhR,YAAM,IAAAqF,OAAA,EAAAA,EAAAm+B,oBAAc,IAAAp+B,OAAA,EAAAA,EAAA1B,KAC5BoX,GACCA,GACE7c,EACEqB,cAAA,KAAA,CAAAsE,IAAKkX,EAASjM,iBACF,qBACZ5I,QAAUpG,GAAMmgC,EAAengC,EAAGib,GAClColB,WAAargC,GAAMmgC,EAAengC,EAAGib,IAEpCulB,GACCpiC,EAAAqB,cAAA,KAAA,KACErB,EACEqB,cAAA,QAAA,CAAAW,KAAK,WACLjC,MAAM,wBACM,eAAc,aACd,gBAAgB8c,EAASjM,KACrC7D,UAAWmS,EAASrC,EAASjM,IAC7BzP,SAAWS,GAvHjC,SAAmCA,EAAsBgP,GACvDhP,EAAEkE,kBAEF,MACMiH,EADKnL,EAAEyD,OACM0H,QACb82B,EAAmBpjC,OAAAC,OAAA,CAAA,EAAA66B,EAAYn6B,SACjC2L,EACF82B,EAAYjzB,IAAM,SAEXizB,EAAYjzB,GAErBs0B,EAAYrB,EACb,CA2GsCQ,CAA0BziC,EAAGib,EAASjM,OAI5D8qB,EAAOj2B,KAAK4yB,GAETr4B,EAAIqB,cAAA,KAAA,CAAAsE,IAAK0yB,EAAM50B,MACbzD,EAACqB,cAAAo0B,IAAgBjd,aAAc6f,EAAM7f,aAAc2C,KAAMkd,EAAMmN,SAAU3oB,SAAUA,YAS3D,eAAzB,QAAhBgD,EAAA9M,aAAQ,EAARA,EAAUhR,YAAM,IAAA8d,OAAA,EAAAA,EAAA0lB,mCAAcllC,SAAgBL,EAAAqB,cAAA,MAAA,CAAA,cAAiB,gBAA+B,cAC9F4F,GACCjH,EAAAqB,cAAA,MAAA,CAAA,cAAiB,gBACfrB,EAAKqB,cAAA,MAAA,CAAAiD,MAAO,CAAEshB,UAAW,SAAWtE,KAAKlJ,UAAUnR,OAASjE,EAAW,KAG1EnD,EAAMyjC,QACLtjC,EAACqB,cAAA4H,EAAAA,OAAO,CAAAjB,QAAS,IAAOnI,EAAMyjC,OAAkC7iC,OAAOuU,KAAKumB,EAAYn6B,WAAS,WAMzG,CAEa,MAAAqkC,GAAwBzlC,EAAM6kC,KAAKG,IClM1CU,GAAW,CACf,aACA,0BACA,mBACA,0BACA,6BACA,kBACA,4BCDF,MAAM96B,GAAYC,EAAAA,cAAcS,IAAW,CACzCq6B,QAAS,CACPt2B,SAAU,WACV5D,OAAQ,gBACRvG,QAAS,oBACTyQ,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzC8T,aAAche,EAAMQ,OAAOuJ,GAC3BuwB,WAAY,YAGdC,SAAU,CACRlwB,OAAQ,eAAerK,EAAMiK,OAAOob,KAAK,MAG3CmV,QAAS,CACPnwB,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzCuwB,WAAY,aAAaz6B,EAAMiK,OAAOob,KAAK,MAG7CqV,cAAe,CACb32B,SAAU,WACV42B,MAAO,EACPC,OAAQ,EACR/c,SAAU7d,EAAM66B,UAAUzwB,GAE1B,MAAO,CACL0wB,WAAY,QAqFlB,SAASC,GAAmBxmC,GAC1B,MAAMsL,QAAEA,GAAYP,KACd07B,EAAatlC,EAAAA,SAGnB,SAASulC,EAAaC,GACpB3mC,EAAMsB,SACHmlC,EAAWllC,QAA6BqE,KAAKkE,GAAOA,EAAEiH,KAAO41B,EAAc51B,GAAK41B,EAAgB78B,IAEpG,CAWD,OAjBA28B,EAAWllC,QAAUvB,EAAM4mC,QAkBzBzmC,EAAKqB,cAAA,MAAA,CAAAgK,UAAWF,EAAQw6B,SACrB9lC,EAAM4mC,QAAQhhC,KAAKuM,GAClBhS,EAAKqB,cAAA,MAAA,CAAAsE,IAAKqM,EAAOpB,IACf5Q,EAACqB,cAAAqlC,IACC10B,OAAQA,EACR20B,YAAa9mC,EAAM8mC,YACnBC,eAAgB/mC,EAAM+mC,eACtBC,SAAUhnC,EAAMgnC,SAChBC,YAAajnC,EAAMinC,YACnB3lC,SAAUolC,EACVQ,SAAU,KAAMC,OAfJC,EAeiBj1B,OAdrCnS,EAAMsB,SAAUmlC,EAAWllC,QAA6BsM,QAAQ/D,GAAMA,IAAMs9B,KAD9E,IAAsBA,CAewB,OAI1CjnC,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQ66B,eACtBhmC,EAACqB,cAAA8D,SACC,CAAAC,KAAK,IACL4C,QAAUpG,IA3BlB,IAAmBslC,EA4BTthC,EAAUhE,GA5BDslC,EA6BC,CAAEt2B,GAAIu2B,MA5BxBtnC,EAAMsB,SAAS,IAAKmlC,EAAWllC,QAA8B8lC,IAC7DrnC,EAAM+mC,eAAeM,EAAYt2B,GA2BM,GAI1B,eAIjB,CAYA,SAAS81B,GAAc7mC,GACrB,MAAMsL,QAAEA,EAAOgB,GAAEA,GAAOvB,MAClBoH,OAAEA,GAAWnS,EACbunC,EAoPR,SAA8Bp1B,aAC5B,WAAI1K,EAAA0K,EAAOq1B,0CAAqBhjC,WAAW,YACzC,MAAO,cAGT,WAAI+C,EAAA4K,EAAOq1B,0CAAqBhjC,WAAW,kBACzC,MAAO,gBAGT,WAAI8C,EAAA6K,EAAOq1B,0CAAqBhjC,WAAW,uBACzC,MAAO,OAGT,MACF,CAlQqBijC,CAAqBt1B,GAClC8zB,EAAUjmC,EAAM8mC,cAAgB9mC,EAAMmS,OAAOpB,GAC7Ci1B,EAAWhmC,EAAMgnC,WAAahnC,EAAMmS,OAAOpB,GAYjD,MAAMvF,EAAYc,EAAGhB,EAAQw6B,QAAS,CACpC,CAACx6B,EAAQ26B,SAAUA,EACnB,CAAC36B,EAAQ06B,UAAWA,IAAaC,IAGnC,OACE9lC,EAAkBqB,cAAA,MAAA,CAAA,cAAA2Q,EAAOpB,GAAIvF,UAAWA,EAAWrD,QAhBrD,SAAiBpG,GACfA,EAAEkE,kBACFjG,EAAM+mC,eAAe/mC,EAAMmS,OAAOpB,GACnC,EAasE22B,YAXvE,SAAiB3lC,GACfgE,EAAUhE,GACV/B,EAAMinC,YAAYjnC,EAAMmS,OAAOpB,GAChC,GASIk1B,EACC9lC,EAACqB,cAAAmmC,GACC,CAAAx1B,OAAQA,EACRo1B,WAAYA,EACZjmC,SAAUtB,EAAMsB,SAChBwlC,YAAa9mC,EAAM8mC,YACnBC,eAAgB/mC,EAAM+mC,eACtBC,SAAUhnC,EAAMgnC,SAChBC,YAAajnC,EAAMinC,YACnBC,SAAUlnC,EAAMknC,WAGlB/mC,EAAAqB,cAAComC,GAAc,CAAAz1B,OAAQA,EAAQo1B,WAAYA,IAE7CpnC,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQ66B,eACtBhmC,EAACqB,cAAA8D,SACC,CAAAC,KAAK,IACL4C,QAAUpG,IACRA,EAAEiE,iBACFhG,EAAMknC,UAAU,GAIX,WAIjB,CAEA,MAAMW,GAAoC,CACxCvsB,KAAM,kCACNqoB,IAAK,EACL3qB,IAAK,IACL7W,KAAM,CAAC,CAAEyW,KAAM,YAAc,CAAEA,KAAM,UAAY,CAAEA,KAAM,SAAW,CAAEA,KAAM,YAQ9E,SAASgvB,GAAc5nC,GACrB,MAAMmS,OAAEA,EAAMo1B,WAAEA,GAAevnC,GACxBsc,EAAe3D,GAAgBmvB,GAAgB31B,GACtD,OACEhS,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAA,MAAA,KACG2Q,EAAO5N,OAAS,eAAagjC,GAAc,IAAIA,MAEjDp1B,EAAOq1B,qBACNrnC,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAC6W,GAAgB,CAACnY,MAAO,CAAEgY,UAAW/F,EAAOq1B,wBAGhDlrB,GACCnc,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAACqX,GAAwB,CAAAH,SAAUmvB,GAAgBlvB,aAAcA,EAAczY,MAAOoc,KAKhG,CAaA,SAASqrB,GAAa3nC,GACpB,MAAMmS,OAAEA,GAAWnS,GACZunC,EAAYQ,GAAiB/mC,EAAAA,SAA6BhB,EAAMunC,YAEvE,SAASS,EAAetvB,EAAkBxY,GACxCF,EAAMsB,SAASV,OAAAC,OAAAD,OAAAC,OAAA,GACVsR,GAAM,CACTuG,CAACA,GAAWxY,IAEf,CAED,OACEC,EAACqB,cAAA0N,EAAKA,MAAC,CAAAxN,QAAQ,MACbvB,EAAAqB,cAACa,YACC,CAAAuB,KAAM,eAAeuO,EAAOpB,KAC5B5B,MAAM,QACNlO,aAAckR,EAAO5N,MACrBjD,SAAWS,GAAMimC,EAAe,QAASjmC,EAAEE,cAAc/B,SAE3DC,EAAAqB,cAACa,YACC,CAAAuB,KAAM,qBAAqBuO,EAAOpB,KAClC5B,MAAM,cACNlO,aAAckR,EAAOyK,YACrBtb,SAAWS,GAAMimC,EAAe,cAAejmC,EAAEE,cAAc/B,SAEjEC,EAACqB,cAAAK,EAAAA,cACCsN,MAAM,iBACNyN,YAAY,0CACZhZ,KAAM,cAAcuO,EAAOpB,KAC3B9P,aAAcsmC,EACdjmC,SAAWS,GAAMgmC,EAAchmC,EAAEE,cAAc/B,OAC/CgC,KAAM,CAAC,GAAI,cAAe,MAAO,gBAAiB,UAEnDiQ,EAAOA,QAAUA,EAAOA,OAAO3R,OAAS,GACvCL,EAAAqB,cAACglC,GAAkB,CACjBI,QAASz0B,EAAOA,OAChB20B,YAAa9mC,EAAM8mC,YACnBC,eAAgB/mC,EAAM+mC,eACtBC,SAAUhnC,EAAMgnC,SAChBC,YAAajnC,EAAMinC,YACnB3lC,SAAW2mC,GAAMD,EAAe,SAAUC,KAG7C,MACC,OAAQV,GACN,IAAK,cACH,OACEpnC,EAACqB,cAAA0mC,GACC,CAAA3jC,MAAM,cACNqY,YAAY,8DACZ5E,aAAa,WACb7F,OAAQA,EACR7Q,SAAUtB,EAAMsB,WAGtB,IAAK,MACH,OACEnB,EAACqB,cAAA0mC,GACC,CAAA3jC,MAAM,MACNqY,YAAY,qDACZ5E,aAAa,qBACb7F,OAAQA,EACR7Q,SAAUtB,EAAMsB,WAGtB,IAAK,gBACH,OACEnB,EAACqB,cAAA0mC,GACC,CAAA3jC,MAAM,gBACNqY,YAAY,wDACZ5E,aAAa,gBACb7F,OAAQA,EACR7Q,SAAUtB,EAAMsB,WAGtB,IAAK,OACH,OACEnB,EAACqB,cAAA0mC,GACC,CAAA3jC,MAAM,OACNqY,YAAY,gDACZ5E,aAAa,qBACb7F,OAAQA,EACR7Q,SAAUtB,EAAMsB,WAGtB,QACE,OAAO,KAEZ,EA7CA,GA8CDnB,EAACqB,cAAAqb,IAAYtY,MAAM,SAASqY,YAAY,sCACtCzc,EAACqB,cAAA2mC,IAAkBvkC,KAAM,UAAYuO,EAAOpB,GAAIoB,OAAQA,EAAQ7Q,SAAUtB,EAAMsB,YAIxF,CAUA,SAAS4mC,GAA0BloC,GACjC,MAAM+Q,GAAEA,EAAEy2B,oBAAEA,GAAwBxnC,EAAMmS,OACpC+F,GAAYsvB,aAAA,EAAAA,EAAqBhjC,WAAWxE,EAAMgY,aAAe,MACnE,CAAEE,UAAWsvB,QACbrkC,EACJ,OACEhD,EAACqB,cAAA0iB,GACC,CAAAtgB,KAAMmN,EACNiH,aAAchY,EAAMgY,aACpB/W,aAAciX,EACdkwB,aAAa,EACb9mC,SAAWD,IACLA,EACFrB,EAAMsB,SAAcV,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAb,EAAMmS,QAAM,CAAEq1B,oBAAqB1X,EAAkBA,mBAACzuB,MAE1ErB,EAAMsB,SAAQV,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMb,EAAMmS,QAAM,CAAEq1B,yBAAqBrkC,IACxD,GAIT,CAQA,SAASglC,GAAkBnoC,GACzB,MAAME,EAAQF,EAAMmS,OACdrM,EAAM,UACLwW,EAAe3D,GAAgBmvB,GAAgB5nC,GACtD,OACEC,EAACqB,cAAAskB,GACC,CAAApN,SAAUmvB,GACVjkC,KAAK,YACL3C,aAAcqb,EACd4L,oBAAqBvP,EACrBrX,SAAU,CAACD,EAAeoc,KACxBzd,EAAMsB,SAASic,GAAiBrd,EAAO4F,EAAK2X,QAAAA,EAAY3X,EAAK+hC,GAAgBxmC,GAAU,GAI/F,CAkBA,SAASymC,GAAgB31B,GACvB,OAAOsJ,GAAgB,CAAEtZ,KAAM,uBAAwBjC,MAAOiS,GAAU,SAC1E,CAEA,IAAIk2B,GAAS,EASb,SAASf,GAAWxgB,GAClB,GAAIA,EAAU,CACZ,GAAIA,EAAStiB,WAAW,OAAQ,CAC9B,MAAM8jC,EAAc1gB,SAASd,EAAS1Y,UAAU,IAC3Cm6B,MAAMD,KACTD,GAAS5S,KAAKzc,IAAIqvB,GAAQC,EAAc,GAE3C,CACD,OAAOxhB,CACR,CACD,MAAO,MAAQuhB,IACjB,CASA,SAASG,GACP5B,GAEA,GAAKA,EAGL,OAAOA,EAAQhhC,KAAKuM,GAAWvR,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAC1BsR,GAAM,CACTpB,GAAIu2B,GAAWn1B,EAAOpB,IACtBoB,OAAQq2B,GAA+Br2B,EAAOA,WAElD,CC3eA,IAAYs2B,GAoBN,SAAUC,GAAiB3qB,GAC/B,MAAqB,WAAdA,EAAK5b,MAAmC,gBAAd4b,EAAK5b,IACxC,CCqBM,SAAUwmC,GAAkB3oC,GAChC,MAAMuD,EAAUD,IACVslC,EAASrlC,EAAQ0tB,cAChBhD,EAAQC,GAAaltB,EAAQA,WAC9B6nC,EAAgB9rB,GAAY/c,EAAM6oC,gBACjC31B,EAAUkyB,GAAepkC,EAAQA,YACjC8nC,EAASC,GAAc/nC,EAAQA,SAAkD,CAAE,GAuB1F,OArBA6P,EAAAA,WAAU,KACRtN,EACG4qB,cAAc,iBACdnnB,MAAK,IAAMzD,EAAQ4qB,cAAc,2BACjCnnB,KAAKknB,GACL/mB,MAAMwN,QAAQC,IAAI,GACpB,CAACrR,IAEJsN,EAAAA,WAAU,KACRu0B,EAAYyD,EA0YhB,SAA8BA,GAC5B,MAAM31B,EAAkC,CACtC8E,aAAc,wBACd6wB,cAAe/Y,EAAkBA,mBAAC+Y,GAClC9qB,KAAMirB,GAA0BH,EAAc9qB,OAGhD,OAAO7K,CACT,CAlZgC+1B,CAAqBJ,QAAiB1lC,EAAU,GAC3E,CAAC0lC,IAWC5a,GAAW4a,EAKd1oC,EAACqB,cAAA2L,EACC,CAAAC,OAAO,qBACPC,SAAU,KACJrN,EAAMqN,UAAY6F,GACpBlT,EAAMqN,SACDzM,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAqS,IACH21B,cAAe/Y,EAAkBA,mBAAC+Y,GAClCpc,QAASzsB,EAAMysB,QACfmc,OAAQ7kC,EAAeA,gBAAC6kC,GACxBM,UAAU,IAAIjlC,MAAOC,gBAExB,GAGF2kC,EAActkC,OAASpE,EAAAqB,cAACyN,EAAAA,MAAO,KAAA45B,EAActkC,OAC7CskC,EAAc9qB,MACb5d,gBAACgpC,GAA0B,CAAC9X,MAAOwX,EAAc9qB,KAAM+qB,QAASA,EAASxnC,SA9B/E,SAAkB8nC,GAChB,MAAMC,EAAqC,CACzCrxB,aAAc,wBACd+F,KAAMqrB,GAERhE,EAAYiE,GACZN,EAAWO,EAAAA,wBAAwBD,GACpC,IAyBGlpC,EAACqB,cAAAC,SAAM+N,SAAS,QAAQC,GAAG,MACzBtP,EAAAqB,cAAC4H,SAAM,CAACjH,KAAK,UAAUnC,EAAMupC,kBAAoB,QAvB9C,IA2BX,CAQA,SAASJ,GAA2BnpC,GAClC,MAAOwpC,EAAeC,GAAoBzoC,EAAAA,SACxCgoC,GAA0BhpC,EAAMqxB,QAGlC,SAASqY,EAAgBppC,EAAeqpC,GACtC,MAAMP,EAAmBI,EAAc3gC,QACvCugC,EAAiB9oC,GAASqpC,EAC1BF,EAAiBL,GACjBppC,EAAMsB,SAAS8nC,EAChB,CAED,OACEjpC,EAAAqB,cAAC0N,EAAAA,MAAK,KACHlP,EAAMqxB,MAAMzrB,KAAI,CAACmY,EAAMzd,KACtB,IAAKspC,GAAkB7rB,EAAM/d,EAAM8oC,SACjC,OAAO,KAET,GAAI/qB,EAAK5b,OAASsmC,EAAqBA,sBAAC7gC,QACtC,OAAOzH,EAAAqB,cAAA,IAAA,CAAGsE,IAAKiY,EAAK8rB,QAAS9rB,EAAKla,MAEpC,GAAIka,EAAK5b,OAASsmC,EAAqBA,sBAACqB,MACtC,OACE3pC,EAAAqB,cAACuoC,GAAqB,CACpBjkC,IAAKiY,EAAK8rB,OACV9rB,KAAMA,EACN+qB,QAAS9oC,EAAM8oC,QACfxnC,SAAWqoC,GAAoBD,EAAgBppC,EAAOqpC,KAI5D,GAAI5rB,EAAK5b,OAASsmC,EAAqBA,sBAACvvB,QAAS,CAC/C,MAAM8wB,EAAUjsB,EAAKisB,SAAWjsB,EAAKisB,QAAQxpC,OAAS,EAAIud,EAAKisB,QAAQ,QAAK7mC,EAC5E,OACEhD,gBAACqc,GAAmB,CAAC1W,IAAKiY,EAAK8rB,OAAQtlC,MAAOwZ,EAAKla,KAAM8Y,QAASoB,EAAK8rB,QACrE1pC,EAAAqB,cAACqS,WAAQ,CACP9C,GAAIgN,EAAK8rB,OACTjmC,KAAMma,EAAK8rB,OACXx0B,eAAgB20B,aAAA,EAAAA,EAASC,aACzB3oC,SAAWS,GACT2nC,EAAgBppC,EAAO,CACrBupC,OAAQ9rB,EAAK8rB,OACbhmC,KAAMka,EAAKla,KACXqmC,OAAQ,CAAC,CAAED,aAAcloC,EAAEE,cAAciL,cAMpD,CACD,OACE/M,gBAAC0c,GAAW,CAAC/W,IAAKiY,EAAK8rB,OAAQltB,QAASoB,EAAK8rB,OAAQtlC,MAAOwZ,EAAKla,MAAQ,IACvE1D,EAAAqB,cAACuoC,GAAqB,CACpBhsB,KAAMA,EACN+qB,QAAS9oC,EAAM8oC,QACfxnC,SAAWqoC,GAAoBD,EAAgBppC,EAAOqpC,KAG1D,IAIV,CAQM,SAAUI,GAAsB/pC,GACpC,MAAM+d,EAAO/d,EAAM+d,KAEb5b,EAAO4b,EAAK5b,KAClB,IAAKA,EACH,OAAO,KAGT,MAAMyB,EAAOma,EAAK8rB,OAClB,IAAKjmC,EACH,OAAO,KAGT,MAAMomC,EAAUjsB,EAAKisB,SAAWjsB,EAAKisB,QAAQxpC,OAAS,EAAIud,EAAKisB,QAAQ,QAAK7mC,EAU5E,SAASgnC,EAAeC,GACtBpqC,EAAMsB,SAAS,CACbuoC,OAAQ9rB,EAAK8rB,OACbhmC,KAAMka,EAAKla,KACXqmC,OAAQ,CAACE,IAEZ,CAED,OAAQjoC,GACN,KAAKsmC,EAAqBA,sBAACqB,MACzB,OACE3pC,EAAAqB,cAAA,MAAA,KACErB,EAAKqB,cAAA,KAAA,KAAAuc,EAAKla,MACTka,EAAKA,MACJ5d,EAAAqB,cAAC2nC,GAA0B,CAAC9X,MAAOtT,EAAKA,KAAM+qB,QAAS9oC,EAAM8oC,QAASxnC,SAtBhF,SAAsB8nC,GACpBppC,EAAMsB,SAAS,CACbuoC,OAAQ9rB,EAAK8rB,OACbhmC,KAAMka,EAAKla,KACXka,KAAMqrB,GAET,KAoBC,KAAKX,EAAqBA,sBAACvvB,QACzB,OACE/Y,EAACqB,cAAAqS,YACC9C,GAAInN,EACJA,KAAMA,EACNyR,eAAgB20B,aAAO,EAAPA,EAASC,aACzB3oC,SAAWS,GAAMooC,EAAe,CAAEF,aAAcloC,EAAEE,cAAciL,YAGtE,KAAKu7B,EAAqBA,sBAAC9f,QACzB,OACExoB,gBAACkC,EAAAA,UAAS,CACRF,KAAK,SACLsI,KAAK,MACLsG,GAAInN,EACJA,KAAMA,EACN3C,aAAc+oC,eAAAA,EAASK,aACvB/oC,SAAWS,GAAMooC,EAAe,CAAEE,aAActoC,EAAEE,cAAc2mB,kBAGtE,KAAK6f,EAAqBA,sBAAClvB,QACzB,OACEpZ,gBAACkC,EAAAA,UAAS,CACRF,KAAK,SACLsI,KAAM,EACNsG,GAAInN,EACJA,KAAMA,EACN3C,aAAc+oC,eAAAA,EAASM,aACvBhpC,SAAWS,GAAMooC,EAAe,CAAEG,aAAcvoC,EAAEE,cAAc2mB,kBAGtE,KAAK6f,EAAqBA,sBAACnvB,KACzB,OACEnZ,gBAACkC,EAASA,UAAA,CACRF,KAAK,OACL4O,GAAInN,EACJA,KAAMA,EACN3C,aAAc+oC,aAAA,EAAAA,EAASO,UACvBjpC,SAAWS,GAAMooC,EAAe,CAAEI,UAAWxoC,EAAEE,cAAc/B,UAGnE,KAAKuoC,EAAqBA,sBAAC5uB,SACzB,OACE1Z,EAAAqB,cAACuf,GAAa,CACZnd,KAAMA,EACN3C,aAAc+oC,aAAO,EAAPA,EAASQ,cACvBlpC,SAAWD,GAAqB8oC,EAAe,CAAEK,cAAenpC,MAGtE,KAAKonC,EAAqBA,sBAACzkC,KACzB,OACE7D,gBAACkC,EAASA,UAAA,CACRF,KAAK,OACL4O,GAAInN,EACJA,KAAMA,EACN3C,aAAc+oC,aAAA,EAAAA,EAASS,UACvBnpC,SAAWS,GAAMooC,EAAe,CAAEM,UAAW1oC,EAAEE,cAAc/B,UAGnE,KAAKuoC,EAAAA,sBAAsBhvB,OAC3B,KAAKgvB,EAAqBA,sBAACnkC,IACzB,OACEnE,EAACqB,cAAAa,aACC0O,GAAInN,EACJA,KAAMA,EACN3C,aAAc+oC,aAAO,EAAPA,EAASlM,YACvBx8B,SAAWS,GAAMooC,EAAe,CAAErM,YAAa/7B,EAAEE,cAAc/B,UAGrE,KAAKuoC,EAAqBA,sBAAC5kC,KACzB,OACE1D,EAACqB,cAAAqnB,YACC9X,GAAInN,EACJA,KAAMA,EACN3C,aAAc+oC,aAAO,EAAPA,EAASlM,YACvBx8B,SAAWS,GAAMooC,EAAe,CAAErM,YAAa/7B,EAAEE,cAAc/B,UAGrE,KAAKuoC,EAAqBA,sBAACz/B,WACzB,OACE7I,EAAAqB,cAAC2H,EAAe,CACdvF,KAAMA,EACN3C,aAAc+oC,aAAO,EAAPA,EAASU,gBACvBppC,SAAWD,GAAa8oC,EAAe,CAAEO,gBAAiBrpC,MAGhE,KAAKonC,EAAqBA,sBAACvwB,UACzB,OACE/X,EAAAqB,cAAC8jB,GAAc,CACb1hB,KAAMA,EACN3C,aAAc+oC,aAAO,EAAPA,EAASW,eACvBrpC,SAAWD,GAAa8oC,EAAe,CAAEQ,eAAgBtpC,MAG/D,KAAKonC,EAAqBA,sBAAC5R,SACzB,OACE12B,EAAAqB,cAAC+gB,GAAa,CACZ3e,KAAMA,EACN3C,aAAc+oC,aAAO,EAAPA,EAASY,cACvBtpC,SAAWD,GAAa8oC,EAAe,CAAES,cAAevpC,MAG9D,KAAKonC,EAAAA,sBAAsBoC,OAC3B,KAAKpC,EAAqBA,sBAACqC,WACzB,OAgKN,SAA0B/sB,SACxB,SAAuB,QAAdtW,EAAAsW,EAAKgtB,iBAAS,IAAAtjC,OAAA,EAAAA,EAAEuX,MACtBjd,cACC,MAAU,sEAAVA,EAAEuC,KAC4C,eAAX,QAAnCgD,EAA8B,QAA9BC,EAAsB,QAAtBE,EAAA1F,EAAEipC,4BAAoB,IAAAvjC,OAAA,EAAAA,EAAEsY,cAAM,IAAAxY,OAAA,EAAAA,EAAG,UAAE,IAAAD,OAAA,EAAAA,EAAEsR,KAAoB,IAE/D,CAtKUqyB,CAAiBltB,GAEjB5d,gBAAC+qC,GAAgC,CAACtnC,KAAMA,EAAMma,KAAMA,EAAMisB,QAASA,EAASG,eAAgBA,IAI5FhqC,gBAACgrC,GAA6B,CAACvnC,KAAMA,EAAMma,KAAMA,EAAMisB,QAASA,EAASG,eAAgBA,IAKjG,OAAO,IACT,CASA,SAASe,GAAiClrC,GACxC,MAAM4D,KAAEA,EAAIma,KAAEA,EAAIisB,QAAEA,GAAYhqC,EAC1BorC,EAAexvB,EAAqBA,sBAAC,CAAEzZ,KAAM,2BAA4BjC,MAAO8pC,GAAW,SAI3F9nC,EAAO,CAAC,IACd,GAAI6b,EAAKstB,aACP,IAAK,MAAMC,KAAUvtB,EAAKstB,aAAc,CACtC,MAAME,EAAc3vB,EAAqBA,sBACvC,CAAEzZ,KAAM,gCAAiCjC,MAAOorC,GAChD,SAEFppC,EAAKvB,KAAK6qC,GAAmBD,GAC9B,CAGH,OACEprC,EAACqB,cAAAK,EAAYA,aACX,CAAAkP,GAAInN,EACJA,KAAMA,EACNtC,SAAWS,IACT,MAAMzB,EAAQyB,EAAEE,cAAcwpC,cAC9B,GAAc,IAAVnrC,EAEF,YADAN,EAAMmqC,eAAe,CAAA,GAGvB,MAAMmB,EAAUvtB,EAAKstB,aAAiD/qC,EAAQ,GACxEirC,EAAc3vB,EAAqBA,sBACvC,CAAEzZ,KAAM,gCAAiCjC,MAAOorC,GAChD,SAEII,EAAe,QAAU7tB,EAAUA,WAAC0tB,EAAYppC,MACtDnC,EAAMmqC,eAAe,CAAEuB,CAACA,GAAeH,EAAYrrC,OAAQ,EAE7De,aAAcuqC,GAAmBJ,GACjClpC,KAAMA,GAGZ,CAEA,SAASspC,GAAmB1vB,GAC1B,GAAKA,EAGL,MAAwB,oBAApBA,EAAW3Z,KACN2Z,EAAW5b,MAAM6f,OAAO,GAAGnY,QAEZ,WAApBkU,EAAW3Z,KACN2Z,EAAW5b,MAAM0H,QAEnBkU,EAAW5b,MAAMkZ,UAC1B,CAEA,SAAS+xB,GAA8BnrC,GACrC,MAAM4D,KAAEA,EAAIma,KAAEA,EAAIisB,QAAEA,EAAOG,eAAEA,GAAmBnqC,EAC1C2rC,EAAyB1vB,EAAAA,aAAaC,MAAqC,8BAAEE,WAAW,YACxFgvB,EAAexvB,EAAqBA,sBAAC,CAAEzZ,KAAM,2BAA4BjC,MAAO8pC,GAAW,SAI3FhzB,EAAkC,GACxC,IAAI/V,EACJ,GAAI8c,EAAKstB,aACP,IAAK,IAAIvhC,EAAI,EAAGA,EAAIiU,EAAKstB,aAAa7qC,OAAQsJ,IAAK,CACjD,MAAMwhC,EAASvtB,EAAKstB,aAAavhC,GAC3B8hC,EAAa,GAAGhoC,YAAekG,IAC/ByhC,EAAc3vB,EAAqBA,sBACvC,CAAEzZ,KAAM,gCAAiCjC,MAAOorC,GAChD,SAEEF,GAAgB7yB,EAAAA,UAAUgzB,KAAiBhzB,EAASA,UAAC6yB,KACvDnqC,EAAe2qC,GAEjB50B,EAAQrW,KAAK,CAACirC,EAAYL,GAC3B,CAGH,OACEprC,gBAAC0rC,EAAKA,MAACpqC,MACL,CAAAmC,KAAMA,EACNkoC,YAAY,WACZ7qC,aAAcA,EACdK,SAAWD,IACT,MAAMiqC,EAASt0B,EAAQyI,MAAM6rB,GAAWA,EAAO,KAAOjqC,IACtD,GAAIiqC,EAAQ,CACV,MAAMC,EAAcD,EAAO,GACrBI,EAAe,QAAU7tB,EAAUA,WAAC0tB,EAAYppC,MACtDgoC,EAAe,CAAEuB,CAACA,GAAeH,EAAYrrC,OAC9C,IAGF8W,EAAQpR,KAAI,EAAEgmC,EAAYL,KACzBprC,EAAAqB,cAACqqC,EAAAA,MAAK,CACJ/lC,IAAK8lC,EACL76B,GAAI66B,EACJ1rC,MAAO0rC,EACPz8B,MACEhP,EAAAqB,cAACqX,GAAuB,CACtBH,SAAUizB,EACVhzB,aAAc4yB,EAAYppC,KAC1BjC,MAAOqrC,EAAYrrC,YAOjC,CAYA,SAAS8oC,GAA0B3X,SACjC,OAA2C,QAApC5pB,EAAA4pB,aAAA,EAAAA,EAAOzrB,IAAImmC,WAAyB,IAAAtkC,EAAAA,EAAI,EACjD,CAEA,SAASskC,GAAyBhuB,WAChC,MAAO,CACL8rB,OAAQ9rB,EAAK8rB,OACbhmC,KAAMka,EAAKla,KACXka,KAAMirB,GAA0BjrB,EAAKA,MACrCmsB,OAAqD,QAA7C3iC,EAAc,QAAdE,EAAAsW,EAAKisB,eAAS,IAAAviC,OAAA,EAAAA,EAAA7B,IAAIomC,WAA2B,IAAAzkC,EAAAA,EAAI,GAE7D,CAEA,SAASykC,GAA2B9B,GAGlC,OAAAtpC,OAAAC,OAAA,CAAA,EAAYqpC,EACd,CAUgB,SAAAN,GACd7rB,EACA+qB,GAEA,IAAK/qB,EAAKkuB,WACR,OAAO,EAET,MAAMC,EAAiBnuB,EAAKmuB,gBAAkB,MAC9C,IAAK,MAAMD,KAAcluB,EAAKkuB,WAAY,CACxC,MAAME,EAAiBvwB,EAAAA,sBACrB,CACEzZ,KAAM,8BACNjC,MAAO+rC,GAET,aAEIG,EAAexwB,EAAAA,sBACnB,CACEzZ,KAAM,kCACNjC,MAAO4oC,EAAQmD,EAAWI,WAE5B,YAEIC,EAAQC,EAAAA,WAAWJ,EAAgBC,GACzC,GAAuB,QAAnBF,GAA4BI,EAC9B,OAAO,EAET,GAAuB,QAAnBJ,IAA6BI,EAC/B,OAAO,CAEV,CACD,MAAuB,QAAnBJ,CAKN,CD7fCM,EAAA/D,2BAAA,GAlBWA,GAAAA,0BAAAA,EAAAA,sBAkBX,CAAA,IAjBC,MAAA,QACAA,GAAA,QAAA,UACAA,GAAA,SAAA,WACAA,GAAA,QAAA,UACAA,GAAA,QAAA,UACAA,GAAA,QAAA,UACAA,GAAA,KAAA,OACAA,GAAA,SAAA,WACAA,GAAA,KAAA,OACAA,GAAA,OAAA,SACAA,GAAA,KAAA,OACAA,GAAA,IAAA,MACAA,GAAA,OAAA,SACAA,GAAA,WAAA,cACAA,GAAA,WAAA,aACAA,GAAA,UAAA,YACAA,GAAA,SAAA,WENF,MAAM19B,GAAYC,EAAAA,cAAcS,IAAW,CACzCq6B,QAAS,CACPt2B,SAAU,WACV5D,OAAQ,gBACRvG,QAAS,oBACTyQ,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzC8T,aAAche,EAAMQ,OAAOuJ,GAC3BuwB,WAAY,YAGdC,SAAU,CACRlwB,OAAQ,eAAerK,EAAMiK,OAAOob,KAAK,MAG3CmV,QAAS,CACPnwB,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzCuwB,WAAY,aAAaz6B,EAAMiK,OAAOob,KAAK,MAG7C2b,aAAc,CACZ/nC,SAAU,KAGZgoC,WAAY,CACVl9B,SAAU,WACV42B,MAAO,EACPuG,IAAK,EACLtnC,QAAS,EACT4D,MAAOwC,EAAMiK,OAAOC,KAAK,GACzB2T,SAAU7d,EAAM66B,UAAUzwB,IAG5BswB,cAAe,CACb32B,SAAU,WACV42B,MAAO,EACPC,OAAQ,EACR/c,SAAU7d,EAAM66B,UAAUzwB,GAE1B,MAAO,CACL0wB,WAAY,IAIhBqG,YAAa,CACX5nC,MAAO,IACPm8B,aAAc,GAGhB0L,WAAY,CACV7nC,MAAO,SAsEX,SAAS8nC,GAAyD9sC,SAChE,MAAMsL,QAAEA,EAAOgB,GAAEA,GAAOvB,KAClBiS,EAAWhd,EAAM+d,KACjBA,EAAO/d,EAAM+d,KACbgvB,EAAa,iBAAkB/sC,EAAM+d,KACrCivB,EAAcD,GAAchvB,EAAK5b,OAASsmC,EAAAA,sBAAsBqB,MAChED,EAAoB,QAAXpiC,EAAAsW,EAAK8rB,cAAM,IAAApiC,EAAAA,EAAI,aACxBw+B,EAAUjmC,EAAM8mC,cAAgB9mC,EAAM+d,KAAKhN,GAC3Ci1B,EAAWhmC,EAAMgnC,WAAahnC,EAAM+d,KAAKhN,GAEzCk8B,EAAU9rC,EAAAA,SAahB,SAAS+rC,EAAWC,SAClB,MAAMC,EAAOH,EAAQ1rC,QACrBvB,EAAMsB,SAASV,+BACVwsC,GAAI,CACPrvB,KAAiB,QAAXtW,EAAA2lC,EAAKrvB,YAAM,IAAAtW,OAAA,EAAAA,EAAA7B,KAAKkE,GAAOA,EAAEiH,KAAOo8B,EAAYp8B,GAAKo8B,EAAcrjC,MAExE,CAED,SAASujC,EAAQC,WACfttC,EAAMsB,SAAQV,OAAAC,OAAAD,OAAAC,OAAA,GACTb,EAAM+d,MAAI,CACbA,KAAM,IAAqB,QAAhBxW,EAAU,UAAVvH,EAAM+d,YAAI,IAAAtW,OAAA,EAAAA,EAAEsW,YAAI,IAAAxW,EAAAA,EAAI,GAAK+lC,KAEvC,CASD,SAAStF,EAAetvB,EAAkBxY,GACxCF,EAAMsB,SAASV,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACVosC,EAAQ1rC,SACX,CAAAmX,CAACA,GAAWxY,IAEf,CAvCD+sC,EAAQ1rC,QAAUvB,EAAM+d,KAyCxB,MAAMvS,EAAYc,EAAGhB,EAAQw6B,QAAS,CACpC,CAACx6B,EAAQ26B,SAAUA,EACnB,CAAC36B,EAAQ06B,UAAWA,IAAaC,IAGnC,OACE9lC,EAAkBqB,cAAA,MAAA,CAAA,cAAAuc,EAAK8rB,OAAQr+B,UAAWA,EAAWrD,QA7CvD,SAAiBpG,GACfgE,EAAUhE,GACV/B,EAAM+mC,eAAe/mC,EAAM+d,KAAKhN,GACjC,EA0CwE22B,YAxCzE,SAAiB3lC,GACfgE,EAAUhE,GACV/B,EAAMinC,YAAYjnC,EAAM+d,KAAKhN,GAC9B,GAsCG5Q,EAAKqB,cAAA,MAAA,CAAAgK,UAAWF,EAAQmhC,cACrBxG,EACC9lC,EAAAqB,cAAArB,EAAAwH,SAAA,KACGolC,GACC5sC,EAACqB,cAAAa,EAASA,WACRsG,KAAK,KACL1H,aAAc+b,EAASzY,MACvBjD,SAAWS,GAAMimC,EAAe,QAASjmC,EAAEE,cAAc/B,UAG3D6sC,GACA5sC,EAACqB,cAAAqnB,EAAQA,UACP0kB,UAAQ,EACRC,QAAS,EACTvsC,aAAc8c,EAAKla,KACnBvC,SAAWS,GAAMimC,EAAe,OAAQjmC,EAAEE,cAAc/B,SAG3DwoC,GAAiB3qB,IAChB5d,EAACqB,cAAAisC,GACC,CAAAz2B,QAAS+G,EAAKstB,aACd/pC,SAAWosC,GAAe1F,EAAe,eAAgB0F,MAK/DvtC,EAAAqB,cAAArB,EAAAwH,SAAA,KACGqV,EAASzY,OAASpE,EAAAqB,cAACyN,EAAAA,MAAO,KAAA+N,EAASzY,OACnCwZ,EAAKla,MAAQ1D,2BAAM4d,EAAKla,OACvBmpC,GAAe7sC,EAACqB,cAAAuoC,IAAsBhsB,KAAMA,EAAM+qB,QAAS,CAAE,EAAExnC,SAAU,KAAe,MAI/Fyc,EAAKA,MACJA,EAAKA,KAAKnY,KAAKkE,GACb3J,EAAKqB,cAAA,MAAA,CAAAsE,IAAKgE,EAAEiH,IACV5Q,EAACqB,cAAAsrC,IACC/uB,KAAMjU,EACNg9B,YAAa9mC,EAAM8mC,YACnBC,eAAgB/mC,EAAM+mC,eACtBC,SAAUhnC,EAAMgnC,SAChBC,YAAajnC,EAAMinC,YACnB3lC,SAAU4rC,EACVhG,SAAU,IAhEtB,SAAoByG,WAClB3tC,EAAMsB,SACDV,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAb,EAAM+d,MACT,CAAAA,KAAwB,QAAlBxW,EAAY,QAAZE,EAAAzH,EAAM+d,YAAM,IAAAtW,OAAA,EAAAA,EAAAsW,YAAM,IAAAxW,OAAA,EAAAA,EAAAsG,QAAQ/D,GAAMA,IAAM6jC,MAE/C,CA2D2BC,CAAW9jC,SAIjCkjC,GACA7sC,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQohC,YACrBzG,EACC9lC,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAAAqB,cAACa,EAAAA,UAAS,CACRsG,KAAK,KACL6C,UAAWF,EAAQshC,YACnB3rC,aAAc8c,EAAK8rB,OACnBvoC,SAAWS,GAAMimC,EAAe,SAAUjmC,EAAEE,cAAc/B,UAE1D8sC,GACA7sC,gBAAC0B,EAAYA,aAAA,CACX8G,KAAK,KACL6C,UAAWF,EAAQuhC,WACnB5rC,aAAc8c,EAAK5b,KACnBb,SAAWS,GAAMimC,EAAe,OAAQjmC,EAAEE,cAAc/B,OACxDgC,KAAM,CACJ,CAAEhC,MAAO,UAAWiP,MAAO,WAC3B,CAAEjP,MAAO,UAAWiP,MAAO,WAC3B,CAAEjP,MAAO,UAAWiP,MAAO,WAC3B,CAAEjP,MAAO,UAAWiP,MAAO,WAC3B,CAAEjP,MAAO,OAAQiP,MAAO,QACxB,CAAEjP,MAAO,WAAYiP,MAAO,aAC5B,CAAEjP,MAAO,OAAQiP,MAAO,QACxB,CAAEjP,MAAO,SAAUiP,MAAO,UAC1B,CAAEjP,MAAO,OAAQiP,MAAO,QACxB,CAAEjP,MAAO,MAAOiP,MAAO,OACvB,CAAEjP,MAAO,SAAUiP,MAAO,UAC1B,CAAEjP,MAAO,cAAeiP,MAAO,eAC/B,CAAEjP,MAAO,aAAciP,MAAO,cAC9B,CAAEjP,MAAO,YAAaiP,MAAO,aAC7B,CAAEjP,MAAO,WAAYiP,MAAO,gBAMpChP,EAAAqB,cAAA,MAAA,KAAMqoC,IAIZ1pC,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQ66B,eACrB6G,GACC7sC,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAACqB,cAAA8D,SACC,CAAAC,KAAK,IACL4C,QAAUpG,IACRA,EAAEiE,iBACFqnC,EAAQ,CACNt8B,GAAIu2B,KACJuC,OAAQgE,GAAe,KACvB1rC,KAAM,SACN0B,KAAM,YACe,GAIlB,YACT1D,EAACqB,cAAA8D,SACC,CAAAC,KAAK,IACL4C,QAAUpG,IACRA,EAAEiE,iBACFqnC,EAAQ,CACNt8B,GAAIu2B,KACJuC,OAAQgE,GAAe,KACvB1rC,KAAM,QACN0B,KAAM,SACe,GACxB,cAMNoiC,IAAY8G,GACX5sC,gBAACmF,EAAAA,OAAM,CACLC,KAAK,IACL4C,QAAUpG,IACRA,EAAEiE,iBACEhG,EAAMknC,UACRlnC,EAAMknC,UACP,GAII,WAKnB,CAOA,SAASuG,GAAcztC,SACrB,MAAM0Y,EAAWuD,EAAAA,aAAaC,MAAqC,8BAAEE,WAAW,YAC1EpF,EAAuB,QAAbvP,EAAAzH,EAAMgX,eAAO,IAAAvP,EAAAA,EAAI,GACjC,OACEtH,EAAAqB,cAAA,MAAA,KACGwV,EAAQpR,KAAK0lC,IACZ,MAAOhvB,EAAe3D,GAAgB8C,GACpC,CAAEtZ,KAAM,gCAAiCjC,MAAOorC,GAChD,SAEF,OACEnrC,uBACE2F,IAAKwlC,EAAOv6B,GACZtM,MAAO,CACLmD,QAAS,OACToH,cAAe,MACf8+B,eAAgB,gBAChBC,WAAY,SACZ/oC,MAAO,QAGT7E,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAACskB,GAAqB,CACpBhgB,IAAKwlC,EAAOv6B,GACZnN,KAAK,WACL8U,SAAUA,EACVwP,oBAAqBvP,EACrB1X,aAAcqb,EACdhb,SAAU,CAACD,EAAeoc,KACxB,MAAMiwB,EAAa,IAAI12B,GACjB1W,EAAQotC,EAAW9Y,WAAWoZ,GAAMA,EAAEj9B,KAAOu6B,EAAOv6B,KAC1D28B,EAAWptC,GAAS,CAAEyQ,GAAIu6B,EAAOv6B,GAAI0M,CAACA,GAAqBpc,GAC3DrB,EAAMsB,SAASosC,EAAW,KAIhCvtC,EAAAqB,cAAA,MAAA,KACErB,EAACqB,cAAA8D,SACC,CAAAC,KAAK,IACL4C,QAAUpG,IACRgE,EAAUhE,GACV/B,EAAMsB,SAAS0V,EAAQnJ,QAAQmgC,GAAMA,EAAEj9B,KAAOu6B,EAAOv6B,KAAI,GAIpD,WAGb,IAEJ5Q,EAACqB,cAAA8D,SACC,CAAAC,KAAK,IACL4C,QAAUpG,IACRgE,EAAUhE,GACV/B,EAAMsB,SAAS,IACV0V,EACH,CACEjG,GAAIu2B,OAEN,GACH,cAMT,CAEA,IAAI2G,GAAa,EACb5F,GAAS,EAOb,SAASwF,GAAejsB,GACtB,OAAOA,EAASqsB,IAClB,CASA,SAAS3G,KACP,MAAO,MAAQe,IACjB,CAUA,SAAS6F,GAA4B7c,GACnC,GAAKA,EAWL,OARAA,EAAMppB,SAAS8V,qBACTtW,EAAAsW,EAAKhN,yBAAIu7B,MAAM,eACjBjE,GAAS5S,KAAKzc,IAAIqvB,GAAQzgB,SAAS7J,EAAKhN,GAAG3C,UAAU,IAAM,aAEzD7G,EAAAwW,EAAK8rB,6BAAQyC,MAAM,aACrB2B,GAAaxY,KAAKzc,IAAIi1B,GAAYrmB,SAAS7J,EAAK8rB,OAAOz7B,UAAU,IAAM,GACxE,IAEIijB,EAAMzrB,KAAKmY,GACbnd,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAkd,IACHhN,GAAIgN,EAAKhN,IAAMu2B,KACfvpB,KAAMmwB,GAA4BnwB,EAAKA,MACvCstB,aAAc8C,GAA8BpwB,EAAKstB,iBAErD,CAEA,SAAS8C,GACPn3B,GAEA,GAAKA,EAGL,OAAOA,EAAQpR,KAAK0lC,GACf1qC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAyqC,IACHv6B,GAAIu6B,EAAOv6B,IAAMu2B,QAErB,CCtcA,MAAMv8B,GAAYC,EAAAA,cAAcS,IAAW,CACzCq6B,QAAS,CACPt2B,SAAU,WACV5D,OAAQ,gBACRvG,QAAS,oBACTyQ,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzC8T,aAAche,EAAMQ,OAAOuJ,GAC3BuwB,WAAY,gBAKVqI,GAAkB,CAAC,SAAU,MAAO,iBAAkB,UAAW,aAajEriC,GAA0C,CAC9Cod,WAAY,CAAEnR,aAAc,yBAC5B3K,SAAU,KACD,GAsIL,SAAUghC,GAA0BruC,GACxC,MAAMsuC,cAAEA,EAAa5rB,KAAEA,GAAS1iB,GAC1BsL,QAAEA,GAAYP,KACpB,OACE5K,EAAAqB,cAAC4J,EAAS,CAAA,cAAckjC,EAAcv9B,GAAIvF,UAAWF,EAAQw6B,SAC3D3lC,EAAAqB,cAAC0N,EAAAA,MAAK,CAACxN,QAAS,MACdvB,EAAAqB,cAACC,EAAAA,MAAK,CAAC+N,SAAS,SACdrP,EAAAqB,cAACkH,EAAUA,WAAA,CACTnE,MAAM,eAAc,cACP,uBAAuB+pC,EAAcv9B,KAClDjL,IAAK,uBAAuBwoC,EAAcv9B,KAC1CpI,KAAK,KACLR,QAAUpG,IACRgE,EAAUhE,GACV/B,EAAMuuC,cAAcD,EAAc,GAGpCnuC,EAACqB,cAAAuH,kBAAkB,QAGvB5I,EAACqB,cAAAgtC,GAA2B,CAAAF,cAAeA,EAAehtC,SAAUtB,EAAMsB,WAC1EnB,EAAAqB,cAACgS,EAAOA,QAAG,MACV86B,EAAcG,UAAU7oC,KAAK8oC,GAC5BvuC,EAAAqB,cAAC0N,EAAKA,MAAC,CAAApJ,IAAK,YAAY4oC,EAAS39B,KAAMrP,QAAS,MAC9CvB,EAAAqB,cAACC,EAAAA,MAAK,KACJtB,EAAAqB,cAACa,YAAS,CACRyD,IAAK,aAAa4oC,EAAS39B,mBACd,aAAa29B,EAAS39B,KACnC9P,aAAcytC,EAASC,UACvBx/B,MAAO,cACPxG,KAAM,KACNrH,SAAWS,IACTgE,EAAUhE,GACV/B,EAAMsB,SAASgtC,EAAcv9B,GAAEnQ,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAO6tC,GAAU,CAAAC,UAAW5sC,EAAEE,cAAc/B,MAAMwW,SAAS,IAG9FvW,EAAAqB,cAACkH,EAAUA,WAAA,CACTnE,MAAM,kBACNoE,KAAK,KACL7C,IAAK,mBAAmB4oC,EAAS39B,KAAI,cACxB,mBAAmB29B,EAAS39B,KACzC5I,QAAUpG,IACRgE,EAAUhE,GACV/B,EAAMknC,SAASoH,EAAcv9B,GAAI29B,EAAS,GAG5CvuC,EAACqB,cAAAuH,kBAAkB,QAIvB5I,EAAAqB,cAACohB,GACC,CAAAthB,SAAWosB,IACT1tB,EAAMsB,SAASgtC,EAAcv9B,GAAEnQ,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAO6tC,GAAQ,CAAEhhB,UAAQ,EAE1D5nB,IAAK,SAAS4oC,EAAS39B,KACvBnN,KAAM,SAAS8qC,EAAS39B,KACxB9P,aAAcytC,EAAShhB,WAI7BvtB,EAAAqB,cAACkH,EAAUA,WAAA,CACTnE,MAAM,eACNoE,KAAK,KACLR,QAAUpG,IACRgE,EAAUhE,GACV/B,EAAM4uC,MAAMN,EAAcv9B,GAAI,CAC5B2c,MAAO,CACL7K,IAAK,CAAEH,QACPI,KAAM,CAAEJ,UAEV,GAGJviB,EAAAqB,cAACwkB,EAAAA,eAAiB,QAK5B,CAUA,SAASwoB,GAA2BxuC,WAClC,MAAMsuC,cAAEA,EAAahtC,SAAEA,GAAatB,EAG/BsuC,EAAcnW,QAAQ0W,MACzBP,EAAcnW,QAAQ0W,IAAM,IAE9B,IAAK,MAAM/oC,IAAO,CAAC,MAAO,SACa,QAAhC2B,EAAA6mC,EAAcnW,QAAQ0W,IAAI/oC,UAAM,IAAA2B,OAAA,EAAAA,EAAAib,QACnC4rB,EAAcnW,QAAQ0W,IAAI/oC,GAAIlF,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACzBytC,EAAcnW,QAAQ0W,IAAI/oC,IAAI,CACjC4c,KAAM,QACNjM,OAAQ,+BAKd,OACEtW,EAACqB,cAAA0N,EAAKA,MAAC,CAAAzK,MAAO,CAAEC,SAAU,QACxBvE,EAAAqB,cAACC,EAAAA,MAAK,KACJtB,EAAAqB,cAACK,eAAY,CACXK,KAAM,CAAC,GAAI,OAAQ,UACnBiN,MAAM,UACNlO,aAAcqtC,EAAcnW,QAAQ2W,QAAU,GAC9CxtC,SAAWS,UACT,IAAK,MAAM2sC,KAAYJ,EAAcG,UAAW,CAC9C,IAAIM,EAA+C,QAAftnC,EAAA1F,EAAEE,qBAAa,IAAAwF,OAAA,EAAAA,EAAEvH,MACnC,KAAd6uC,IACFA,OAAY5rC,GAEd7B,EAASgtC,EAAcv9B,GAAEnQ,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACpB6tC,GAAQ,CACXI,OAAQC,IAEX,MAIP5uC,EAAAqB,cAACC,EAAAA,MAAK,CAACC,QAAS,MACdvB,EAAAqB,cAAC+N,EAAAA,KAAI,CAAC6E,UAAU,QAAQuI,QAAS,WAAW2xB,EAAcv9B,MAEnD,QACP5Q,EAAAqB,cAAA,MAAA,CAAKuP,GAAI,WAAWu9B,EAAcv9B,MAChC5Q,EAAAqB,cAACohB,GAAU,CACT9c,IAAK,OAAOwoC,EAAcv9B,KAC1BnN,KAAM,OAAO0qC,EAAcv9B,KAC3B9P,aAAcqtC,EAAcnW,QAAa,IACzC72B,SAAW0tC,IACT,IAAK,MAAMN,KAAYJ,EAAcG,UACnCntC,EAASgtC,EAAcv9B,GAAEnQ,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAO6tC,GAAQ,CAAEG,IAAKG,IAChD,MAKT7uC,EAAAqB,cAACK,EAAAA,aACC,CAAAK,KAAM,CAAC,GAAI,cAAe,aAAc,WAAY,SAAU,kBAC9DiN,MAAM,aACNlO,wBAAcqtC,EAAcnW,QAAQzc,8BAAS7X,OAAQ,GACrDvC,SAAWS,UACT,IAAK,MAAM2sC,KAAYJ,EAAcG,UAAW,CAC9C,IAAIQ,EAAkD,QAAfxnC,EAAA1F,EAAEE,qBAAa,IAAAwF,OAAA,EAAAA,EAAEvH,MACnC,KAAjB+uC,GACFA,OAAe9rC,EACf7B,EAASgtC,EAAcv9B,GAAEnQ,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAO6tC,GAAQ,CAAEhzB,aAASvY,MAEnD7B,EAASgtC,EAAcv9B,kCAClB29B,GAAQ,CACXhzB,QAAS,CACP7X,KAAMorC,EACNlvB,OAAQ,CACN,CAAEnH,KAAMq2B,EAAcx4B,OAAQ,oEAKvC,KAKX,CAuEA,SAASy4B,GAAiBR,WASxB,MARgB,CACd,UAAUA,EAASI,SACnB,OAAOz3B,EAAWA,YAACq3B,EAASG,OAC5B,kBAAkBx3B,EAAWA,YAACq3B,EAASS,kBACvC,WAA2B,UAAhBT,EAAShzB,eAAO,IAAAjU,OAAA,EAAAA,EAAE5D,OAC7B,qBAAa0D,EAAAmnC,EAASU,gCAAWxpC,KAAKypC,GAAMA,EAAExrC,OAAMkK,KAAK,QAG5CA,KAAK,IACtB,CC/YA,MAAMuhC,GAAqD,CACzDC,MAAO,OACPC,OAAQ,OACR,UAAW,SACXC,QAAS,MACTC,UAAW,QACX,mBAAoB,MACpBC,QAAS,OACTC,QAAS,OACTC,WAAY,OACZC,YAAa,OACbC,MAAO,QACPC,QAAS,SACTC,UAAW,MACXC,UAAW,OACXC,SAAU,OACVC,SAAU,OACVzlC,SAAU,MACVsH,MAAO,OACP,cAAe,OACfo+B,OAAQ,MACRC,SAAU,OACVC,QAAS,OACTC,OAAQ,OACRC,QAAS,OACTjmC,UAAW,QACXkmC,OAAQ,MACR,aAAc,OACdC,SAAU,OACVC,QAAS,OACTjgB,OAAQ,MACRD,KAAM,MACND,KAAM,OAOF,SAAUogB,GAAY7wC,GAC1B,OAAOG,gBAAC2wC,EAAKA,MAAA,CAAC7nC,MAAOqmC,GAActvC,EAAM8sB,SAAU9sB,EAAM8sB,OAC3D,CC1DgB,SAAAikB,GAAK3iB,EAAoBM,GAEvC,OA8FF,SAAwBsiB,EAAqBC,EAAgBC,GAC3D,MAAMC,EAAkB,GACxB,IAAI71B,EAA6B01B,EAE7B11B,EAAK81B,QACP91B,EAAOA,EAAK+1B,MAGd,KAAO/1B,GAAQA,EAAK+1B,MAAQ/1B,EAAK+1B,KAAKpV,GAAK,GAAG,CAC5C,MAAMnyB,EAAIwR,EAAKxR,EACTmyB,EAAI3gB,EAAK2gB,EAEf3gB,EAAOA,EAAK+1B,KACZ,MAAMC,EAAUh2B,EAAKxR,EACfynC,EAAUj2B,EAAK2gB,EAEf7N,EAAW,CACf5e,SAAU8hC,EACVE,MAAOP,EAAKpoC,MAAMyoC,EAASxnC,IAGvB4kB,EAAU,CACdlf,SAAU+hC,EACVC,MAAON,EAAIroC,MAAM0oC,EAAStV,IAG5B,IAAI95B,EAGFA,EAD4B,IAA1BisB,EAASojB,MAAMhxC,QAAgBkuB,EAAQ8iB,MAAMhxC,OAAS,EACjD,SACE4tB,EAASojB,MAAMhxC,OAAS,GAA8B,IAAzBkuB,EAAQ8iB,MAAMhxC,OAC7C,SAEA,SAGT2wC,EAAOxwC,KAAK,CAAEytB,WAAUM,UAASvsB,SAE7BmZ,EAAK81B,QACP91B,EAAOA,EAAK+1B,KAEf,CAED,OAAOF,CACT,CA1ISM,CAqBT,SAAmBR,EAAgBC,GACjC,MAAMQ,EAAIT,EAAKzwC,OACTmxC,EAAIT,EAAI1wC,OACRoxC,EAAMF,EAAIC,EAAI,EACdhpC,EAAO,EAAI,EAAIipC,EACfC,EAAUlpC,EAAO,EAAK,EACtBmpC,EAAqC,IAAI/pC,MAAMY,GAErDmpC,EAASD,EAAS,GAAK,CACrB/nC,EAAG,EACHmyB,GAAI,EACJoV,UAAMluC,EACNiuC,OAAO,GAGT,IAAK,IAAI1jC,EAAI,EAAGA,EAAIkkC,EAAKlkC,IAAK,CAC5B,IAAK,IAAIqkC,GAAKrkC,EAAGqkC,GAAKrkC,EAAGqkC,GAAK,EAAG,CAC/B,MAAMC,EAAUH,EAASE,EAEnBE,EAASD,EAAU,EACnBE,EAAYJ,EAFJE,EAAU,GAGlBG,EAAaL,EAASG,GAC5B,IAAIZ,EACAvnC,EAAI,EAEJioC,KAAOrkC,GAAMqkC,IAAMrkC,GAAKykC,EAAWroC,EAAIooC,EAAUpoC,GACnDA,EAAIooC,EAAUpoC,EACdunC,EAAOa,IAEPpoC,EAAIqoC,EAAWroC,EAAI,EACnBunC,EAAOc,GAGTL,EAASG,QAAU9uC,EAEnB,IAAI84B,EAAInyB,EAAIioC,EACRK,EAAO,CACTtoC,IACAmyB,IACAoV,KAAMgB,GAAchB,GACpBD,OAAO,GAMT,KAAOtnC,EAAI4nC,GAAKzV,EAAI0V,GAAKV,EAAKnnC,KAAOonC,EAAIjV,IACvCnyB,IACAmyB,IAcF,GAXInyB,EAAIsoC,EAAKtoC,IACXsoC,EAAO,CACLtoC,IACAmyB,IACAoV,KAAMe,EACNhB,OAAO,IAIXU,EAASE,GAAWI,EAEhBtoC,GAAK4nC,GAAKzV,GAAK0V,EACjB,OAAOG,EAASE,EAEnB,CACDF,EAASD,EAASnkC,EAAI,QAAKvK,CAC5B,CAGD,MACF,CA7FemvC,CAAUlkB,EAAUM,GACLN,EAAUM,EACxC,CA2IA,SAAS2jB,GAAcD,GACrB,OAAIA,IAASA,EAAKhB,OAASgB,EAAKf,KACvBe,EAAKf,KAEPe,CACT,CC9IM,SAAUG,GAAMphB,GAEpB,MAAMqhB,EAAYrhB,EAAQ9U,MACvBxO,QAAQwO,KAAYA,EAAMW,WAC1BpX,KAAKyW,UAAU,MAAC,CACfoT,aAAMhoB,EAAA4U,EAAMW,+BAAUyS,KACtB+hB,MAAOj5B,EAASA,UAAC8D,EAAMW,UAAU,GAAMsvB,MAAM,aAC7C,IACDrc,MAAK,CAACE,EAAGC,IAAOD,EAAEV,KAAKE,YAAuB8iB,cAAcriB,EAAEX,KAAKE,eAGhEvG,EAAoBopB,EAAS,GAAGhB,MAAM5rC,KAAKrF,IAAU,CACzDwQ,GAAIyhC,EAAS,GAAG/iB,KAAKoD,UACrBpD,KAAM+iB,EAAS,GAAG/iB,KAClBvvB,MAAOK,EACPmyC,KAAM,MAKR,OAQF,SAAyBtpB,EAAmBopB,GAC1C,IAAK,IAAI1oC,EAAI,EAAGA,EAAI0oC,EAAShyC,OAAQsJ,IAAK,CACxC,MAAM6oC,EAAY5B,GAAKyB,EAAS1oC,EAAI,GAAG0nC,MAAOgB,EAAS1oC,GAAG0nC,OAE1D,IAAK,MAAMoB,KAAYD,EAAW,CAChC,MAAMnjC,EAAWojC,EAASxkB,SAAS5e,SAC7BqjC,EAAWD,EAASxkB,SAASojB,MAC7BsB,EAAWF,EAASlkB,QAAQ8iB,MAOlC,GALsB,WAAlBoB,EAASzwC,MAAuC,WAAlBywC,EAASzwC,MAEzCinB,EAAMtgB,OAAO0G,EAAUqjC,EAASryC,QAGZ,WAAlBoyC,EAASzwC,MAAuC,WAAlBywC,EAASzwC,KAEzC,IAAK,IAAI4vC,EAAI,EAAGA,EAAIa,EAASlkB,QAAQ8iB,MAAMhxC,OAAQuxC,IACjD3oB,EAAMtgB,OAAO0G,EAAWuiC,EAAG,EAAG,CAC5BhhC,GAAIyhC,EAAS1oC,GAAG2lB,KAAKoD,UACrBpD,KAAM+iB,EAAS1oC,GAAG2lB,KAClBvvB,MAAO4yC,EAASf,GAChBW,KAAM,GAIb,CACF,CACH,CArCEK,CAAgB3pB,EAAOopB,GA2CzB,SAAsBppB,GACpB,IAAI/G,EAAQ,EACZ,KAAOA,EAAQ+G,EAAM5oB,QAAQ,CAC3B,IAAI4sC,EAAO/qB,EACX,KAAO+qB,EAAOhkB,EAAM5oB,QAAU4oB,EAAMgkB,GAAMr8B,KAAOqY,EAAM/G,GAAOtR,IAC5DqY,EAAMgkB,GAAMsF,MAAQ,EACpBtF,IAEFhkB,EAAM/G,GAAOqwB,KAAOtF,EAAO/qB,EAC3BA,EAAQ+qB,CACT,CACH,CArDE4F,CAAa5pB,GACNA,CACT,CCxBA,MAAMre,GAAYC,EAAAA,cAAcS,IAAW,CACzCwnC,UAAW,CACTC,UAAW,QAGbjoC,KAAM,CACJ6K,OAAQ,eAAerK,EAAMiK,OAAOC,KAAK,KACzCkQ,eAAgB,WAChB4D,aAAche,EAAMQ,OAAOuJ,GAC3B29B,cAAe,EACf7pB,SAAU7d,EAAM66B,UAAUzwB,GAC1B7Q,MAAO,OAEP,OAAQ,CACNK,QAAS,gBACTsoB,cAAe,MACfylB,WAAY,WAIhBC,SAAU,CACR59B,UAAW,eAAehK,EAAMiK,OAAOC,KAAK,MAG9C29B,UAAW,CACT79B,UAAW,GAGb9R,OAAQ,CACN0Q,WAAY,QAGdwF,SAAU,CACR05B,YAAa,eAAe9nC,EAAMiK,OAAOC,KAAK,KAC9CtB,WAAY,QAGdm/B,WAAY,CACVhqB,gBAAiB/d,EAAMiK,OAAOC,KAAK,GACnCG,OAAQ,EACR7M,MAAOwC,EAAMiK,OAAOC,KAAK,GACzB89B,WAAYhoC,EAAMioC,oBAClBruC,QAAS,GAAGoG,EAAM/J,QAAQmU,QAAQpK,EAAM/J,QAAQ8T,OAChDuQ,UAAW,SAGbxlB,KAAM,CACJkzC,WAAYhoC,EAAMioC,oBAClBpqB,SAAU7d,EAAM66B,UAAU9wB,GAC1BnQ,QAAS,GAAGoG,EAAM/J,QAAQmU,QAAQpK,EAAM/J,QAAQ8T,QAGlDm+B,IAAK,CACH/nC,OAAQ,OAyDZ,SAASgoC,GAAc52B,EAAoB6V,GACzC,MAAO,IAAI7V,EAAShF,gBAAgBgF,EAASjM,eAAe8hB,GAC9D,CAEM,SAAUghB,GAAclkB,GAC5B,MAAMmkB,EAAUre,KAAKC,OAAOzxB,KAAK8vC,MAAQ9vC,KAAKyd,MAAMiO,IAAgB,KAE9DqkB,EAAQve,KAAKC,MAAMoe,EAAU,SACnC,GAAIE,EAAQ,EACV,OAAOC,GAAcD,EAAO,QAG9B,MAAME,EAASze,KAAKC,MAAMoe,EAAU,QACpC,GAAII,EAAS,EACX,OAAOD,GAAcC,EAAQ,SAG/B,MAAMC,EAAO1e,KAAKC,MAAMoe,EAAU,OAClC,GAAIK,EAAO,EACT,OAAOF,GAAcE,EAAM,OAG7B,MAAMC,EAAQ3e,KAAKC,MAAMoe,EAAU,MACnC,GAAIM,EAAQ,EACV,OAAOH,GAAcG,EAAO,QAG9B,MAAMC,EAAU5e,KAAKC,MAAMoe,EAAU,IACrC,OAAIO,EAAU,EACLJ,GAAcI,EAAS,UAGzBJ,GAAcH,EAAS,SAChC,CAEA,SAASG,GAAc7Z,EAAeka,GACpC,MAAO,GAAGla,KAAmB,IAAVA,EAAcka,EAAOA,EAAO,SACjD,CCrJA,MAAMvpC,GAAYC,EAAAA,cAAcS,IAAW,CACzCmiB,QAAS,CACP3kB,MAAOwC,EAAMiK,OAAOsW,IAAI,GACxB6B,eAAgB,gBAGlBC,MAAO,CACL7kB,MAAOwC,EAAMiK,OAAOqY,MAAM,QA+B9B,SAASwmB,GAAWv0C,GAClB,MAAMsL,QAAEA,GAAYP,KACpB,OACE5K,EAAAqB,cAAArB,EAAAwH,SAAA,WAEExH,EAAMqB,cAAA,KAAA,MACLxB,EAAMoqB,MAAMgE,SAASojB,MAAMhxC,OAAS,GACnCL,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQsiB,SAAU5tB,EAAMoqB,MAAMgE,SAASojB,MAAMzjC,KAAK,OAEnE/N,EAAMoqB,MAAMsE,QAAQ8iB,MAAMhxC,OAAS,GAClCL,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQwiB,OAAQ9tB,EAAMoqB,MAAMsE,QAAQ8iB,MAAMzjC,KAAK,aAGjE5N,EAAMqB,cAAA,KAAA,MAGZ,CCPA,SAASgzC,GAAWx0C,aAClB,MAAMkT,SAAEA,EAAQ8J,SAAEA,GAAahd,EAAMqc,MACrC,OAAIW,EAEA7c,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACoqB,GAAa,CAAC1rB,MAAoB,UAAb8c,EAASyS,YAAI,IAAAhoB,OAAA,EAAAA,EAAE9D,OAAQ6U,MAAM,KAErDrY,EAAKqB,cAAA,KAAA,KAAAuY,EAAcA,eAAc,QAAbxS,EAAAyV,EAASyS,YAAI,IAAAloB,OAAA,EAAAA,EAAEooB,cACnCxvB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAACiW,GAAY,CAAAG,GAAIg8B,GAAc52B,IAA2B,UAAfA,EAASyS,YAAM,IAAAnoB,OAAA,EAAAA,EAAAurB,aAM9D1yB,EAAAqB,cAAA,KAAA,KACErB,EAAAqB,cAAA,KAAA,CAAIi7B,QAAS,GAAIpN,EAAAA,qBAAqBnc,aAAQ,EAARA,EAAU9L,UAIxD,CAEA,SAASwsC,GAAc52B,SACrB,MAAO,IAAIA,EAAShF,gBAAgBgF,EAASjM,eAA8B,QAAftJ,EAAAuV,EAASyS,YAAM,IAAAhoB,OAAA,EAAAA,EAAAorB,WAC7E,CCnEA,MAAM9nB,GAAYC,EAAAA,cAAcS,IAAW,CACzCwnC,UAAW,CACTrrC,QAAS,OACT7C,UAAW,KAGb0vC,KAAM,CACJC,SAAU,IACVrvC,QAAS,GACTkuC,YAAa,aAAa9nC,EAAMiK,OAAOC,KAAK,MAG9Cg/B,UAAW,CACTD,SAAU,IACVrvC,QAAS,QAwGb,SAASu+B,GAAS/Z,GAChB,OAAO+qB,GAAkB/qB,EAAMU,UACjC,CAEA,SAASsZ,GAAOha,GACd,OAAO+qB,GAAkB/qB,EAAMU,UAAY,QAC7C,CAEA,SAASqqB,GAAkB5wC,GACzB,OAAO,IAAIC,KAAKwxB,KAAKzc,IAAI/U,KAAK8vC,MAAO/vC,IAAOE,aAC9C,CAEA,SAAS2wC,GAAWv7B,GAClB,OAAOA,EAAK+H,mBAAmB,GAAI,CAAEyzB,KAAM,UAAWC,OAAQ,WAChE,ohBCtIM,SAAkC/0C,GACtC,OACEG,EAACqB,cAAAuvB,GACC,CAAA7wB,MAAOF,EAAMgd,SACbuU,oBAAsBvU,IAAwB,CAC5ChF,aAAc,SACd7V,KAAM,QACNka,MAAO,CACL,CACE24B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,GAAGwrB,EAAAA,mBAAmB9S,gBAG/B,CACEg4B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,qBAAqBwrB,EAAkBA,mBAAC9S,+BAO3D,iLCxBM,SAA4Bhd,GAChC,OACEG,EAACqB,cAAAuvB,GACC,CAAA7wB,MAAOF,EAAMk1C,UACb3jB,oBAAsBvU,IAAwB,CAC5ChF,aAAc,SACd7V,KAAM,QACNka,MAAO,CACL,CACE24B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,GAAGwrB,EAAAA,mBAAmB9S,gBAG/B,CACEg4B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,2BAA2BwrB,qBAAmB9S,OAGvD,CACEg4B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,mBAAmBwrB,qBAAmB9S,UAKnD8V,oBAAqB,CAAC9V,EAAqBgU,EAAyBntB,KAAkB,CACpFmU,aAAc,gBACd8U,OAAQ,YACRooB,UAAWnxC,EAAeA,gBAACiZ,GAC3ByP,QAASzP,EAASyP,QAClBuE,OAAQjtB,EAAeA,gBAACitB,GACxBJ,MAAM,IAAI3sB,MAAOC,cACjB4wB,QAAS,CAAC,CAAE/B,cAAelvB,MAE7BsvB,YAAa,CAACnW,EAAqB4b,EAA2B7D,KAAyB,CACrF/c,aAAc,QACd8U,OAAQ,YACRooB,UAAWnxC,EAAeA,gBAACiZ,GAC3ByP,QAASzP,EAASyP,QAClBmM,SAAU70B,EAAeA,gBAAC60B,GAC1B/L,QAAQ,IAAI5oB,MAAOC,cACnB6wB,aAIR,oMpGlCM,SAA0B/0B,GAC9B,MAAMuD,EAAUvD,EAAMuD,SAEfV,EAAOC,GAAY9B,WAAS,CACjCyC,QAASF,EAAQ0tB,aACjB9M,SAAS,IAGXtT,EAAAA,WAAU,KACR,SAASskC,IACPryC,EAAQlC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHgC,GAAK,CACRY,QAASF,EAAQ0tB,eAEpB,CAGD,OADA1tB,EAAQ6xC,iBAAiB,SAAUD,GAC5B,IAAM5xC,EAAQ8xC,qBAAqB,SAAUF,EAAc,GACjE,CAAC5xC,EAASV,IAEb,MAAMyyC,EACD10C,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAgC,GACH,CAAAU,YAGF,OAAOpD,EAACqB,cAAAyB,EAAasyC,SAAS,CAAAr1C,MAAOo1C,GAAiBt1C,EAAMsG,SAC9D,0GsF9BM,SAA0BtG,GAC9B,OACEG,EAACqB,cAAAuvB,GACC,CAAA7wB,MAAOF,EAAMw1C,QACbjkB,oBAAsBvU,IAAwB,CAC5ChF,aAAc,SACd7V,KAAM,QACNka,MAAOwpB,GAASjgC,KAAK41B,IAAY,CAC/BwZ,QAAS,CACPC,OAAQ,MACR3wC,IAAKk3B,EAAOL,WAAW,IAAKrL,EAAkBA,mBAAC9S,WAIrD8V,oBAAqB,CAAC9V,EAAmBgU,EAAyBntB,KAAkB,CAClFmU,aAAc,gBACd8U,OAAQ,YACRL,QAAS1oB,EAAeA,gBAACiZ,GACzBgU,OAAQjtB,EAAeA,gBAACitB,GACxBJ,MAAM,IAAI3sB,MAAOC,cACjB4wB,QAAS,CAAC,CAAE/B,cAAelvB,MAE7BsvB,YAAa,CAACnW,EAAmB4b,EAA2B7D,KAAyB,CACnF/c,aAAc,QACd8U,OAAQ,YACRL,QAAS1oB,EAAeA,gBAACiZ,GACzB4b,SAAU70B,EAAeA,gBAAC60B,GAC1B/L,QAAQ,IAAI5oB,MAAOC,cACnB6wB,aAIR,0BCAM,SAAgC/0B,GACpC,MAAMuD,EAAUD,IACVrC,EAAe8b,GAAY/c,EAAME,QAChC+tB,EAAQC,GAAaltB,EAAQA,cAAyCmC,IACtE2jC,EAAaC,GAAkB/lC,EAAQA,YACvCgmC,EAAUC,GAAejmC,EAAQA,YACjCd,EAAOa,GAAYC,EAAQA,WAElC,SAASy0C,IACPxO,OAAY9jC,EACb,CAED,SAASuyC,IACP3O,OAAe5jC,EAChB,CAED,MAAMjC,EAAWC,EAAAA,SAiBjB,GAhBAD,EAASK,QAAUrB,EAEnB2Q,EAAAA,WAAU,KACRtN,EAAQ4qB,cAAc,kBAAkBnnB,KAAKknB,GAAW/mB,MAAMwN,QAAQC,IAAI,GACzE,CAACrR,IAEJsN,EAAAA,WAAU,KAiZZ,IAAkC8kC,EA7Y9B,OAHA50C,GAgZ8B40C,EAhZI10C,QAAAA,EAAgB,CAAE+W,aAAc,kBAiZ7DpX,OACFC,OAAAD,OAAAC,OAAA,CAAA,EAAA80C,GACH,CAAAxjC,OAAQq2B,GAA+BmN,EAAexjC,YAlZtDtC,SAASulC,iBAAiB,YAAaK,GACvC5lC,SAASulC,iBAAiB,QAASM,GAC5B,KACL7lC,SAAS+lC,oBAAoB,YAAaH,GAC1C5lC,SAAS+lC,oBAAoB,QAASF,EAAoB,CAC3D,GACA,CAACz0C,KAECgtB,IAAW/tB,EACd,OAAO,KAGT,SAAS8nC,EAAetvB,EAAkBrX,GACxCN,EAASH,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACJK,EAASK,SAAO,CACnBmX,CAACA,GAAWrX,IAEf,CAED,OACElB,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAC2L,EAAK,CAAAC,OAAO,qBAAqBC,SAAU,IAAMrN,EAAMqN,SAASnN,IAC/DC,EAAAqB,cAACa,YAAS,CACR8M,MAAM,aACNlO,aAAcf,EAAMqE,MACpBjD,SAAWS,GAAMimC,EAAe,QAASjmC,EAAEE,cAAc/B,SAE3DC,EAAAqB,cAACglC,GACC,CAAAI,QAAS1mC,EAAMiS,QAAU,GACzB20B,YAAaA,EACbC,eAAgBA,EAChBC,SAAUA,EACVC,YAAaA,EACb3lC,SAAW2mC,GAAMD,EAAe,SAAUC,KAE5C9nC,EAACqB,cAAA4H,EAAAA,QAAOjH,KAAK,UAAsB,SAI3C,iEG5CM,SAA+BnC,GACnC,MAAMuD,EAAUD,IACVrC,EAAe8b,GAAY/c,EAAM6oC,gBAChC5a,EAAQC,GAAaltB,EAAQA,YAC7Bd,EAAOa,GAAYC,EAAQA,YAC3B8lC,EAAaC,GAAkB/lC,EAAQA,YACvCgmC,EAAUC,GAAejmC,EAAQA,WAExC,SAASy0C,IACPxO,OAAY9jC,EACb,CAED,SAASuyC,IACP3O,OAAe5jC,EAChB,CAgBD,OAdA0N,EAAAA,WAAU,KACRtN,EAAQ4qB,cAAc,iBAAiBnnB,KAAKknB,GAAW/mB,MAAMwN,QAAQC,IAAI,GACxE,CAACrR,IAEJsN,EAAAA,WAAU,KA+UZ,IAAiCg4B,EA3U7B,OAHA9nC,GA8U6B8nC,EA9UI5nC,QAAAA,EAAgB,CAAE+W,aAAc,iBA+U5DpX,OAAAC,OAAAD,OAAAC,OAAA,GACFgoC,GACH,CAAA93B,GAAI83B,EAAc93B,IAAMu2B,KACxBvpB,KAAMmwB,GAA4BrF,EAAc9qB,UAjVhDlO,SAASulC,iBAAiB,YAAaK,GACvC5lC,SAASulC,iBAAiB,QAASM,GAC5B,KACL7lC,SAAS+lC,oBAAoB,YAAaH,GAC1C5lC,SAAS+lC,oBAAoB,QAASF,EAAoB,CAC3D,GACA,CAACz0C,IAECgtB,GAAW/tB,EAKdC,EAAAqB,cAAA,MAAA,KACErB,EAAAqB,cAAC2L,EAAK,CAAAC,OAAO,qBAAqBC,SAAU,IAAMrN,EAAMqN,SAASnN,IAC/DC,EAACqB,cAAAsrC,GACC,CAAA/uB,KAAM7d,EACN4mC,YAAaA,EACbC,eAAgBA,EAChBC,SAAUA,EACVC,YAAaA,EACb3lC,SAAUP,IAEZZ,EAACqB,cAAA4H,EAAAA,QAAOjH,KAAK,UAAsB,UAdhC,IAkBX,uJC9EM,SAA+BnC,GAEnC,MAAM61C,GADN71C,EAAQY,OAAOC,OAAOkL,GAAc/L,IACJmpB,YAEzB2sB,EAAgBC,GAAqB/0C,EAAQA,SAAkB,KAC/Dg1C,EAASC,GAAcj1C,EAAQA,SAAC,IAChCk1C,EAAYC,GAAiBn1C,EAAQA,SAAC,GAO7C,OALA6P,EAAAA,WAAU,KACR,MAAMsY,EA0SV,SACEA,EACAgtB,GAEA,MAAM1H,EAAYtlB,EAAWitB,mBAAqB,GAElD,IAAI/N,EACF5S,KAAKzc,OACAy1B,EAAU7oC,KAAK8oC,UAChB,MAAMpG,EAAc1gB,UAAoB,UAAX8mB,EAAS39B,UAAE,IAAAtJ,OAAA,EAAAA,EAAE2G,UAAU,KAAM,IAC1D,OAAQm6B,MAAMD,GAA6B+N,OAAOC,kBAArBhO,CAAsC,KAEnE,EAED+N,OAAOE,SAASlO,KACnBA,EAAS,GAYX,OARAlf,EACKvoB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAsoB,GACH,CAAAitB,kBAAmB3H,EAAU7oC,KAAK8oC,GAAa9tC,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAC1C6tC,GAAQ,CACX39B,GAAI29B,EAAS39B,IAAM,MAAMs3B,UAG7B8N,EAAc9N,GACPlf,CACT,CAtUuBqtB,CAA4BX,EAAmBM,GAClEJ,EA2UJ,SACEtH,EACAwH,GAEA,IAAID,EAAU,EACd,MAAMS,EAAwC,CAAA,EAC9C,IAAK,MAAM/H,KAAYD,EAAW,CAChC,MAAMiI,EAAWxH,GAAiBR,GAC5BgI,KAAYD,IAChBA,EAAOC,GAAY,CACjB3lC,GAAI,YAAYilC,IAChB7d,QAASv3B,OAAO+1C,YAAYvI,GAAgBxoC,KAAK0yB,GAAM,CAACA,EAAGoW,EAASpW,OAIpEmW,UAAW,KAGfgI,EAAOC,GAAUjI,UAAU9tC,KAAK+tC,EACjC,CAED,OADAuH,EAAWD,GACJp1C,OAAO+E,OAAO8wC,EACvB,CAjWsBG,CAAwBztB,EAAWitB,mBAAqB,GAAIH,GAAY,GACzF,CAACJ,IAGF11C,EAACqB,cAAA2L,EAAK,CAAAC,OAAO,yBAAyBC,SAoCxC,WACE,MAAM+oC,EAAoBN,EACvBe,SAAS/M,GAAUA,EAAM2E,YACzB5gC,QAAQ6gC,IA6Uf,SAAyBA,eACvB,YAAsCvrC,KAAV,QAArBoE,EAAgB,QAAhBE,EAAAinC,EAAShhB,aAAO,IAAAjmB,OAAA,EAAAA,EAAAob,WAAK,IAAAtb,OAAA,EAAAA,EAAArH,aAAuDiD,KAAV,QAAtB6c,EAAgB,QAAhB1Y,EAAAonC,EAAShhB,aAAO,IAAApmB,OAAA,EAAAA,EAAAwb,YAAM,IAAA9C,OAAA,EAAAA,EAAA9f,MAC3E,CA/U6B42C,CAAgBpI,KACzC1uC,EAAMqN,SAAQzM,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAMg1C,GAAmB,CAAAO,sBACxC,GAxCGj2C,EAACqB,cAAA0N,aACE4mC,EAAelwC,KAAK0oC,UA8WN5rB,EA9WwB,OACrCviB,gBAACkuC,GAAyB,CACxB3rB,MA4WWA,EA5W8C,QAArCjb,EAAAouC,EAAkBkB,2BAAmB,IAAAtvC,OAAA,EAAAA,EAAEib,KA6W9DA,IAASs0B,EAAAA,gBAAgBt0B,EAAM,8BAAgCA,EAAK7e,OA5WjEvC,SAAU21C,EACVrI,MAAOsI,EACPhQ,SAAUiQ,EACV5I,cAAe6I,EACftxC,IAAK,SAASwoC,EAAcv9B,KAC5Bu9B,cAAeA,GAElB,KAEHnuC,EAAAqB,cAACkH,EAAUA,WAAA,CACTnE,MAAM,YACNoE,KAAK,KACLR,QAAUpG,IA8BhB,IAAkBs1C,EA7BVtxC,EAAUhE,GA6BAs1C,EA5BD,CAAEtmC,GAAI,YAAYilC,IAAW7d,QAAS,CAA8B,EAAEsW,UAAW,IA6BhGsH,GAAmBuB,GAAkB,IAAIA,EAAeD,KA5BlDpB,GAAYllC,GAAOA,EAAK,GAAE,GAG5B5Q,EAACqB,cAAAwkB,wBAGH7lB,EAAAqB,cAACC,EAAAA,MAAK,CAAC+N,SAAS,SACdrP,EAACqB,cAAA4H,EAAAA,QAAOjH,KAAK,UAAsB,UAwBzC,SAASi1C,EAAYG,GACnBxB,GAAmBuB,GAAkBA,EAAczpC,QAAQi8B,GAAUA,EAAM/4B,KAAOwmC,EAAaxmC,MAChG,CAKD,SAASkmC,EAAejB,EAAiBwB,GACvCzB,GAAmBU,YAEjB,MAAMgB,GADNhB,EAAS,IAAIA,IACeh3B,MAAMi4B,GAAMA,EAAE3mC,KAAOilC,IAE3C11C,EAA+B,QAAvBmH,EAAAgwC,aAAY,EAAZA,EAAchJ,iBAAS,IAAAhnC,OAAA,EAAAA,EAAEmtB,WAAW8Z,GAAaA,EAAS39B,KAAOymC,EAAgBzmC,KAI/F,YAHc5N,IAAV7C,IAA8C,QAAvBiH,EAAAkwC,aAAA,EAAAA,EAAchJ,iBAAS,IAAAlnC,OAAA,EAAAA,EAAGjH,MACnDm3C,EAAahJ,UAAUnuC,GAASk3C,GAE3Bf,CAAM,GAEhB,CAED,SAASS,EAAYlB,EAAiB2B,QACXx0C,IAArBw0C,EAAc5mC,KAChB4mC,EAAc5mC,GAAK,MAAMmlC,IACzBC,GAAeplC,GAAOA,EAAK,KAE7BglC,GAAmBU,IAEjB,MAAMmB,GADNnB,EAAS,IAAIA,IACoB7hB,WAAW8iB,GAAMA,EAAE3mC,KAAOilC,IAE3D,IAA0B,GAAtB4B,EAAyB,CAC3B,MAAMH,EAAoB72C,OAAAC,OAAA,CAAA,EAAA41C,EAAOmB,IACjCD,iCAAqBA,GAAkBF,EAAatf,SACpDsf,EAAahJ,UAAY,IAAIgJ,EAAahJ,UAAWkJ,GACrDlB,EAAOmB,GAAqBH,CAC7B,CAED,OAAOhB,CAAM,GAEhB,CAED,SAASU,EAAenB,EAAiB6B,GACvC9B,GAAmBU,IAEjB,MAAMgB,GADNhB,EAAS,IAAIA,IACeh3B,MAAMi4B,GAAMA,EAAE3mC,KAAOilC,IAIjD,OAHIyB,IACFA,EAAahJ,UAAYgJ,EAAahJ,UAAU5gC,QAAQ6gC,GAAaA,EAAS39B,KAAO8mC,EAAgB9mC,MAEhG0lC,CAAM,GAEhB,CACH,gDU5IM,SAAuBz2C,GAC3B,MAAMmC,KAAEA,EAAIsQ,UAAEA,EAAStC,eAAEA,EAAckC,iBAAEA,EAAgBylC,UAAEA,GAAc93C,EACnEuD,EAAUD,KACTqL,EAAOopC,GAAY/2C,EAAQA,cAAqBmC,IAChDiE,EAASmH,GAAcvN,EAAQA,WAYtC,SAASyN,EAAmByE,GACtBA,EAAS0F,KACXrV,EACGy0C,YAAY9kC,EAAS0F,MACrB5R,MAAK,IAAM8wC,MACX3wC,MAAMwN,QAAQC,KACR1B,EAASvE,OAClBopC,EAAS7kC,EAASvE,MAErB,CAED,OArBAkC,EAAAA,WAAU,KACK,YAAT1O,GAAsBwM,GACxBpL,EACG00C,gBAAgB,CAAEtpC,QAAO8D,UAAWA,IACpCzL,MAAMkM,GAAa3P,EAAQy0C,YAAY9kC,EAAS0F,QAChD5R,MAAK,IAAM8wC,MACX3wC,OAAO0H,GAAQN,EAAWM,IAC9B,GACA,CAACtL,EAASpB,EAAMsQ,EAAW9D,EAAOmpC,IAcnC33C,EAACqB,cAAAgL,EAAS,CAAAxH,MAAO,KACdoC,GAAWjH,EAAAqB,cAAA,MAAA,KAAMigB,KAAKlJ,UAAUnR,EAAS,KAAM,KAC9CuH,GACAxO,EAACqB,cAAA4Q,EACC,CAAAK,UAAWA,EACXtC,eAAgBA,EAChBkC,iBAAkBA,EAClB5D,mBAAoBA,GAEnBzO,EAAMsG,UAGVqI,GAAkB,YAATxM,GAAsBhC,EAAAqB,cAAC8M,EAAe,CAAAK,MAAOA,EAAOF,mBAAoBA,IAGxF,wBC5CM,SAA8BzO,SAClC,MAAMuD,EAAUD,IACV40C,EAAen7B,GAAY/c,EAAME,QAChCi4C,EAAgBC,GAAqBp3C,EAAQA,UAAC,IAC9Cq3C,EAAgBC,GAAqBt3C,EAAQA,WASpD,OAPA6P,EAAAA,WAAU,KACJqnC,IAAiBC,IACnB50C,EAAQmuB,aA6CZ,SAA2BsjB,SACzB,MAAMuD,EAAe,GACrB,GAAIvD,EAAQ7iC,OACV,IAAK,MAAMA,KAAU6iC,EAAQ7iC,QACR,UAAfA,EAAO6K,gBAAQ,IAAAvV,OAAA,EAAAA,EAAEyQ,YACnBqgC,EAAa53C,KAAK,CAAEq0C,QAAS,CAAEC,OAAQ,MAAO3wC,IAAK6N,EAAO6K,SAAS9E,aAKzE,MAAO,CACLF,aAAc,SACd7V,KAAM,QACNka,MAAOk8B,EAEV,CA5DwBC,CAAkBN,IAAelxC,KAAKsxC,GAAmBnxC,MAAMwN,QAAQC,KAC5FwjC,GAAkB,GACnB,GACA,CAAC70C,EAAS20C,EAAcC,IAEtBD,GAAiBG,EAKpBl4C,EAACqB,cAAAi3C,EAAIA,KACF,KAAqB,QAArBhxC,EAAAywC,EAAa/lC,cAAQ,IAAA1K,OAAA,EAAAA,EAAA7B,KAAI,CAACuM,EAAQ7R,qBACjC,MAAMo4C,EAAOvmC,EAAO6K,UAkD1B,SAA6C9E,GAC3C,IAAK,MAAMmE,KAASg8B,aAAA,EAAAA,EAAgBh8B,MAClC,GAAIA,EAAMW,UAAY9E,EAAUA,YAAc4X,qBAAmBzT,EAAMW,UACrE,OAAOX,EAAMW,SAGjB,MACD,CAzDqC27B,CAAgBxmC,EAAO6K,UACjD47B,EAA4B,QAAhBrxC,EAAc,QAAdE,EAAAixC,aAAI,EAAJA,EAAMn6B,aAAQ,IAAA9W,OAAA,EAAAA,EAAA,UAAE,IAAAF,OAAA,EAAAA,EAAEojC,eAC9BkO,EAA8B,QAAjB74B,EAAe,QAAf1Y,EAAAoxC,aAAI,EAAJA,EAAMI,cAAS,IAAAxxC,OAAA,EAAAA,EAAA,UAAE,IAAA0Y,OAAA,EAAAA,EAAE2qB,eACtC,OACExqC,EAACqB,cAAArB,EAAMwH,UAAS7B,IAAK,UAAUxF,KAC7BH,EAAAqB,cAACi3C,EAAAA,KAAKM,IAAI,CAAArG,KAAM,EAAGlpC,EAAE,MACD,eAAjBkvC,eAAAA,EAAM5rB,QAAyB3sB,EAAAqB,cAACw3C,EAAAA,aAAe,MAAG74C,gBAAC84C,EAAUA,WAAA,CAAChwC,MAAM,UAEvE9I,EAACqB,cAAAi3C,EAAAA,KAAKM,IAAI,CAAArG,KAAM,EAAGlpC,EAAE,MACnBrJ,EAACqB,cAAA+N,QAAKwF,OAAQ,KAAM5C,EAAO5N,OAC1B4N,EAAOyK,aAAezc,2BAAMgS,EAAOyK,aACpCzc,EAAAqB,cAAA,MAAA,uBAEErB,EAAAqB,cAACmqB,GAAY,CAACzrB,MAAiB,UAAVw4C,aAAI,EAAJA,EAAMjpB,YAAI,IAAAvP,OAAA,EAAAA,EAAEvc,gBAEhCoW,EAAcA,eAAW,QAAVkG,EAAAy4B,aAAI,EAAJA,EAAMjpB,YAAI,IAAAxP,OAAA,EAAAA,EAAE0P,cAE9BxvB,EAAAqB,cAAA,MAAA,gBACUrB,EAAAqB,cAACqvC,GAAY,CAAA/jB,QAAQ4rB,aAAA,EAAAA,EAAM5rB,SAAU,cAGjD3sB,EAACqB,cAAAi3C,EAAAA,KAAKM,IAAI,CAAArG,KAAM,EAAGlpC,EAAE,MAClBovC,IAAcC,GAAc14C,gBAACiJ,EAAMA,OAAA,CAACjB,QAAS,IAAMnI,EAAMk5C,QAAQR,EAAME,IAA0B,SACjGA,GAAaC,GACZ14C,EAAAqB,cAAC4H,EAAMA,OAAA,CAACjB,QAAS,IAAMnI,EAAMyyB,OAAOimB,EAAME,EAAWC,IAAW,SAItE,KAlCC,IAgEX,2GPvBM,SAAwB74C,WAC5B,MAAMsL,QAAEA,GAAYP,KACdxH,EAAUD,KACTpD,EAAOa,GAAYC,EAAAA,SAA6BhB,EAAMmxB,SAQ7D,GANAtgB,EAAAA,WAAU,MACH7Q,EAAMmxB,SAAWnxB,EAAMgY,cAAgBhY,EAAM+Q,IAChDxN,EAAQ41C,YAAYn5C,EAAMgY,aAAchY,EAAM+Q,IAAI/J,KAAKjG,GAAUoG,MAAMwN,QAAQC,IAChF,GACA,CAACrR,EAASvD,EAAMmxB,QAASnxB,EAAMgY,aAAchY,EAAM+Q,MAEjD7Q,EACH,OAAOC,yCAGT,MAAM6c,EAA6B,QAAlBzV,EAAW,QAAXE,EAAAvH,EAAMmc,aAAK,IAAA5U,OAAA,EAAAA,EAAG,UAAI,IAAAF,OAAA,EAAAA,EAAAyV,SAC7BoM,EAAQmpB,GAAMryC,GACpB,OACEC,EAAKqB,cAAA,MAAA,CAAAgK,UAAWF,EAAQ2nC,WACtB9yC,EAAAqB,cAAA,QAAA,CAAOgK,UAAWF,EAAQL,MACxB9K,EAAAqB,cAAA,QAAA,KACG4nB,EAAMxjB,KAAI,CAACilB,EAAKvqB,IACfH,EAAAqB,cAAA,KAAA,CAAIsE,IAAK,OAASxF,EAAOkL,UAAWqf,EAAI6nB,KAAO,EAAIpnC,EAAQ+nC,SAAW/nC,EAAQgoC,WAC3EzoB,EAAI6nB,KAAO,GACVvyC,EAAAqB,cAAArB,EAAAwH,SAAA,KACExH,EAAIqB,cAAA,KAAA,CAAAgK,UAAWF,EAAQ3H,OAAQy1C,QAASvuB,EAAI6nB,MAC1CvyC,EAAAqB,cAACoqB,GAAa,CAAC1rB,MAAO2qB,EAAI4E,KAAK9rB,OAAQ6U,MAAM,KAE/CrY,EAAIqB,cAAA,KAAA,CAAAgK,UAAWF,EAAQuO,SAAUu/B,QAASvuB,EAAI6nB,MAC5CvyC,EAACqB,cAAAiW,GAAY,CAAAG,GAAIg8B,GAAc52B,EAAU6N,EAAI4E,KAAKoD,YAC/CghB,GAAchpB,EAAI4E,KAAKE,gBAKhCxvB,EAAIqB,cAAA,KAAA,CAAAgK,UAAWF,EAAQkoC,YAAalzC,EAAQ,GAC5CH,EAAAqB,cAAA,KAAA,CAAIgK,UAAWF,EAAQ/K,MACrBJ,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQqoC,KAAM9oB,EAAI3qB,aAQlD,iBC7FM,SAAuBF,GAC3B,IAAIq5C,EAAmBr5C,EAAMouB,SACzBkrB,EAAkBt5C,EAAM0uB,QAExB1uB,EAAMu5C,aACRF,iCAAwBA,GAAgB,CAAE5pB,UAAMtsB,IAChDm2C,iCAAuBA,GAAe,CAAE7pB,UAAMtsB,KAGhD,MAEMguC,EAASJ,GAFEx4B,EAAAA,UAAU8gC,GAAkB,GAAM/M,MAAM,aACzC/zB,EAAAA,UAAU+gC,GAAiB,GAAMhN,MAAM,cAEvD,OACEnsC,EAAKqB,cAAA,MAAA,CAAAiD,MAAO,CAAEwE,MAAO,SAClBkoC,EAAOvrC,KAAI,CAACwkB,EAAO9pB,IAClBH,EAACqB,cAAA+yC,IAAWzuC,IAAK,QAAUxF,EAAO8pB,MAAOA,MAIjD,iBrD1BM,SAAuBpqB,GAC3B,MAAMuD,EAAUD,IACVrC,EAAe8b,GAAY/c,EAAMiB,eAChCgtB,EAAQC,GAAaltB,EAAQA,YAC7Bd,EAAOa,GAAYC,EAAQA,WASlC,OAPA6P,EAAAA,WAAU,KACJ5P,IACFF,EAAS0gB,KAAKC,MAAMD,KAAKlJ,UAAUtX,KACnCsC,EAAQ4qB,cAAcltB,EAAa+W,cAAchR,KAAKknB,GAAW/mB,MAAMwN,QAAQC,KAChF,GACA,CAACrR,EAAStC,IAERgtB,GAAW/tB,EAKdC,EAAAqB,cAAA,OAAA,CACEg4C,YAAU,EACV5lC,aAAa,MACbvG,SAAWtL,IACTA,EAAEiE,iBACEhG,EAAMqN,UACRrN,EAAMqN,SAASnN,EAChB,GAGHC,EAAAqB,cAAC0N,EAAAA,MAAK,CAAC+zB,GAAG,MACR9iC,EAAAqB,cAACqb,GAAW,CAACtY,MAAM,gBAAgBoY,QAAQ,eAAevV,QAASpH,EAAMoH,SACvEjH,EAAAqB,cAACa,YAAU,CAAAuB,KAAK,eAAe3C,aAAcf,EAAM8X,aAAc/K,UAAU,KAE7E9M,EAAAqB,cAACqb,GAAW,CAACtY,MAAM,KAAKoY,QAAQ,KAAKvV,QAASpH,EAAMoH,SAClDjH,EAAAqB,cAACa,YAAU,CAAAuB,KAAK,KAAK3C,aAAcf,EAAM6Q,GAAI9D,UAAU,MAG3D9M,EAACqB,cAAAwnB,IACCjN,SAAU7b,EAAM8X,aAChB/W,aAAcf,EACdkH,QAASpH,EAAMoH,QACf9F,SAAUP,IAEZZ,EAACqB,cAAAC,SAAM+N,SAAS,QAAQC,GAAG,MACzBtP,EAAAqB,cAAC4H,EAAMA,OAAA,CAACjH,KAAK,UAAoB,MAChCnC,EAAM0yB,UACLvyB,gBAACiJ,EAAMA,OAAA,CACLgiB,QAAQ,UACRniB,MAAM,MACN9G,KAAK,SACLgG,QAAS,KACNnI,EAAM0yB,SAA0CxyB,EAAM,GAIlD,YAxCRC,wCA6CX,yBsD7DM,SAA+BH,SACnC,MAAMuD,EAAUD,KACTpD,EAAOa,GAAYC,EAAAA,SAA6BhB,EAAMmxB,SAW7D,OATAtgB,EAAAA,WAAU,MACH7Q,EAAMmxB,SAAWnxB,EAAMgY,cAAgBhY,EAAM+Q,IAChDxN,EACG41C,YAAYn5C,EAAMgY,aAA8BhY,EAAM+Q,IACtD/J,KAAKjG,GACLoG,MAAMwN,QAAQC,IAClB,GACA,CAACrR,EAASvD,EAAMmxB,QAASnxB,EAAMgY,aAAchY,EAAM+Q,KAEjD7Q,EAKHC,EAACqB,cAAAsiC,EAAKA,MAAC,CAAA53B,cAAWutC,mBAAiB,GACjCt5C,EAAAqB,cAAA,QAAA,KACErB,EAAAqB,cAAA,KAAA,KACErB,EAAeqB,cAAA,KAAA,KAAA,UACfrB,EAAaqB,cAAA,KAAA,KAAA,QACbrB,EAAAqB,cAAA,KAAA,KAAA,aAGJrB,EAAAqB,cAAA,QAAA,aACGiG,EAAAvH,EAAMmc,4BAAOzW,KAAI,CAACyW,EAAO/b,IACxBH,EAAAqB,cAACgzC,GAAU,CAAC1uC,IAAK,SAAWxF,EAAO+b,MAAOA,QAdzClc,wCAmBX,oJCbM,SAAoBH,SACxB,MAAMsL,QAAEA,GAAYP,KACdxH,EAAUD,IACVo2C,EAAW38B,GAAY/c,EAAM05C,UAC7B7Q,EAAgB9rB,GAAY/c,EAAM6oC,gBAEjCje,EAAO+uB,GAAY34C,EAAQA,WACjBG,EAAAA,SACRI,QAAUqpB,EAEnB,MAAOf,EAAOI,GAAYjpB,EAAAA,SAAekpB,OAClC5Q,EAAM2R,GAAWjqB,EAAQA,YACzByqB,EAAMmuB,GAAW54C,EAAQA,YACzBkS,EAAUkyB,GAAepkC,EAAQA,WAsBxC,GApBA6P,EAAAA,WAAU,KACJ6oC,GACFC,EAAS,IACTp2C,EACGohB,gBACC,OACA,IAAIJ,gBAAgB,CAClB,CAAC,SAAU,KAAUnL,YACrB,CAAC,WAAY0W,qBAAmB4pB,IAChC,CAAC,QAAS,KAAO9V,GAAS/Z,IAC1B,CAAC,QAAS,KAAOga,GAAOha,OAG3B7iB,KAAK2yC,GACLxyC,MAAMwN,QAAQC,MAEjB+kC,OAASx2C,EACV,GACA,CAACI,EAASm2C,EAAU7vB,KAElB6vB,IAAa9uB,IAAUie,EAC1B,OAAO,KAGT,MAAMgR,EAAsB,QAAdpyC,EAAAiyC,EAASG,aAAK,IAAApyC,OAAA,EAAAA,EAAG,GAE/B,OACEtH,uBAAKqL,UAAWF,EAAQ2nC,wBAAuB,aAC7C9yC,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQmpC,MACrBoF,GAAS15C,EAACqB,cAAAwhB,GAAe,CAAA9iB,MAAO25C,EAAOlxC,KAAK,OAC5CkxC,GACC15C,EAAAqB,cAAC+N,EAAIA,KAAA,CAAC5G,KAAK,KAAKoM,OAAQ,KACtB5U,EAAAqB,cAACmqB,GAAa,CAAAzrB,MAAO25C,KAGzB15C,EAAaqB,cAAA,IAAA,KAAA,UACZ8X,GAAQnZ,EAAIqB,cAAA,IAAA,KAAA8X,EAAK8H,sBACjBqK,GAAQtrB,EAAAqB,cAAA,IAAA,KAAIqzC,GAAW,IAAI5wC,KAAKwnB,EAAKpJ,UAExCliB,EAAAqB,cAAA,MAAA,CAAKgK,UAAWF,EAAQqpC,YACpBr7B,GACAnZ,EAAAqB,cAAA,MAAA,KACErB,EAAoBqB,cAAA,KAAA,KAAA,eACpBrB,EAAAqB,cAACuoB,GAAa,CAACa,MAAOA,EAAOZ,cAAeC,EAAU9hB,QAAS8iB,KAGlE3R,IAASmS,GACRtrB,EAAAqB,cAAA,MAAA,KACErB,EAAoBqB,cAAA,KAAA,KAAA,eACpBrB,EAACqB,cAAA0N,aACE0b,EAAMhlB,KAAK0D,IACV,MAAMoiB,EAAY,IAAIznB,KAAKqF,EAAE+Y,OAC7B,OACEqJ,EAAUnB,UAAYjR,EAAKiR,WAC3BmB,EAAUnB,UAAYjR,EAAKiR,UAAY,OACrCpqB,uBAAK2F,IAAKwD,EAAEyH,IACV5Q,EAAAqB,cAAC4H,SAAM,CAACgiB,QAAQ,UAAU3mB,MAAO,CAAEO,MAAO,KAAOmD,QAAS,IAAMyxC,EAAQtwC,IACrEurC,GAAWnpB,IAIlB,MAKTpS,GAAQmS,IAASvY,GAChB/S,EAACqB,cAAAmnC,GAAkB,CAAAE,cAAeA,EAAeU,iBAAkB,OAAQl8B,SAAU+3B,IAEtF9rB,GAAQmS,GAAQvY,GACf/S,EAAAqB,cAAA,MAAA,KACErB,EAAwBqB,cAAA,KAAA,KAAA,mBACxBrB,EAAAqB,cAAA,IAAA,KAAA,6CAMZ,+JKtHM,SAAiCxB,GACrC,OACEG,EAACqB,cAAAuvB,GACC,CAAA7wB,MAAOF,EAAM85C,eACbvoB,oBAAsBvU,IAAwB,CAC5ChF,aAAc,SACd7V,KAAM,QACNka,MAAO,CACL,CACE24B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,GAAGwrB,EAAAA,mBAAmB9S,gBAG/B,CACEg4B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,0BAA0BwrB,EAAkBA,mBAAC9S,2BAGtD,CACEg4B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,6BAA6BwrB,EAAkBA,mBAAC9S,2BAGzD,CACEg4B,QAAS,CACPC,OAAQ,MACR3wC,IAAK,6BAA6BwrB,EAAkBA,mBAAC9S,8BAK7D8V,oBAAqB,CAAC9V,EAA0BgU,EAAyBntB,KAAkB,CACzFmU,aAAc,gBACd8U,OAAQ,YACRitB,QAAS,CAACh2C,kBAAgBiZ,IAC1ByP,QAASzP,EAASyP,QAClBuE,OAAQjtB,EAAeA,gBAACitB,GACxBJ,MAAM,IAAI3sB,MAAOC,cACjB4wB,QAAS,CAAC,CAAE/B,cAAelvB,MAE7BsvB,YAAa,CAACnW,EAA0B4b,EAA2B7D,KAAyB,CAC1F/c,aAAc,QACd8U,OAAQ,YACRitB,QAAS,CAACh2C,kBAAgBiZ,IAC1ByP,QAASzP,EAASyP,QAClBmM,SAAU70B,EAAeA,gBAAC60B,GAC1B/L,QAAQ,IAAI5oB,MAAOC,cACnB6wB,aAIR,eC5CM,SAAqB/0B,GACzB,MAAMg6C,aAAEA,EAAYlC,UAAEA,EAAS9jC,iBAAEA,EAAgBC,WAAEA,EAAUgmC,OAAEA,GAAgCj6C,EAArBkU,EAAgB7K,EAAKrJ,EAAzF,CAAA,eAAA,YAAA,mBAAA,aAAA,WACAuD,EAAUD,KACTqL,EAAOopC,GAAY/2C,EAAQA,cAAqBmC,IAChDoR,EAAa2lC,GAAkBl5C,EAAQA,cAAkCmC,GAEhF,SAASsL,EAAmByE,GACtBA,EAASvE,OACXopC,EAAS7kC,EAASvE,OAGhBuE,EAASqB,aACX2lC,EAAehnC,EAASqB,aAGtBrB,EAAS0F,OACPohC,EACFE,OAAe/2C,GAEfg3C,EAAWjnC,EAAS0F,MAGzB,CAED,SAASwhC,EAAoBlnC,GAC3BinC,EAAWjnC,EAAS0F,KACrB,CAED,SAASuhC,EAAWvhC,GACdqhC,EACFA,EAAOrhC,GAEPrV,EACGy0C,YAAYp/B,GACZ5R,MAAK,KACA8wC,GACFA,GACD,IAEF3wC,MAAMwN,QAAQC,IAEpB,CAED,OACEzU,EAACqB,cAAAgL,EAAS,CAAAxH,MAAO,KAER2J,EAYM4F,EACFpU,EAACqB,cAAA8S,EAAkB,CAAA3F,MAAOA,EAAO4F,YAAaA,EAAa9F,mBAAoBA,IACzD,QAApBzO,EAAMyS,UACRtS,EAAAqB,cAAC8M,EAAc,CAACK,MAAOA,EAAOF,mBAAoBA,IAChDzO,EAAMg6C,aACR75C,gBAAC8U,EAAe,CAACtG,MAAOA,EAAOuG,MAAOlV,EAAMkV,MAAOzG,mBAAoB2rC,IAEvEj6C,sCAjBLA,EAAAqB,cAACsS,EAAkBlT,OAAAC,OAAA,CACjBkT,cAAekmC,EACfjmC,iBAAkBA,EAClBC,WAAYA,EACZxF,mBAAoBA,GAChByF,GAEHlU,EAAMsG,UAerB,yG5B2DgB,SAAS6iB,EAA2BqP,GAClD,GAAIrP,EAAW0S,QAAU1S,EAAW0S,OAAOjqB,SAAS4mB,GAClD,OAAOrP,EAET,MAAM2S,EAAY,GAKlB,OAJI3S,EAAW0S,QACbC,EAAUn7B,QAAQwoB,EAAW0S,QAE/BC,EAAUn7B,KAAK63B,GAEV53B,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAsoB,IACH0S,OAAQC,EACRl4B,UAAMT,GAEV,oPA/DM,SAAuBgmB,GAC3B,OAAO+O,GAAW/O,EAAY,GAChC,siBAiSgB,SAAWA,EAA2BrjB,GACpD,IAAIy0B,GAAO,EAIX,OAHIC,GAAarR,KAAgBrjB,IAC/By0B,GAAQE,GAAiBtR,IAEpBmR,GAAQnR,EAAYrjB,EAAKy0B,EAClC"}