@signaltree/ng-forms 4.0.16 → 4.1.0
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.
- package/package.json +10 -2
- package/fesm2022/signaltree-ng-forms-src-audit.mjs +0 -20
- package/fesm2022/signaltree-ng-forms-src-audit.mjs.map +0 -1
- package/fesm2022/signaltree-ng-forms-src-history.mjs +0 -113
- package/fesm2022/signaltree-ng-forms-src-history.mjs.map +0 -1
- package/fesm2022/signaltree-ng-forms-src-rxjs.mjs +0 -21
- package/fesm2022/signaltree-ng-forms-src-rxjs.mjs.map +0 -1
- package/fesm2022/signaltree-ng-forms.mjs +0 -1064
- package/fesm2022/signaltree-ng-forms.mjs.map +0 -1
- package/index.d.ts +0 -128
- package/src/audit/index.d.ts +0 -15
- package/src/history/index.d.ts +0 -24
- package/src/rxjs/index.d.ts +0 -6
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/core/ng-forms.js","../tmp-esm2022/core/validators.js","../tmp-esm2022/core/async-validators.js","../tmp-esm2022/history/history.js"],"sourcesContent":["import { computed, DestroyRef, Directive, effect, ElementRef, EventEmitter, forwardRef, HostListener, inject, Input, isSignal, Output, Renderer2, signal, } from '@angular/core';\nimport { FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, } from '@angular/forms';\nimport { signalTree } from '@signaltree/core';\nimport { deepClone, matchPath, mergeDeep, parsePath } from '@signaltree/shared';\nimport { firstValueFrom, isObservable } from 'rxjs';\nimport * as i0 from \"@angular/core\";\nexport class FormValidationError extends Error {\n errors;\n asyncErrors;\n constructor(errors, asyncErrors) {\n super('Form validation failed');\n this.errors = errors;\n this.asyncErrors = asyncErrors;\n this.name = 'FormValidationError';\n }\n}\nconst SYNC_ERROR_KEY = 'signaltree';\nconst ASYNC_ERROR_KEY = 'signaltreeAsync';\nexport function createFormTree(initialValues, config = {}) {\n const { validators: baseValidators = {}, asyncValidators: baseAsyncValidators = {}, destroyRef: providedDestroyRef, fieldConfigs = {}, conditionals = [], persistKey, storage, persistDebounceMs = 100, validationBatchMs = 0, ...treeConfig } = config;\n const syncValidators = normalizeSyncValidators(baseValidators, fieldConfigs);\n const asyncValidators = normalizeAsyncValidators(baseAsyncValidators, fieldConfigs);\n const { values: hydratedInitialValues } = hydrateInitialValues(initialValues, persistKey, storage);\n const initialSnapshot = deepClone(hydratedInitialValues);\n const valuesTree = signalTree(hydratedInitialValues, treeConfig);\n assertTreeNode(valuesTree.state);\n const flattenedState = valuesTree.state;\n enhanceArraysRecursively(flattenedState);\n const formGroup = createAbstractControl(hydratedInitialValues, '', syncValidators, asyncValidators);\n const destroyRef = providedDestroyRef ?? tryInjectDestroyRef();\n const cleanupCallbacks = [];\n const errors = signal({}, ...(ngDevMode ? [{ debugName: \"errors\" }] : []));\n const asyncErrors = signal({}, ...(ngDevMode ? [{ debugName: \"asyncErrors\" }] : []));\n const touched = signal({}, ...(ngDevMode ? [{ debugName: \"touched\" }] : []));\n const asyncValidating = signal({}, ...(ngDevMode ? [{ debugName: \"asyncValidating\" }] : []));\n const dirty = signal(formGroup.dirty, ...(ngDevMode ? [{ debugName: \"dirty\" }] : []));\n const valid = signal(formGroup.valid && !formGroup.pending, ...(ngDevMode ? [{ debugName: \"valid\" }] : []));\n const submitting = signal(false, ...(ngDevMode ? [{ debugName: \"submitting\" }] : []));\n const refreshRunner = () => {\n const snapshot = collectControlSnapshot(formGroup);\n errors.set(snapshot.syncErrors);\n asyncErrors.set(snapshot.asyncErrors);\n touched.set(snapshot.touched);\n asyncValidating.set(snapshot.pending);\n dirty.set(formGroup.dirty);\n valid.set(formGroup.valid && !formGroup.pending);\n };\n let refreshTimer = null;\n const refreshAggregates = (immediate = false) => {\n if (immediate || validationBatchMs <= 0) {\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n refreshTimer = null;\n }\n refreshRunner();\n return;\n }\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n }\n refreshTimer = setTimeout(() => {\n refreshTimer = null;\n refreshRunner();\n }, validationBatchMs);\n };\n refreshAggregates(true);\n const persistController = createPersistController(formGroup, persistKey, storage, persistDebounceMs, cleanupCallbacks);\n persistController.persistImmediately();\n const fieldErrorKeys = new Set([\n ...Object.keys(syncValidators),\n ...Object.keys(asyncValidators),\n ]);\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n fieldErrorKeys.forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => errors()[fieldPath]);\n fieldAsyncErrors[fieldPath] = computed(() => asyncErrors()[fieldPath]);\n });\n const fieldConfigLookup = (path) => resolveFieldConfig(fieldConfigs, path);\n const connectControlRecursive = (control, path) => {\n if (control instanceof FormGroup) {\n Object.entries(control.controls).forEach(([key, child]) => {\n connectControlRecursive(child, joinPath(path, key));\n });\n return;\n }\n if (control instanceof FormArray) {\n const arraySignal = getSignalAtPath(flattenedState, path);\n if (arraySignal) {\n connectFormArrayAndSignal(control, arraySignal, path, syncValidators, asyncValidators, cleanupCallbacks, connectControlRecursive);\n }\n control.controls.forEach((child, index) => {\n connectControlRecursive(child, joinPath(path, String(index)));\n });\n return;\n }\n const signalAtPath = getSignalAtPath(flattenedState, path);\n if (signalAtPath) {\n connectControlAndSignal(control, signalAtPath, cleanupCallbacks, fieldConfigLookup(path));\n }\n };\n connectControlRecursive(formGroup, '');\n const conditionalState = new Map();\n const applyConditionals = conditionals.length > 0\n ? () => {\n const values = formGroup.getRawValue();\n conditionals.forEach(({ when, fields }) => {\n let visible = true;\n try {\n visible = when(values);\n }\n catch {\n visible = true;\n }\n fields.forEach((fieldPath) => {\n const control = formGroup.get(fieldPath);\n if (!control) {\n return;\n }\n const previous = conditionalState.get(fieldPath);\n if (previous === visible) {\n return;\n }\n conditionalState.set(fieldPath, visible);\n if (visible) {\n control.enable({ emitEvent: false });\n }\n else {\n control.disable({ emitEvent: false });\n }\n });\n });\n }\n : () => undefined;\n applyConditionals();\n const aggregateSubscriptions = [];\n aggregateSubscriptions.push(formGroup.valueChanges.subscribe(() => {\n refreshAggregates();\n persistController.schedulePersist();\n applyConditionals();\n }));\n aggregateSubscriptions.push(formGroup.statusChanges.subscribe(() => refreshAggregates()));\n if (formGroup.events) {\n aggregateSubscriptions.push(formGroup.events.subscribe(() => refreshAggregates()));\n }\n cleanupCallbacks.push(() => {\n aggregateSubscriptions.forEach((sub) => sub.unsubscribe());\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n }\n });\n if (destroyRef) {\n destroyRef.onDestroy(() => {\n cleanupCallbacks.splice(0).forEach((fn) => fn());\n });\n }\n const setValue = (field, value) => {\n const targetSignal = getSignalAtPath(flattenedState, field);\n const control = formGroup.get(field);\n if (targetSignal && 'set' in targetSignal) {\n targetSignal.set(value);\n }\n else if (control) {\n control.setValue(value, { emitEvent: true });\n }\n if (control) {\n const untypedControl = control;\n untypedControl.markAsTouched();\n untypedControl.markAsDirty();\n untypedControl.updateValueAndValidity({ emitEvent: true });\n }\n refreshAggregates(true);\n persistController.schedulePersist();\n };\n const setValues = (values) => {\n Object.entries(values).forEach(([key, value]) => {\n setValue(key, value);\n });\n };\n const reset = () => {\n formGroup.reset(initialSnapshot);\n submitting.set(false);\n refreshAggregates(true);\n persistController.persistImmediately();\n applyConditionals();\n };\n const validate = async (field) => {\n if (field) {\n const control = formGroup.get(field);\n if (!control) {\n return;\n }\n control.markAsTouched();\n control.updateValueAndValidity({ emitEvent: true });\n refreshAggregates(true);\n await waitForPending(control);\n refreshAggregates(true);\n return;\n }\n formGroup.markAllAsTouched();\n formGroup.updateValueAndValidity({ emitEvent: true });\n refreshAggregates(true);\n await waitForPending(formGroup);\n refreshAggregates(true);\n };\n const submit = async (submitFn) => {\n submitting.set(true);\n try {\n await validate();\n if (!valid()) {\n throw new FormValidationError(errors(), asyncErrors());\n }\n const currentValues = formGroup.getRawValue();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n submitting.set(false);\n refreshAggregates(true);\n }\n };\n const destroy = () => {\n cleanupCallbacks.splice(0).forEach((fn) => fn());\n };\n const formTree = {\n state: flattenedState,\n $: flattenedState,\n form: formGroup,\n errors,\n asyncErrors,\n touched,\n asyncValidating,\n dirty,\n valid,\n submitting,\n unwrap: () => valuesTree(),\n setValue,\n setValues,\n reset,\n submit,\n validate,\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => formGroup.get(field)?.touched ?? false),\n isFieldValid: (field) => computed(() => {\n const control = formGroup.get(field);\n return !!control && control.valid && !control.pending;\n }),\n isFieldAsyncValidating: (field) => computed(() => !!formGroup.get(field)?.pending),\n fieldErrors,\n fieldAsyncErrors,\n values: valuesTree,\n destroy,\n };\n return formTree;\n}\nexport function createVirtualFormArray(items, visibleRange, controlFactory = (value) => new FormControl(value)) {\n const start = Math.max(0, visibleRange.start);\n const end = Math.max(start, visibleRange.end);\n const controls = items\n .slice(start, end)\n .map((item, offset) => controlFactory(item, start + offset));\n return new FormArray(controls);\n}\nfunction enhanceArraysRecursively(obj, visited = new WeakSet()) {\n if (visited.has(obj)) {\n return;\n }\n visited.add(obj);\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n const signalValue = value();\n if (Array.isArray(signalValue)) {\n obj[key] = enhanceArray(value);\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n enhanceArraysRecursively(value, visited);\n }\n }\n}\nconst enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n };\n enhanced.move = (from, to) => {\n arraySignal.update((arr) => {\n const newArr = [...arr];\n const [item] = newArr.splice(from, 1);\n if (item !== undefined) {\n newArr.splice(to, 0, item);\n }\n return newArr;\n });\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n };\n return enhanced;\n};\nfunction getSignalAtPath(node, path) {\n if (!path) {\n return null;\n }\n const segments = parsePath(path);\n let current = node;\n for (const segment of segments) {\n if (!current || typeof current !== 'object') {\n return null;\n }\n current = current[segment];\n }\n if (isSignal(current)) {\n return current;\n }\n return null;\n}\nfunction joinPath(parent, segment) {\n return parent ? `${parent}.${segment}` : segment;\n}\nfunction wrapSyncValidator(validator) {\n return (control) => {\n const result = validator(control.value);\n return result ? { [SYNC_ERROR_KEY]: result } : null;\n };\n}\nfunction wrapAsyncValidator(validator) {\n return async (control) => {\n try {\n const maybeAsync = validator(control.value);\n const resolved = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n return resolved ? { [ASYNC_ERROR_KEY]: resolved } : null;\n }\n catch {\n return { [ASYNC_ERROR_KEY]: 'Validation error' };\n }\n };\n}\nfunction createAbstractControl(value, path, validators, asyncValidators) {\n const syncValidator = findValidator(validators, path);\n const asyncValidator = findValidator(asyncValidators, path);\n const syncFns = syncValidator\n ? [wrapSyncValidator(syncValidator)]\n : undefined;\n const asyncFns = asyncValidator\n ? [wrapAsyncValidator(asyncValidator)]\n : undefined;\n if (Array.isArray(value)) {\n const controls = value.map((item, index) => createAbstractControl(item, joinPath(path, String(index)), validators, asyncValidators));\n return new FormArray(controls, syncFns, asyncFns);\n }\n if (isPlainObject(value)) {\n const controls = {};\n for (const [key, child] of Object.entries(value)) {\n controls[key] = createAbstractControl(child, joinPath(path, key), validators, asyncValidators);\n }\n return new FormGroup(controls, {\n validators: syncFns,\n asyncValidators: asyncFns,\n });\n }\n return new FormControl(value, {\n validators: syncFns,\n asyncValidators: asyncFns,\n nonNullable: false,\n });\n}\nfunction connectControlAndSignal(control, valueSignal, cleanupCallbacks, fieldConfig) {\n const maybeConnect = control.connect;\n if (typeof maybeConnect === 'function') {\n try {\n const res = maybeConnect.call(control, valueSignal);\n if (res &&\n typeof res.unsubscribe === 'function') {\n cleanupCallbacks.push(() => res.unsubscribe());\n }\n return;\n }\n catch {\n }\n }\n let updatingFromControl = false;\n let updatingFromSignal = false;\n let versionCounter = 0;\n let lastControlVersion = 0;\n let controlDebounceTimer = null;\n const debounceMs = fieldConfig?.debounceMs ?? 0;\n const originalSet = valueSignal.set.bind(valueSignal);\n const originalUpdate = valueSignal.update.bind(valueSignal);\n const applyControlValue = (value) => {\n updatingFromSignal = true;\n if (!Object.is(control.value, value)) {\n const untypedControl = control;\n untypedControl.setValue(value, { emitEvent: true });\n untypedControl.markAsDirty();\n }\n updatingFromSignal = false;\n };\n valueSignal.set = (value) => {\n const currentVersion = ++versionCounter;\n originalSet(value);\n if (updatingFromControl) {\n return;\n }\n if (lastControlVersion > currentVersion) {\n return;\n }\n applyControlValue(value);\n };\n valueSignal.update = (updater) => {\n const next = updater(valueSignal());\n valueSignal.set(next);\n };\n const pushUpdateFromControl = (value) => {\n updatingFromControl = true;\n lastControlVersion = ++versionCounter;\n originalSet(value);\n updatingFromControl = false;\n };\n const handleControlChange = (value) => {\n if (updatingFromSignal) {\n return;\n }\n if (debounceMs > 0) {\n if (controlDebounceTimer) {\n clearTimeout(controlDebounceTimer);\n }\n controlDebounceTimer = setTimeout(() => {\n controlDebounceTimer = null;\n pushUpdateFromControl(value);\n }, debounceMs);\n return;\n }\n pushUpdateFromControl(value);\n };\n const subscription = control.valueChanges.subscribe((value) => {\n handleControlChange(value);\n });\n cleanupCallbacks.push(() => {\n subscription.unsubscribe();\n valueSignal.set = originalSet;\n valueSignal.update = originalUpdate;\n if (controlDebounceTimer) {\n clearTimeout(controlDebounceTimer);\n }\n });\n}\nfunction connectFormArrayAndSignal(formArray, arraySignal, path, validators, asyncValidators, cleanupCallbacks, connectControlRecursive) {\n const maybeConnect = formArray.connect;\n if (typeof maybeConnect === 'function') {\n try {\n const res = maybeConnect.call(formArray, arraySignal);\n if (res &&\n typeof res.unsubscribe === 'function') {\n cleanupCallbacks.push(() => res.unsubscribe());\n }\n return;\n }\n catch {\n }\n }\n let updatingFromControl = false;\n let updatingFromSignal = false;\n const originalSet = arraySignal.set.bind(arraySignal);\n const originalUpdate = arraySignal.update.bind(arraySignal);\n arraySignal.set = (value) => {\n originalSet(value);\n if (updatingFromControl) {\n return;\n }\n updatingFromSignal = true;\n syncFormArrayFromValue(formArray, value, path, validators, asyncValidators, connectControlRecursive);\n formArray.markAsDirty();\n updatingFromSignal = false;\n };\n arraySignal.update = (updater) => {\n const next = updater(arraySignal());\n arraySignal.set(next);\n };\n const subscription = formArray.valueChanges.subscribe((value) => {\n if (updatingFromSignal) {\n return;\n }\n updatingFromControl = true;\n originalSet(value);\n updatingFromControl = false;\n });\n cleanupCallbacks.push(() => {\n subscription.unsubscribe();\n arraySignal.set = originalSet;\n arraySignal.update = originalUpdate;\n });\n syncFormArrayFromValue(formArray, arraySignal(), path, validators, asyncValidators, connectControlRecursive);\n}\nfunction syncFormArrayFromValue(formArray, nextValue, path, validators, asyncValidators, connectControlRecursive) {\n if (!Array.isArray(nextValue)) {\n nextValue = [];\n }\n while (formArray.length > nextValue.length) {\n formArray.removeAt(formArray.length - 1);\n }\n nextValue.forEach((item, index) => {\n const childPath = joinPath(path, String(index));\n const existing = formArray.at(index);\n if (!existing) {\n const control = createAbstractControl(item, childPath, validators, asyncValidators);\n formArray.insert(index, control);\n connectControlRecursive(control, childPath);\n return;\n }\n if (existing instanceof FormArray) {\n syncFormArrayFromValue(existing, Array.isArray(item) ? item : [], childPath, validators, asyncValidators, connectControlRecursive);\n return;\n }\n if (existing instanceof FormGroup) {\n if (isPlainObject(item)) {\n existing.setValue(item, {\n emitEvent: false,\n });\n }\n return;\n }\n if (!Object.is(existing.value, item)) {\n const untypedExisting = existing;\n untypedExisting.setValue(item, { emitEvent: false });\n }\n });\n}\nfunction collectControlSnapshot(control) {\n const snapshot = {\n syncErrors: {},\n asyncErrors: {},\n touched: {},\n pending: {},\n };\n traverseControls(control, (currentPath, currentControl) => {\n if (!currentPath) {\n return;\n }\n if (currentControl.touched) {\n snapshot.touched[currentPath] = true;\n }\n if (currentControl.pending) {\n snapshot.pending[currentPath] = true;\n }\n const errors = currentControl.errors;\n if (!errors) {\n return;\n }\n const syncMessage = errors[SYNC_ERROR_KEY];\n if (typeof syncMessage === 'string') {\n snapshot.syncErrors[currentPath] = syncMessage;\n }\n const asyncMessage = errors[ASYNC_ERROR_KEY];\n if (typeof asyncMessage === 'string') {\n snapshot.asyncErrors[currentPath] = asyncMessage;\n }\n }, '');\n return snapshot;\n}\nfunction traverseControls(control, visitor, path = '') {\n visitor(path, control);\n if (control instanceof FormGroup) {\n Object.entries(control.controls).forEach(([key, child]) => {\n traverseControls(child, visitor, joinPath(path, key));\n });\n return;\n }\n if (control instanceof FormArray) {\n control.controls.forEach((child, index) => {\n traverseControls(child, visitor, joinPath(path, String(index)));\n });\n }\n}\nfunction waitForPending(control) {\n if (!control.pending) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const subscription = control.statusChanges.subscribe(() => {\n if (!control.pending) {\n subscription.unsubscribe();\n resolve();\n }\n });\n });\n}\nfunction isPlainObject(value) {\n return (!!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]');\n}\nfunction tryInjectDestroyRef() {\n try {\n return inject(DestroyRef);\n }\n catch {\n return null;\n }\n}\nfunction normalizeSyncValidators(base, fieldConfigs) {\n const buckets = new Map();\n for (const [path, validator] of Object.entries(base)) {\n const existing = buckets.get(path) ?? [];\n existing.push(validator);\n buckets.set(path, existing);\n }\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const validators = toValidatorArray(config.validators);\n if (validators.length === 0) {\n continue;\n }\n const existing = buckets.get(path) ?? [];\n existing.push(...validators);\n buckets.set(path, existing);\n }\n const normalized = {};\n buckets.forEach((validators, path) => {\n normalized[path] = (value) => {\n for (const validator of validators) {\n const result = validator(value);\n if (result) {\n return result;\n }\n }\n return null;\n };\n });\n return { ...base, ...normalized };\n}\nfunction normalizeAsyncValidators(base, fieldConfigs) {\n const buckets = new Map();\n for (const [path, validator] of Object.entries(base)) {\n const existing = buckets.get(path) ?? [];\n existing.push(validator);\n buckets.set(path, existing);\n }\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const validators = toValidatorArray(config.asyncValidators);\n if (validators.length === 0) {\n continue;\n }\n const existing = buckets.get(path) ?? [];\n existing.push(...validators);\n buckets.set(path, existing);\n }\n const normalized = {};\n buckets.forEach((validators, path) => {\n normalized[path] = async (value) => {\n for (const validator of validators) {\n const maybeAsync = validator(value);\n const result = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n if (result) {\n return result;\n }\n }\n return null;\n };\n });\n return { ...base, ...normalized };\n}\nfunction toValidatorArray(input) {\n if (!input) {\n return [];\n }\n if (Array.isArray(input)) {\n return input;\n }\n return Object.values(input);\n}\nfunction hydrateInitialValues(initialValues, persistKey, storage) {\n const baseClone = deepClone(initialValues);\n if (!persistKey || !storage) {\n return { values: baseClone };\n }\n try {\n const storedRaw = storage.getItem(persistKey);\n if (!storedRaw) {\n return { values: baseClone };\n }\n const parsed = JSON.parse(storedRaw);\n const merged = mergeDeep(baseClone, parsed);\n return { values: merged };\n }\n catch {\n return { values: baseClone };\n }\n}\nfunction assertTreeNode(state) {\n if (!state || typeof state !== 'object') {\n throw new Error('Invalid state structure for form tree');\n }\n}\nfunction resolveFieldConfig(fieldConfigs, path) {\n if (fieldConfigs[path]) {\n return fieldConfigs[path];\n }\n const keys = Object.keys(fieldConfigs);\n let match;\n for (const key of keys) {\n if (!key.includes('*')) {\n continue;\n }\n if (matchPath(key, path)) {\n if (!match || match.key.length < key.length) {\n match = { key, config: fieldConfigs[key] };\n }\n }\n }\n if (match) {\n return match.config;\n }\n return fieldConfigs['*'];\n}\nfunction findValidator(map, path) {\n if (map[path]) {\n return map[path];\n }\n let candidate;\n for (const key of Object.keys(map)) {\n if (!key.includes('*')) {\n continue;\n }\n if (matchPath(key, path)) {\n if (!candidate || candidate.key.length < key.length) {\n candidate = { key, value: map[key] };\n }\n }\n }\n if (candidate) {\n return candidate.value;\n }\n return map['*'];\n}\nfunction createPersistController(formGroup, persistKey, storage, debounceMs, cleanupCallbacks) {\n if (!persistKey || !storage) {\n return {\n schedulePersist: () => undefined,\n persistImmediately: () => undefined,\n };\n }\n let timer = null;\n const persist = () => {\n try {\n const payload = JSON.stringify(formGroup.getRawValue());\n storage.setItem(persistKey, payload);\n }\n catch {\n }\n };\n const schedulePersist = () => {\n if (debounceMs <= 0) {\n persist();\n return;\n }\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n timer = null;\n persist();\n }, debounceMs);\n };\n cleanupCallbacks.push(() => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n return {\n schedulePersist,\n persistImmediately: persist,\n };\n}\nexport class SignalValueDirective {\n signalTreeSignalValue;\n signalTreeSignalValueChange = new EventEmitter();\n elementRef = inject(ElementRef);\n renderer = inject(Renderer2);\n onChange = () => {\n };\n onTouched = () => {\n };\n ngOnInit() {\n effect(() => {\n const value = this.signalTreeSignalValue();\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n });\n }\n handleChange(event) {\n const target = event.target;\n const value = target?.value;\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n this.signalTreeSignalValueChange.emit(value);\n this.onChange(value);\n }\n }\n handleBlur() {\n this.onTouched();\n }\n writeValue(value) {\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n }\n }\n registerOnChange(fn) {\n this.onChange = fn;\n }\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled) {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.11\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.11\", type: SignalValueDirective, isStandalone: true, selector: \"[signalTreeSignalValue]\", inputs: { signalTreeSignalValue: \"signalTreeSignalValue\" }, outputs: { signalTreeSignalValueChange: \"signalTreeSignalValueChange\" }, host: { listeners: { \"input\": \"handleChange($event)\", \"change\": \"handleChange($event)\", \"blur\": \"handleBlur()\" } }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.11\", ngImport: i0, type: SignalValueDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[signalTreeSignalValue]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ],\n standalone: true,\n }]\n }], propDecorators: { signalTreeSignalValue: [{\n type: Input\n }], signalTreeSignalValueChange: [{\n type: Output\n }], handleChange: [{\n type: HostListener,\n args: ['input', ['$event']]\n }, {\n type: HostListener,\n args: ['change', ['$event']]\n }], handleBlur: [{\n type: HostListener,\n args: ['blur']\n }] } });\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvY29yZS9uZy1mb3Jtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsUUFBUSxFQUNSLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFFUixNQUFNLEVBQ04sU0FBUyxFQUVULE1BQU0sR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUgsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBNEIsTUFBTSxNQUFNLENBQUM7O0FBc0c5RSxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztJQUUxQjtJQUNBO0lBRmxCLFlBQ2tCLE1BQThCLEVBQzlCLFdBQW1DO1FBRW5ELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBSGhCLFdBQU0sR0FBTixNQUFNLENBQXdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUduRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQUtELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQVUxQyxNQUFNLFVBQVUsY0FBYyxDQUM1QixhQUFnQixFQUNoQixTQUE2QixFQUFFO0lBRS9CLE1BQU0sRUFD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QUM7O3NCQUNoQyxZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBV2pDLFlBQVk7dUJBQUMsTUFBTTs7QUFnQ3RCLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgY29tcHV0ZWQsXG4gICAgRGVzdHJveVJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgZWZmZWN0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBpc1NpZ25hbCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaWduYWwsXG4gICAgc2lnbmFsLFxuICAgIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIEFzeW5jVmFsaWRhdG9yRm4gYXMgQW5ndWxhckFzeW5jVmFsaWRhdG9yRm4sXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybUFycmF5LFxuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvckZuIGFzIEFuZ3VsYXJWYWxpZGF0b3JGbixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgc2lnbmFsVHJlZSB9IGZyb20gJ0BzaWduYWx0cmVlL2NvcmUnO1xuaW1wb3J0IHsgZGVlcENsb25lLCBtYXRjaFBhdGgsIG1lcmdlRGVlcCwgcGFyc2VQYXRoIH0gZnJvbSAnQHNpZ25hbHRyZWUvc2hhcmVkJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgQW5ndWxhciBGb3JtcyBJbnRlZ3JhdGlvbiBmb3IgU2lnbmFsVHJlZVxuICpcbiAqIFByb3ZpZGVzIGNvbXByZWhlbnNpdmUgQW5ndWxhciBmb3JtIGludGVncmF0aW9uIGluY2x1ZGluZyBGb3JtVHJlZSxcbiAqIGRpcmVjdGl2ZXMsIHZhbGlkYXRvcnMsIGVuaGFuY2VkIGFycmF5IG9wZXJhdGlvbnMsIGFuZCBSeEpTIGJyaWRnZS5cbiAqL1xuXG4vLyBSZS1leHBvcnQgY29yZSB0eXBlcyBuZWVkZWQgZm9yIGZvcm1zXG5pbXBvcnQgdHlwZSB7IFNpZ25hbFRyZWUsIFRyZWVDb25maWcsIFRyZWVOb2RlIH0gZnJvbSAnQHNpZ25hbHRyZWUvY29yZSc7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRk9STSBUUkVFIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBGb3JtVHJlZUFzeW5jVmFsaWRhdG9yRm48VD4gPSAoXG4gIHZhbHVlOiBUXG4pID0+IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gfCBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBFbmhhbmNlZEFycmF5U2lnbmFsPFQ+ID0gV3JpdGFibGVTaWduYWw8VFtdPiAmIHtcbiAgcHVzaDogKGl0ZW06IFQpID0+IHZvaWQ7XG4gIHJlbW92ZUF0OiAoaW5kZXg6IG51bWJlcikgPT4gdm9pZDtcbiAgc2V0QXQ6IChpbmRleDogbnVtYmVyLCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgaW5zZXJ0QXQ6IChpbmRleDogbnVtYmVyLCBpdGVtOiBUKSA9PiB2b2lkO1xuICBtb3ZlOiAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSA9PiB2b2lkO1xuICBjbGVhcjogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIEZpZWxkVmFsaWRhdG9yID0gKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkQ29uZmlnIHtcbiAgZGVib3VuY2VNcz86IG51bWJlcjtcbiAgdmFsaWRhdG9ycz86IFJlY29yZDxzdHJpbmcsIEZpZWxkVmFsaWRhdG9yPiB8IEZpZWxkVmFsaWRhdG9yW107XG4gIGFzeW5jVmFsaWRhdG9ycz86XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBGb3JtVHJlZUFzeW5jVmFsaWRhdG9yRm48dW5rbm93bj4+XG4gICAgfCBBcnJheTxGb3JtVHJlZUFzeW5jVmFsaWRhdG9yRm48dW5rbm93bj4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsRmllbGQ8VD4ge1xuICB3aGVuOiAodmFsdWVzOiBUKSA9PiBib29sZWFuO1xuICBmaWVsZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UcmVlT3B0aW9uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIGV4dGVuZHMgVHJlZUNvbmZpZyB7XG4gIHZhbGlkYXRvcnM/OiBTeW5jVmFsaWRhdG9yTWFwO1xuICBhc3luY1ZhbGlkYXRvcnM/OiBBc3luY1ZhbGlkYXRvck1hcDtcbiAgZGVzdHJveVJlZj86IERlc3Ryb3lSZWY7XG4gIGZpZWxkQ29uZmlncz86IFJlY29yZDxzdHJpbmcsIEZpZWxkQ29uZmlnPjtcbiAgY29uZGl0aW9uYWxzPzogQXJyYXk8Q29uZGl0aW9uYWxGaWVsZDxUPj47XG4gIHBlcnNpc3RLZXk/OiBzdHJpbmc7XG4gIHN0b3JhZ2U/OiBQaWNrPFN0b3JhZ2UsICdnZXRJdGVtJyB8ICdzZXRJdGVtJyB8ICdyZW1vdmVJdGVtJz47XG4gIHBlcnNpc3REZWJvdW5jZU1zPzogbnVtYmVyO1xuICB2YWxpZGF0aW9uQmF0Y2hNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGb3JtIHRyZWUgdHlwZSB0aGF0IGZsYXR0ZW5zIHRoZSBzdGF0ZSBhY2Nlc3Mgd2hpbGUgbWFpbnRhaW5pbmcgZm9ybS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIEZvcm1UcmVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7XG4gIC8vIEZsYXR0ZW5lZCBzdGF0ZSBhY2Nlc3MgLSBkaXJlY3QgYWNjZXNzIHRvIGZvcm0gdmFsdWVzIGFzIHNpZ25hbHNcbiAgc3RhdGU6IFRyZWVOb2RlPFQ+O1xuICAkOiBUcmVlTm9kZTxUPjsgLy8gQWxpYXMgZm9yIHN0YXRlXG5cbiAgLy8gVW5kZXJseWluZyBBbmd1bGFyIGZvcm0gc3RydWN0dXJlXG4gIGZvcm06IEZvcm1Hcm91cDtcblxuICAvLyBGb3JtLXNwZWNpZmljIHNpZ25hbHNcbiAgZXJyb3JzOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgYXN5bmNFcnJvcnM6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICB0b3VjaGVkOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj47XG4gIGFzeW5jVmFsaWRhdGluZzogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+O1xuICBkaXJ0eTogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG4gIHZhbGlkOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcbiAgc3VibWl0dGluZzogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG5cbiAgLy8gRm9ybSBtZXRob2RzXG4gIHVud3JhcCgpOiBUO1xuICBzZXRWYWx1ZShmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIHNldFZhbHVlcyh2YWx1ZXM6IFBhcnRpYWw8VD4pOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICBzdWJtaXQ8VFJlc3VsdD4oc3VibWl0Rm46ICh2YWx1ZXM6IFQpID0+IFByb21pc2U8VFJlc3VsdD4pOiBQcm9taXNlPFRSZXN1bHQ+O1xuICB2YWxpZGF0ZShmaWVsZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gRmllbGQtbGV2ZWwgaGVscGVyc1xuICBnZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgZ2V0RmllbGRBc3luY0Vycm9yKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgZ2V0RmllbGRUb3VjaGVkKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG4gIGlzRmllbGRWYWxpZChmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4+O1xuICBpc0ZpZWxkQXN5bmNWYWxpZGF0aW5nKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG5cbiAgLy8gRGlyZWN0IGFjY2VzcyB0byBmaWVsZCBlcnJvcnNcbiAgZmllbGRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PjtcbiAgZmllbGRBc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuXG4gIC8vIEtlZXAgdmFsdWVzIHRyZWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgdmFsdWVzOiBTaWduYWxUcmVlPFQ+O1xuXG4gIC8vIENsZWFudXAgaGVscGVycyB0byB0ZWFyIGRvd24gc3Vic2NyaXB0aW9ucyBjcmVhdGVkIGZvciBicmlkZ2UgbGF5ZXJcbiAgZGVzdHJveSgpOiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIEZvcm1WYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHVibGljIHJlYWRvbmx5IGFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICkge1xuICAgIHN1cGVyKCdGb3JtIHZhbGlkYXRpb24gZmFpbGVkJyk7XG4gICAgdGhpcy5uYW1lID0gJ0Zvcm1WYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbnR5cGUgU3luY1ZhbGlkYXRvck1hcCA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbD47XG50eXBlIEFzeW5jVmFsaWRhdG9yTWFwID0gUmVjb3JkPHN0cmluZywgRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+PjtcblxuY29uc3QgU1lOQ19FUlJPUl9LRVkgPSAnc2lnbmFsdHJlZSc7XG5jb25zdCBBU1lOQ19FUlJPUl9LRVkgPSAnc2lnbmFsdHJlZUFzeW5jJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVUSUxJVFkgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRk9STSBUUkVFIElNUExFTUVOVEFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybVRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgaW5pdGlhbFZhbHVlczogVCxcbiAgY29uZmlnOiBGb3JtVHJlZU9wdGlvbnM8VD4gPSB7fVxuKTogRm9ybVRyZWU8VD4ge1xuICBjb25zdCB7XG4gICAgdmFsaWRhdG9yczogYmFzZVZhbGlkYXRvcnMgPSB7fSxcbiAgICBhc3luY1ZhbGlkYXRvcnM6IGJhc2VBc3luY1ZhbGlkYXRvcnMgPSB7fSxcbiAgICBkZXN0cm95UmVmOiBwcm92aWRlZERlc3Ryb3lSZWYsXG4gICAgZmllbGRDb25maWdzID0ge30sXG4gICAgY29uZGl0aW9uYWxzID0gW10sXG4gICAgcGVyc2lzdEtleSxcbiAgICBzdG9yYWdlLFxuICAgIHBlcnNpc3REZWJvdW5jZU1zID0gMTAwLFxuICAgIHZhbGlkYXRpb25CYXRjaE1zID0gMCxcbiAgICAuLi50cmVlQ29uZmlnXG4gIH0gPSBjb25maWc7XG5cbiAgY29uc3Qgc3luY1ZhbGlkYXRvcnMgPSBub3JtYWxpemVTeW5jVmFsaWRhdG9ycyhiYXNlVmFsaWRhdG9ycywgZmllbGRDb25maWdzKTtcbiAgY29uc3QgYXN5bmNWYWxpZGF0b3JzID0gbm9ybWFsaXplQXN5bmNWYWxpZGF0b3JzKFxuICAgIGJhc2VBc3luY1ZhbGlkYXRvcnMsXG4gICAgZmllbGRDb25maWdzXG4gICk7XG5cbiAgY29uc3QgeyB2YWx1ZXM6IGh5ZHJhdGVkSW5pdGlhbFZhbHVlcyB9ID0gaHlkcmF0ZUluaXRpYWxWYWx1ZXMoXG4gICAgaW5pdGlhbFZhbHVlcyxcbiAgICBwZXJzaXN0S2V5LFxuICAgIHN0b3JhZ2VcbiAgKTtcbiAgY29uc3QgaW5pdGlhbFNuYXBzaG90ID0gZGVlcENsb25lKGh5ZHJhdGVkSW5pdGlhbFZhbHVlcyk7XG5cbiAgY29uc3QgdmFsdWVzVHJlZSA9IHNpZ25hbFRyZWUoaHlkcmF0ZWRJbml0aWFsVmFsdWVzLCB0cmVlQ29uZmlnKTtcbiAgYXNzZXJ0VHJlZU5vZGU8VD4odmFsdWVzVHJlZS5zdGF0ZSk7XG4gIGNvbnN0IGZsYXR0ZW5lZFN0YXRlID0gdmFsdWVzVHJlZS5zdGF0ZTtcblxuICBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkoXG4gICAgZmxhdHRlbmVkU3RhdGUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApO1xuXG4gIGNvbnN0IGZvcm1Hcm91cCA9IGNyZWF0ZUFic3RyYWN0Q29udHJvbChcbiAgICBoeWRyYXRlZEluaXRpYWxWYWx1ZXMsXG4gICAgJycsXG4gICAgc3luY1ZhbGlkYXRvcnMsXG4gICAgYXN5bmNWYWxpZGF0b3JzXG4gICkgYXMgRm9ybUdyb3VwO1xuXG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBwcm92aWRlZERlc3Ryb3lSZWYgPz8gdHJ5SW5qZWN0RGVzdHJveVJlZigpO1xuICBjb25zdCBjbGVhbnVwQ2FsbGJhY2tzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIGNvbnN0IGVycm9ycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSk7XG4gIGNvbnN0IGFzeW5jRXJyb3JzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KTtcbiAgY29uc3QgdG91Y2hlZCA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pO1xuICBjb25zdCBhc3luY1ZhbGlkYXRpbmcgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KTtcbiAgY29uc3QgZGlydHkgPSBzaWduYWwoZm9ybUdyb3VwLmRpcnR5KTtcbiAgY29uc3QgdmFsaWQgPSBzaWduYWwoZm9ybUdyb3VwLnZhbGlkICYmICFmb3JtR3JvdXAucGVuZGluZyk7XG4gIGNvbnN0IHN1Ym1pdHRpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gIGNvbnN0IHJlZnJlc2hSdW5uZXIgPSAoKSA9PiB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBjb2xsZWN0Q29udHJvbFNuYXBzaG90KGZvcm1Hcm91cCk7XG4gICAgZXJyb3JzLnNldChzbmFwc2hvdC5zeW5jRXJyb3JzKTtcbiAgICBhc3luY0Vycm9ycy5zZXQoc25hcHNob3QuYXN5bmNFcnJvcnMpO1xuICAgIHRvdWNoZWQuc2V0KHNuYXBzaG90LnRvdWNoZWQpO1xuICAgIGFzeW5jVmFsaWRhdGluZy5zZXQoc25hcHNob3QucGVuZGluZyk7XG4gICAgZGlydHkuc2V0KGZvcm1Hcm91cC5kaXJ0eSk7XG4gICAgdmFsaWQuc2V0KGZvcm1Hcm91cC52YWxpZCAmJiAhZm9ybUdyb3VwLnBlbmRpbmcpO1xuICB9O1xuXG4gIGxldCByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJlZnJlc2hBZ2dyZWdhdGVzID0gKGltbWVkaWF0ZSA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKGltbWVkaWF0ZSB8fCB2YWxpZGF0aW9uQmF0Y2hNcyA8PSAwKSB7XG4gICAgICBpZiAocmVmcmVzaFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChyZWZyZXNoVGltZXIpO1xuICAgICAgICByZWZyZXNoVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmVmcmVzaFJ1bm5lcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChyZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChyZWZyZXNoVGltZXIpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICAgIHJlZnJlc2hSdW5uZXIoKTtcbiAgICB9LCB2YWxpZGF0aW9uQmF0Y2hNcyk7XG4gIH07XG5cbiAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG5cbiAgY29uc3QgcGVyc2lzdENvbnRyb2xsZXIgPSBjcmVhdGVQZXJzaXN0Q29udHJvbGxlcihcbiAgICBmb3JtR3JvdXAsXG4gICAgcGVyc2lzdEtleSxcbiAgICBzdG9yYWdlLFxuICAgIHBlcnNpc3REZWJvdW5jZU1zLFxuICAgIGNsZWFudXBDYWxsYmFja3NcbiAgKTtcbiAgcGVyc2lzdENvbnRyb2xsZXIucGVyc2lzdEltbWVkaWF0ZWx5KCk7XG5cbiAgY29uc3QgZmllbGRFcnJvcktleXMgPSBuZXcgU2V0KFtcbiAgICAuLi5PYmplY3Qua2V5cyhzeW5jVmFsaWRhdG9ycyksXG4gICAgLi4uT2JqZWN0LmtleXMoYXN5bmNWYWxpZGF0b3JzKSxcbiAgXSk7XG5cbiAgY29uc3QgZmllbGRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHt9O1xuICBjb25zdCBmaWVsZEFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj4gPSB7fTtcblxuICBmaWVsZEVycm9yS2V5cy5mb3JFYWNoKChmaWVsZFBhdGgpID0+IHtcbiAgICBmaWVsZEVycm9yc1tmaWVsZFBhdGhdID0gY29tcHV0ZWQoKCkgPT4gZXJyb3JzKClbZmllbGRQYXRoXSk7XG4gICAgZmllbGRBc3luY0Vycm9yc1tmaWVsZFBhdGhdID0gY29tcHV0ZWQoKCkgPT4gYXN5bmNFcnJvcnMoKVtmaWVsZFBhdGhdKTtcbiAgfSk7XG5cbiAgY29uc3QgZmllbGRDb25maWdMb29rdXAgPSAocGF0aDogc3RyaW5nKSA9PlxuICAgIHJlc29sdmVGaWVsZENvbmZpZyhmaWVsZENvbmZpZ3MsIHBhdGgpO1xuXG4gIGNvbnN0IGNvbm5lY3RDb250cm9sUmVjdXJzaXZlID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goKFtrZXksIGNoaWxkXSkgPT4ge1xuICAgICAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZShjaGlsZCwgam9pblBhdGgocGF0aCwga2V5KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgY29uc3QgYXJyYXlTaWduYWwgPSBnZXRTaWduYWxBdFBhdGgoZmxhdHRlbmVkU3RhdGUsIHBhdGgpO1xuICAgICAgaWYgKGFycmF5U2lnbmFsKSB7XG4gICAgICAgIGNvbm5lY3RGb3JtQXJyYXlBbmRTaWduYWwoXG4gICAgICAgICAgY29udHJvbCxcbiAgICAgICAgICBhcnJheVNpZ25hbCBhcyBFbmhhbmNlZEFycmF5U2lnbmFsPHVua25vd24+LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgc3luY1ZhbGlkYXRvcnMsXG4gICAgICAgICAgYXN5bmNWYWxpZGF0b3JzLFxuICAgICAgICAgIGNsZWFudXBDYWxsYmFja3MsXG4gICAgICAgICAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmUoY2hpbGQsIGpvaW5QYXRoKHBhdGgsIFN0cmluZyhpbmRleCkpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25hbEF0UGF0aCA9IGdldFNpZ25hbEF0UGF0aChmbGF0dGVuZWRTdGF0ZSwgcGF0aCk7XG4gICAgaWYgKHNpZ25hbEF0UGF0aCkge1xuICAgICAgY29ubmVjdENvbnRyb2xBbmRTaWduYWwoXG4gICAgICAgIGNvbnRyb2wgYXMgRm9ybUNvbnRyb2wsXG4gICAgICAgIHNpZ25hbEF0UGF0aCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPixcbiAgICAgICAgY2xlYW51cENhbGxiYWNrcyxcbiAgICAgICAgZmllbGRDb25maWdMb29rdXAocGF0aClcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlKGZvcm1Hcm91cCwgJycpO1xuXG4gIGNvbnN0IGNvbmRpdGlvbmFsU3RhdGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgY29uc3QgYXBwbHlDb25kaXRpb25hbHMgPVxuICAgIGNvbmRpdGlvbmFscy5sZW5ndGggPiAwXG4gICAgICA/ICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBmb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKSBhcyBUO1xuICAgICAgICAgIGNvbmRpdGlvbmFscy5mb3JFYWNoKCh7IHdoZW4sIGZpZWxkcyB9KSA9PiB7XG4gICAgICAgICAgICBsZXQgdmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2aXNpYmxlID0gd2hlbih2YWx1ZXMpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkUGF0aCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZFBhdGgpO1xuICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBjb25kaXRpb25hbFN0YXRlLmdldChmaWVsZFBhdGgpO1xuICAgICAgICAgICAgICBpZiAocHJldmlvdXMgPT09IHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTdGF0ZS5zZXQoZmllbGRQYXRoLCB2aXNpYmxlKTtcbiAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIDogKCkgPT4gdW5kZWZpbmVkO1xuXG4gIGFwcGx5Q29uZGl0aW9uYWxzKCk7XG5cbiAgY29uc3QgYWdncmVnYXRlU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgYWdncmVnYXRlU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgIGZvcm1Hcm91cC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHJlZnJlc2hBZ2dyZWdhdGVzKCk7XG4gICAgICBwZXJzaXN0Q29udHJvbGxlci5zY2hlZHVsZVBlcnNpc3QoKTtcbiAgICAgIGFwcGx5Q29uZGl0aW9uYWxzKCk7XG4gICAgfSlcbiAgKTtcbiAgYWdncmVnYXRlU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgIGZvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiByZWZyZXNoQWdncmVnYXRlcygpKVxuICApO1xuICBpZiAoZm9ybUdyb3VwLmV2ZW50cykge1xuICAgIGFnZ3JlZ2F0ZVN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGZvcm1Hcm91cC5ldmVudHMuc3Vic2NyaWJlKCgpID0+IHJlZnJlc2hBZ2dyZWdhdGVzKCkpXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFudXBDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgYWdncmVnYXRlU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICBpZiAocmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQocmVmcmVzaFRpbWVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkZXN0cm95UmVmKSB7XG4gICAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgY2xlYW51cENhbGxiYWNrcy5zcGxpY2UoMCkuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2V0VmFsdWUgPSAoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCB0YXJnZXRTaWduYWwgPSBnZXRTaWduYWxBdFBhdGgoZmxhdHRlbmVkU3RhdGUsIGZpZWxkKTtcbiAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7XG5cbiAgICBpZiAodGFyZ2V0U2lnbmFsICYmICdzZXQnIGluIHRhcmdldFNpZ25hbCkge1xuICAgICAgKHRhcmdldFNpZ25hbCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wpIHtcbiAgICAgIChjb250cm9sIGFzIEFic3RyYWN0Q29udHJvbCkuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sKSB7XG4gICAgICBjb25zdCB1bnR5cGVkQ29udHJvbCA9IGNvbnRyb2wgYXMgQWJzdHJhY3RDb250cm9sO1xuICAgICAgdW50eXBlZENvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgdW50eXBlZENvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHVudHlwZWRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG4gICAgcGVyc2lzdENvbnRyb2xsZXIuc2NoZWR1bGVQZXJzaXN0KCk7XG4gIH07XG5cbiAgY29uc3Qgc2V0VmFsdWVzID0gKHZhbHVlczogUGFydGlhbDxUPikgPT4ge1xuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBzZXRWYWx1ZShrZXksIHZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICBmb3JtR3JvdXAucmVzZXQoaW5pdGlhbFNuYXBzaG90KTtcbiAgICBzdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG4gICAgcGVyc2lzdENvbnRyb2xsZXIucGVyc2lzdEltbWVkaWF0ZWx5KCk7XG4gICAgYXBwbHlDb25kaXRpb25hbHMoKTtcbiAgfTtcblxuICBjb25zdCB2YWxpZGF0ZSA9IGFzeW5jIChmaWVsZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChmaWVsZCkge1xuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGQpO1xuICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nKGNvbnRyb2wpO1xuICAgICAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICBmb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZyhmb3JtR3JvdXApO1xuICAgIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IHN1Ym1pdCA9IGFzeW5jIDxUUmVzdWx0PihcbiAgICBzdWJtaXRGbjogKHZhbHVlczogVCkgPT4gUHJvbWlzZTxUUmVzdWx0PlxuICApOiBQcm9taXNlPFRSZXN1bHQ+ID0+IHtcbiAgICBzdWJtaXR0aW5nLnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdmFsaWRhdGUoKTtcblxuICAgICAgaWYgKCF2YWxpZCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBGb3JtVmFsaWRhdGlvbkVycm9yKGVycm9ycygpLCBhc3luY0Vycm9ycygpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IGZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpIGFzIFQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdWJtaXRGbihjdXJyZW50VmFsdWVzKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIGNsZWFudXBDYWxsYmFja3Muc3BsaWNlKDApLmZvckVhY2goKGZuKSA9PiBmbigpKTtcbiAgfTtcblxuICBjb25zdCBmb3JtVHJlZTogRm9ybVRyZWU8VD4gPSB7XG4gICAgc3RhdGU6IGZsYXR0ZW5lZFN0YXRlLFxuICAgICQ6IGZsYXR0ZW5lZFN0YXRlLFxuICAgIGZvcm06IGZvcm1Hcm91cCxcbiAgICBlcnJvcnMsXG4gICAgYXN5bmNFcnJvcnMsXG4gICAgdG91Y2hlZCxcbiAgICBhc3luY1ZhbGlkYXRpbmcsXG4gICAgZGlydHksXG4gICAgdmFsaWQsXG4gICAgc3VibWl0dGluZyxcbiAgICB1bndyYXA6ICgpID0+IHZhbHVlc1RyZWUoKSxcbiAgICBzZXRWYWx1ZSxcbiAgICBzZXRWYWx1ZXMsXG4gICAgcmVzZXQsXG4gICAgc3VibWl0LFxuICAgIHZhbGlkYXRlLFxuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRFcnJvcnNbZmllbGRdIHx8IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCksXG4gICAgZ2V0RmllbGRBc3luY0Vycm9yOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGZpZWxkQXN5bmNFcnJvcnNbZmllbGRdIHx8IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCksXG4gICAgZ2V0RmllbGRUb3VjaGVkOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IGZvcm1Hcm91cC5nZXQoZmllbGQpPy50b3VjaGVkID8/IGZhbHNlKSxcbiAgICBpc0ZpZWxkVmFsaWQ6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7XG4gICAgICAgIHJldHVybiAhIWNvbnRyb2wgJiYgY29udHJvbC52YWxpZCAmJiAhY29udHJvbC5wZW5kaW5nO1xuICAgICAgfSksXG4gICAgaXNGaWVsZEFzeW5jVmFsaWRhdGluZzogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiAhIWZvcm1Hcm91cC5nZXQoZmllbGQpPy5wZW5kaW5nKSxcbiAgICBmaWVsZEVycm9ycyxcbiAgICBmaWVsZEFzeW5jRXJyb3JzLFxuICAgIHZhbHVlczogdmFsdWVzVHJlZSxcbiAgICBkZXN0cm95LFxuICB9O1xuXG4gIHJldHVybiBmb3JtVHJlZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZpcnR1YWxGb3JtQXJyYXk8VD4oXG4gIGl0ZW1zOiBUW10sXG4gIHZpc2libGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICBjb250cm9sRmFjdG9yeTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBBYnN0cmFjdENvbnRyb2wgPSAodmFsdWUpID0+XG4gICAgbmV3IEZvcm1Db250cm9sKHZhbHVlKVxuKTogRm9ybUFycmF5IHtcbiAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQpO1xuICBjb25zdCBlbmQgPSBNYXRoLm1heChzdGFydCwgdmlzaWJsZVJhbmdlLmVuZCk7XG5cbiAgY29uc3QgY29udHJvbHMgPSBpdGVtc1xuICAgIC5zbGljZShzdGFydCwgZW5kKVxuICAgIC5tYXAoKGl0ZW0sIG9mZnNldCkgPT4gY29udHJvbEZhY3RvcnkoaXRlbSwgc3RhcnQgKyBvZmZzZXQpKTtcblxuICByZXR1cm4gbmV3IEZvcm1BcnJheShjb250cm9scyk7XG59XG5cbmZ1bmN0aW9uIGVuaGFuY2VBcnJheXNSZWN1cnNpdmVseShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgdmlzaXRlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuKTogdm9pZCB7XG4gIGlmICh2aXNpdGVkLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZpc2l0ZWQuYWRkKG9iaik7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICBjb25zdCBzaWduYWxWYWx1ZSA9ICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzaWduYWxWYWx1ZSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBlbmhhbmNlQXJyYXkodmFsdWUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bltdPik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICApIHtcbiAgICAgIGVuaGFuY2VBcnJheXNSZWN1cnNpdmVseSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgdmlzaXRlZCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGVuaGFuY2VBcnJheSA9IDxVPihcbiAgYXJyYXlTaWduYWw6IFdyaXRhYmxlU2lnbmFsPFVbXT5cbik6IEVuaGFuY2VkQXJyYXlTaWduYWw8VT4gPT4ge1xuICBjb25zdCBlbmhhbmNlZCA9IGFycmF5U2lnbmFsIGFzIEVuaGFuY2VkQXJyYXlTaWduYWw8VT47XG5cbiAgZW5oYW5jZWQucHVzaCA9IChpdGVtOiBVKSA9PiB7XG4gICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IFsuLi5hcnIsIGl0ZW1dKTtcbiAgfTtcblxuICBlbmhhbmNlZC5yZW1vdmVBdCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IGFyci5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSk7XG4gIH07XG5cbiAgZW5oYW5jZWQuc2V0QXQgPSAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFUpID0+IHtcbiAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT5cbiAgICAgIGFyci5tYXAoKGl0ZW0sIGkpID0+IChpID09PSBpbmRleCA/IHZhbHVlIDogaXRlbSkpXG4gICAgKTtcbiAgfTtcblxuICBlbmhhbmNlZC5pbnNlcnRBdCA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBVKSA9PiB7XG4gICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IFtcbiAgICAgIC4uLmFyci5zbGljZSgwLCBpbmRleCksXG4gICAgICBpdGVtLFxuICAgICAgLi4uYXJyLnNsaWNlKGluZGV4KSxcbiAgICBdKTtcbiAgfTtcblxuICBlbmhhbmNlZC5tb3ZlID0gKGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiB7XG4gICAgICBjb25zdCBuZXdBcnIgPSBbLi4uYXJyXTtcbiAgICAgIGNvbnN0IFtpdGVtXSA9IG5ld0Fyci5zcGxpY2UoZnJvbSwgMSk7XG4gICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0Fyci5zcGxpY2UodG8sIDAsIGl0ZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld0FycjtcbiAgICB9KTtcbiAgfTtcblxuICBlbmhhbmNlZC5jbGVhciA9ICgpID0+IHtcbiAgICBhcnJheVNpZ25hbC5zZXQoW10pO1xuICB9O1xuXG4gIHJldHVybiBlbmhhbmNlZDtcbn07XG5cbmZ1bmN0aW9uIGdldFNpZ25hbEF0UGF0aDxUPihcbiAgbm9kZTogVHJlZU5vZGU8VD4sXG4gIHBhdGg6IHN0cmluZ1xuKTogV3JpdGFibGVTaWduYWw8dW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKCFwYXRoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IHBhcnNlUGF0aChwYXRoKTtcbiAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSBub2RlO1xuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGlmICghY3VycmVudCB8fCB0eXBlb2YgY3VycmVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbc2VnbWVudF07XG4gIH1cblxuICBpZiAoaXNTaWduYWwoY3VycmVudCkpIHtcbiAgICByZXR1cm4gY3VycmVudCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBqb2luUGF0aChwYXJlbnQ6IHN0cmluZywgc2VnbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmVudCA/IGAke3BhcmVudH0uJHtzZWdtZW50fWAgOiBzZWdtZW50O1xufVxuXG5mdW5jdGlvbiB3cmFwU3luY1ZhbGlkYXRvcihcbiAgdmFsaWRhdG9yOiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZyB8IG51bGxcbik6IEFuZ3VsYXJWYWxpZGF0b3JGbiB7XG4gIHJldHVybiAoY29udHJvbCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRvcihjb250cm9sLnZhbHVlKTtcbiAgICByZXR1cm4gcmVzdWx0ID8geyBbU1lOQ19FUlJPUl9LRVldOiByZXN1bHQgfSA6IG51bGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdyYXBBc3luY1ZhbGlkYXRvcihcbiAgdmFsaWRhdG9yOiBGb3JtVHJlZUFzeW5jVmFsaWRhdG9yRm48dW5rbm93bj5cbik6IEFuZ3VsYXJBc3luY1ZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIGFzeW5jIChjb250cm9sKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1heWJlQXN5bmMgPSB2YWxpZGF0b3IoY29udHJvbC52YWx1ZSk7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGlzT2JzZXJ2YWJsZShtYXliZUFzeW5jKVxuICAgICAgICA/IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1heWJlQXN5bmMpXG4gICAgICAgIDogYXdhaXQgbWF5YmVBc3luYztcbiAgICAgIHJldHVybiByZXNvbHZlZCA/IHsgW0FTWU5DX0VSUk9SX0tFWV06IHJlc29sdmVkIH0gOiBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgW0FTWU5DX0VSUk9SX0tFWV06ICdWYWxpZGF0aW9uIGVycm9yJyB9O1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQWJzdHJhY3RDb250cm9sKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWxpZGF0b3JzOiBTeW5jVmFsaWRhdG9yTWFwLFxuICBhc3luY1ZhbGlkYXRvcnM6IEFzeW5jVmFsaWRhdG9yTWFwXG4pOiBBYnN0cmFjdENvbnRyb2wge1xuICBjb25zdCBzeW5jVmFsaWRhdG9yID0gZmluZFZhbGlkYXRvcih2YWxpZGF0b3JzLCBwYXRoKTtcbiAgY29uc3QgYXN5bmNWYWxpZGF0b3IgPSBmaW5kVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9ycywgcGF0aCk7XG5cbiAgY29uc3Qgc3luY0ZucyA9IHN5bmNWYWxpZGF0b3JcbiAgICA/IFt3cmFwU3luY1ZhbGlkYXRvcihzeW5jVmFsaWRhdG9yKV1cbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYXN5bmNGbnMgPSBhc3luY1ZhbGlkYXRvclxuICAgID8gW3dyYXBBc3luY1ZhbGlkYXRvcihhc3luY1ZhbGlkYXRvcildXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgY29udHJvbHMgPSB2YWx1ZS5tYXAoKGl0ZW0sIGluZGV4KSA9PlxuICAgICAgY3JlYXRlQWJzdHJhY3RDb250cm9sKFxuICAgICAgICBpdGVtLFxuICAgICAgICBqb2luUGF0aChwYXRoLCBTdHJpbmcoaW5kZXgpKSxcbiAgICAgICAgdmFsaWRhdG9ycyxcbiAgICAgICAgYXN5bmNWYWxpZGF0b3JzXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IEZvcm1BcnJheShjb250cm9scywgc3luY0ZucywgYXN5bmNGbnMpO1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgY29uc3QgY29udHJvbHM6IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0Q29udHJvbD4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGNvbnRyb2xzW2tleV0gPSBjcmVhdGVBYnN0cmFjdENvbnRyb2woXG4gICAgICAgIGNoaWxkLFxuICAgICAgICBqb2luUGF0aChwYXRoLCBrZXkpLFxuICAgICAgICB2YWxpZGF0b3JzLFxuICAgICAgICBhc3luY1ZhbGlkYXRvcnNcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzLCB7XG4gICAgICB2YWxpZGF0b3JzOiBzeW5jRm5zLFxuICAgICAgYXN5bmNWYWxpZGF0b3JzOiBhc3luY0ZucyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRm9ybUNvbnRyb2wodmFsdWUsIHtcbiAgICB2YWxpZGF0b3JzOiBzeW5jRm5zLFxuICAgIGFzeW5jVmFsaWRhdG9yczogYXN5bmNGbnMsXG4gICAgbm9uTnVsbGFibGU6IGZhbHNlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb25uZWN0cyBhIEZvcm1Db250cm9sIHRvIGEgV3JpdGFibGVTaWduYWwgd2l0aCBiaWRpcmVjdGlvbmFsIHN5bmMuXG4gKiBQcmVmZXJzIEFuZ3VsYXIgMjArIFNpZ25hbCBGb3JtcyBjb25uZWN0KCkgQVBJIHdoZW4gYXZhaWxhYmxlLlxuICpcbiAqIEBkZXByZWNhdGVkIE1hbnVhbCBicmlkZ2Ugc3VwcG9ydCAoZmFsbGJhY2sgZm9yIEFuZ3VsYXIgMTctMTkpIHdpbGwgYmUgcmVtb3ZlZFxuICogd2hlbiBBbmd1bGFyIDIxIGlzIHJlbGVhc2VkLiBVcGdyYWRlIHRvIEFuZ3VsYXIgMjAuMysgdG8gdXNlIG5hdGl2ZSBTaWduYWwgRm9ybXMuXG4gKi9cbmZ1bmN0aW9uIGNvbm5lY3RDb250cm9sQW5kU2lnbmFsKFxuICBjb250cm9sOiBGb3JtQ29udHJvbCxcbiAgdmFsdWVTaWduYWw6IFdyaXRhYmxlU2lnbmFsPHVua25vd24+LFxuICBjbGVhbnVwQ2FsbGJhY2tzOiBBcnJheTwoKSA9PiB2b2lkPixcbiAgZmllbGRDb25maWc/OiBGaWVsZENvbmZpZ1xuKTogdm9pZCB7XG4gIC8vIFRyeSBBbmd1bGFyIDIwKyBTaWduYWwgRm9ybXMgY29ubmVjdCgpIEFQSSBmaXJzdFxuICBjb25zdCBtYXliZUNvbm5lY3QgPSAoXG4gICAgY29udHJvbCBhcyB1bmtub3duIGFzIHtcbiAgICAgIGNvbm5lY3Q/OiAoc2lnOiBXcml0YWJsZVNpZ25hbDx1bmtub3duPikgPT4gdW5rbm93bjtcbiAgICB9XG4gICkuY29ubmVjdDtcblxuICBpZiAodHlwZW9mIG1heWJlQ29ubmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBtYXliZUNvbm5lY3QuY2FsbChjb250cm9sLCB2YWx1ZVNpZ25hbCk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlcyAmJlxuICAgICAgICB0eXBlb2YgKHJlcyBhcyB7IHVuc3Vic2NyaWJlPzogKCkgPT4gdm9pZCB9KS51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGNsZWFudXBDYWxsYmFja3MucHVzaCgoKSA9PlxuICAgICAgICAgIChyZXMgYXMgeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9KS51bnN1YnNjcmliZSgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47IC8vIENvbm5lY3RlZCB2aWEgbmF0aXZlIEFQSVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIG1hbnVhbCBicmlkZ2VcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjazogTWFudWFsIGJpZGlyZWN0aW9uYWwgYnJpZGdlIGZvciBBbmd1bGFyIDE3LTE5XG4gIC8vIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCB3aGVuIEFuZ3VsYXIgMjEgaXMgcmVsZWFzZWRcbiAgbGV0IHVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgbGV0IHVwZGF0aW5nRnJvbVNpZ25hbCA9IGZhbHNlO1xuICBsZXQgdmVyc2lvbkNvdW50ZXIgPSAwO1xuICBsZXQgbGFzdENvbnRyb2xWZXJzaW9uID0gMDtcbiAgbGV0IGNvbnRyb2xEZWJvdW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBjb25zdCBkZWJvdW5jZU1zID0gZmllbGRDb25maWc/LmRlYm91bmNlTXMgPz8gMDtcblxuICBjb25zdCBvcmlnaW5hbFNldCA9IHZhbHVlU2lnbmFsLnNldC5iaW5kKHZhbHVlU2lnbmFsKTtcbiAgY29uc3Qgb3JpZ2luYWxVcGRhdGUgPSB2YWx1ZVNpZ25hbC51cGRhdGUuYmluZCh2YWx1ZVNpZ25hbCk7XG5cbiAgY29uc3QgYXBwbHlDb250cm9sVmFsdWUgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICB1cGRhdGluZ0Zyb21TaWduYWwgPSB0cnVlO1xuICAgIGlmICghT2JqZWN0LmlzKGNvbnRyb2wudmFsdWUsIHZhbHVlKSkge1xuICAgICAgY29uc3QgdW50eXBlZENvbnRyb2wgPSBjb250cm9sIGFzIEFic3RyYWN0Q29udHJvbDtcbiAgICAgIHVudHlwZWRDb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgIHVudHlwZWRDb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICAgIHVwZGF0aW5nRnJvbVNpZ25hbCA9IGZhbHNlO1xuICB9O1xuXG4gIHZhbHVlU2lnbmFsLnNldCA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gKyt2ZXJzaW9uQ291bnRlcjtcbiAgICBvcmlnaW5hbFNldCh2YWx1ZSk7XG4gICAgaWYgKHVwZGF0aW5nRnJvbUNvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGxhc3RDb250cm9sVmVyc2lvbiA+IGN1cnJlbnRWZXJzaW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwcGx5Q29udHJvbFZhbHVlKHZhbHVlKTtcbiAgfTtcblxuICB2YWx1ZVNpZ25hbC51cGRhdGUgPSAodXBkYXRlcikgPT4ge1xuICAgIGNvbnN0IG5leHQgPSB1cGRhdGVyKHZhbHVlU2lnbmFsKCkpO1xuICAgIHZhbHVlU2lnbmFsLnNldChuZXh0KTtcbiAgfTtcblxuICBjb25zdCBwdXNoVXBkYXRlRnJvbUNvbnRyb2wgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICB1cGRhdGluZ0Zyb21Db250cm9sID0gdHJ1ZTtcbiAgICBsYXN0Q29udHJvbFZlcnNpb24gPSArK3ZlcnNpb25Db3VudGVyO1xuICAgIG9yaWdpbmFsU2V0KHZhbHVlKTtcbiAgICB1cGRhdGluZ0Zyb21Db250cm9sID0gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ29udHJvbENoYW5nZSA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmICh1cGRhdGluZ0Zyb21TaWduYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGVib3VuY2VNcyA+IDApIHtcbiAgICAgIGlmIChjb250cm9sRGVib3VuY2VUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoY29udHJvbERlYm91bmNlVGltZXIpO1xuICAgICAgfVxuICAgICAgY29udHJvbERlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29udHJvbERlYm91bmNlVGltZXIgPSBudWxsO1xuICAgICAgICBwdXNoVXBkYXRlRnJvbUNvbnRyb2wodmFsdWUpO1xuICAgICAgfSwgZGVib3VuY2VNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVzaFVwZGF0ZUZyb21Db250cm9sKHZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBzdWJzY3JpcHRpb24gPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgaGFuZGxlQ29udHJvbENoYW5nZSh2YWx1ZSk7XG4gIH0pO1xuXG4gIGNsZWFudXBDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdmFsdWVTaWduYWwuc2V0ID0gb3JpZ2luYWxTZXQ7XG4gICAgdmFsdWVTaWduYWwudXBkYXRlID0gb3JpZ2luYWxVcGRhdGU7XG4gICAgaWYgKGNvbnRyb2xEZWJvdW5jZVRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQoY29udHJvbERlYm91bmNlVGltZXIpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQ29ubmVjdHMgYSBGb3JtQXJyYXkgdG8gYW4gRW5oYW5jZWRBcnJheVNpZ25hbCB3aXRoIGJpZGlyZWN0aW9uYWwgc3luYy5cbiAqIFByZWZlcnMgQW5ndWxhciAyMCsgU2lnbmFsIEZvcm1zIGNvbm5lY3QoKSBBUEkgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgTWFudWFsIGJyaWRnZSBzdXBwb3J0IChmYWxsYmFjayBmb3IgQW5ndWxhciAxNy0xOSkgd2lsbCBiZSByZW1vdmVkXG4gKiB3aGVuIEFuZ3VsYXIgMjEgaXMgcmVsZWFzZWQuIFVwZ3JhZGUgdG8gQW5ndWxhciAyMC4zKyB0byB1c2UgbmF0aXZlIFNpZ25hbCBGb3Jtcy5cbiAqL1xuZnVuY3Rpb24gY29ubmVjdEZvcm1BcnJheUFuZFNpZ25hbChcbiAgZm9ybUFycmF5OiBGb3JtQXJyYXksXG4gIGFycmF5U2lnbmFsOiBFbmhhbmNlZEFycmF5U2lnbmFsPHVua25vd24+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbGlkYXRvcnM6IFN5bmNWYWxpZGF0b3JNYXAsXG4gIGFzeW5jVmFsaWRhdG9yczogQXN5bmNWYWxpZGF0b3JNYXAsXG4gIGNsZWFudXBDYWxsYmFja3M6IEFycmF5PCgpID0+IHZvaWQ+LFxuICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZTogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGF0aDogc3RyaW5nKSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgLy8gVHJ5IEFuZ3VsYXIgMjArIFNpZ25hbCBGb3JtcyBjb25uZWN0KCkgQVBJIGZpcnN0XG4gIGNvbnN0IG1heWJlQ29ubmVjdCA9IChcbiAgICBmb3JtQXJyYXkgYXMgdW5rbm93biBhcyB7XG4gICAgICBjb25uZWN0PzogKHNpZzogV3JpdGFibGVTaWduYWw8dW5rbm93bltdPikgPT4gdW5rbm93bjtcbiAgICB9XG4gICkuY29ubmVjdDtcblxuICBpZiAodHlwZW9mIG1heWJlQ29ubmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBtYXliZUNvbm5lY3QuY2FsbChcbiAgICAgICAgZm9ybUFycmF5LFxuICAgICAgICBhcnJheVNpZ25hbCBhcyB1bmtub3duIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd25bXT5cbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlcyAmJlxuICAgICAgICB0eXBlb2YgKHJlcyBhcyB7IHVuc3Vic2NyaWJlPzogKCkgPT4gdm9pZCB9KS51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGNsZWFudXBDYWxsYmFja3MucHVzaCgoKSA9PlxuICAgICAgICAgIChyZXMgYXMgeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9KS51bnN1YnNjcmliZSgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47IC8vIENvbm5lY3RlZCB2aWEgbmF0aXZlIEFQSVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIG1hbnVhbCBicmlkZ2VcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjazogTWFudWFsIGJpZGlyZWN0aW9uYWwgYnJpZGdlIGZvciBBbmd1bGFyIDE3LTE5XG4gIC8vIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCB3aGVuIEFuZ3VsYXIgMjEgaXMgcmVsZWFzZWRcbiAgbGV0IHVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgbGV0IHVwZGF0aW5nRnJvbVNpZ25hbCA9IGZhbHNlO1xuXG4gIGNvbnN0IG9yaWdpbmFsU2V0ID0gYXJyYXlTaWduYWwuc2V0LmJpbmQoYXJyYXlTaWduYWwpO1xuICBjb25zdCBvcmlnaW5hbFVwZGF0ZSA9IGFycmF5U2lnbmFsLnVwZGF0ZS5iaW5kKGFycmF5U2lnbmFsKTtcblxuICBhcnJheVNpZ25hbC5zZXQgPSAodmFsdWU6IHVua25vd25bXSkgPT4ge1xuICAgIG9yaWdpbmFsU2V0KHZhbHVlKTtcbiAgICBpZiAodXBkYXRpbmdGcm9tQ29udHJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGRhdGluZ0Zyb21TaWduYWwgPSB0cnVlO1xuICAgIHN5bmNGb3JtQXJyYXlGcm9tVmFsdWUoXG4gICAgICBmb3JtQXJyYXksXG4gICAgICB2YWx1ZSxcbiAgICAgIHBhdGgsXG4gICAgICB2YWxpZGF0b3JzLFxuICAgICAgYXN5bmNWYWxpZGF0b3JzLFxuICAgICAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmVcbiAgICApO1xuICAgIGZvcm1BcnJheS5tYXJrQXNEaXJ0eSgpO1xuICAgIHVwZGF0aW5nRnJvbVNpZ25hbCA9IGZhbHNlO1xuICB9O1xuXG4gIGFycmF5U2lnbmFsLnVwZGF0ZSA9ICh1cGRhdGVyKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHVwZGF0ZXIoYXJyYXlTaWduYWwoKSk7XG4gICAgYXJyYXlTaWduYWwuc2V0KG5leHQpO1xuICB9O1xuXG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGZvcm1BcnJheS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh1cGRhdGluZ0Zyb21TaWduYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRpbmdGcm9tQ29udHJvbCA9IHRydWU7XG4gICAgb3JpZ2luYWxTZXQodmFsdWUgYXMgdW5rbm93bltdKTtcbiAgICB1cGRhdGluZ0Zyb21Db250cm9sID0gZmFsc2U7XG4gIH0pO1xuXG4gIGNsZWFudXBDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgYXJyYXlTaWduYWwuc2V0ID0gb3JpZ2luYWxTZXQ7XG4gICAgYXJyYXlTaWduYWwudXBkYXRlID0gb3JpZ2luYWxVcGRhdGU7XG4gIH0pO1xuXG4gIHN5bmNGb3JtQXJyYXlGcm9tVmFsdWUoXG4gICAgZm9ybUFycmF5LFxuICAgIGFycmF5U2lnbmFsKCksXG4gICAgcGF0aCxcbiAgICB2YWxpZGF0b3JzLFxuICAgIGFzeW5jVmFsaWRhdG9ycyxcbiAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZVxuICApO1xufVxuXG4vKipcbiAqIFN5bmNzIGEgRm9ybUFycmF5IHN0cnVjdHVyZSB3aXRoIGEgc2lnbmFsIGFycmF5IHZhbHVlLlxuICogVXNlZCBieSB0aGUgbWFudWFsIGJyaWRnZSBmYWxsYmFjayBmb3IgQW5ndWxhciAxNy0xOS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgd2hlbiBBbmd1bGFyIDIxIGlzIHJlbGVhc2VkIGFuZCBtYW51YWwgYnJpZGdlIHN1cHBvcnQgaXMgZHJvcHBlZC5cbiAqL1xuZnVuY3Rpb24gc3luY0Zvcm1BcnJheUZyb21WYWx1ZShcbiAgZm9ybUFycmF5OiBGb3JtQXJyYXksXG4gIG5leHRWYWx1ZTogdW5rbm93bltdLFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbGlkYXRvcnM6IFN5bmNWYWxpZGF0b3JNYXAsXG4gIGFzeW5jVmFsaWRhdG9yczogQXN5bmNWYWxpZGF0b3JNYXAsXG4gIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlOiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBzdHJpbmcpID0+IHZvaWRcbik6IHZvaWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobmV4dFZhbHVlKSkge1xuICAgIG5leHRWYWx1ZSA9IFtdO1xuICB9XG5cbiAgd2hpbGUgKGZvcm1BcnJheS5sZW5ndGggPiBuZXh0VmFsdWUubGVuZ3RoKSB7XG4gICAgZm9ybUFycmF5LnJlbW92ZUF0KGZvcm1BcnJheS5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIG5leHRWYWx1ZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkUGF0aCA9IGpvaW5QYXRoKHBhdGgsIFN0cmluZyhpbmRleCkpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZm9ybUFycmF5LmF0KGluZGV4KTtcblxuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVBYnN0cmFjdENvbnRyb2woXG4gICAgICAgIGl0ZW0sXG4gICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgdmFsaWRhdG9ycyxcbiAgICAgICAgYXN5bmNWYWxpZGF0b3JzXG4gICAgICApO1xuICAgICAgZm9ybUFycmF5Lmluc2VydChpbmRleCwgY29udHJvbCk7XG4gICAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZShjb250cm9sLCBjaGlsZFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgc3luY0Zvcm1BcnJheUZyb21WYWx1ZShcbiAgICAgICAgZXhpc3RpbmcsXG4gICAgICAgIEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW10sXG4gICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgdmFsaWRhdG9ycyxcbiAgICAgICAgYXN5bmNWYWxpZGF0b3JzLFxuICAgICAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIGV4aXN0aW5nLnNldFZhbHVlKGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIU9iamVjdC5pcyhleGlzdGluZy52YWx1ZSwgaXRlbSkpIHtcbiAgICAgIGNvbnN0IHVudHlwZWRFeGlzdGluZyA9IGV4aXN0aW5nIGFzIEFic3RyYWN0Q29udHJvbDtcbiAgICAgIHVudHlwZWRFeGlzdGluZy5zZXRWYWx1ZShpdGVtLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuaW50ZXJmYWNlIENvbnRyb2xTbmFwc2hvdCB7XG4gIHN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB0b3VjaGVkOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgcGVuZGluZzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb250cm9sU25hcHNob3QoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogQ29udHJvbFNuYXBzaG90IHtcbiAgY29uc3Qgc25hcHNob3Q6IENvbnRyb2xTbmFwc2hvdCA9IHtcbiAgICBzeW5jRXJyb3JzOiB7fSxcbiAgICBhc3luY0Vycm9yczoge30sXG4gICAgdG91Y2hlZDoge30sXG4gICAgcGVuZGluZzoge30sXG4gIH07XG5cbiAgdHJhdmVyc2VDb250cm9scyhcbiAgICBjb250cm9sLFxuICAgIChjdXJyZW50UGF0aCwgY3VycmVudENvbnRyb2wpID0+IHtcbiAgICAgIGlmICghY3VycmVudFBhdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudENvbnRyb2wudG91Y2hlZCkge1xuICAgICAgICBzbmFwc2hvdC50b3VjaGVkW2N1cnJlbnRQYXRoXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50Q29udHJvbC5wZW5kaW5nKSB7XG4gICAgICAgIHNuYXBzaG90LnBlbmRpbmdbY3VycmVudFBhdGhdID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gY3VycmVudENvbnRyb2wuZXJyb3JzIGFzIFZhbGlkYXRpb25FcnJvcnMgfCBudWxsO1xuICAgICAgaWYgKCFlcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzeW5jTWVzc2FnZSA9IGVycm9yc1tTWU5DX0VSUk9SX0tFWV07XG4gICAgICBpZiAodHlwZW9mIHN5bmNNZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzbmFwc2hvdC5zeW5jRXJyb3JzW2N1cnJlbnRQYXRoXSA9IHN5bmNNZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhc3luY01lc3NhZ2UgPSBlcnJvcnNbQVNZTkNfRVJST1JfS0VZXTtcbiAgICAgIGlmICh0eXBlb2YgYXN5bmNNZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzbmFwc2hvdC5hc3luY0Vycm9yc1tjdXJyZW50UGF0aF0gPSBhc3luY01lc3NhZ2U7XG4gICAgICB9XG4gICAgfSxcbiAgICAnJ1xuICApO1xuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gdHJhdmVyc2VDb250cm9scyhcbiAgY29udHJvbDogQWJzdHJhY3RDb250cm9sLFxuICB2aXNpdG9yOiAocGF0aDogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHZvaWQsXG4gIHBhdGggPSAnJ1xuKTogdm9pZCB7XG4gIHZpc2l0b3IocGF0aCwgY29udHJvbCk7XG5cbiAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICBPYmplY3QuZW50cmllcyhjb250cm9sLmNvbnRyb2xzKS5mb3JFYWNoKChba2V5LCBjaGlsZF0pID0+IHtcbiAgICAgIHRyYXZlcnNlQ29udHJvbHMoY2hpbGQsIHZpc2l0b3IsIGpvaW5QYXRoKHBhdGgsIGtleSkpO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIHRyYXZlcnNlQ29udHJvbHMoY2hpbGQsIHZpc2l0b3IsIGpvaW5QYXRoKHBhdGgsIFN0cmluZyhpbmRleCkpKTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YWl0Rm9yUGVuZGluZyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb250cm9sLnBlbmRpbmcpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjb250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghY29udHJvbC5wZW5kaW5nKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgKTtcbn1cblxuZnVuY3Rpb24gdHJ5SW5qZWN0RGVzdHJveVJlZigpOiBEZXN0cm95UmVmIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGluamVjdChEZXN0cm95UmVmKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3luY1ZhbGlkYXRvcnMoXG4gIGJhc2U6IFN5bmNWYWxpZGF0b3JNYXAsXG4gIGZpZWxkQ29uZmlnczogUmVjb3JkPHN0cmluZywgRmllbGRDb25maWc+XG4pOiBTeW5jVmFsaWRhdG9yTWFwIHtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFZhbGlkYXRvcltdPigpO1xuXG4gIGZvciAoY29uc3QgW3BhdGgsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoYmFzZSkpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGJ1Y2tldHMuZ2V0KHBhdGgpID8/IFtdO1xuICAgIGV4aXN0aW5nLnB1c2godmFsaWRhdG9yKTtcbiAgICBidWNrZXRzLnNldChwYXRoLCBleGlzdGluZyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtwYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGZpZWxkQ29uZmlncykpIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gdG9WYWxpZGF0b3JBcnJheShjb25maWcudmFsaWRhdG9ycyk7XG4gICAgaWYgKHZhbGlkYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBidWNrZXRzLmdldChwYXRoKSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKC4uLnZhbGlkYXRvcnMpO1xuICAgIGJ1Y2tldHMuc2V0KHBhdGgsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQ6IFN5bmNWYWxpZGF0b3JNYXAgPSB7fTtcbiAgYnVja2V0cy5mb3JFYWNoKCh2YWxpZGF0b3JzLCBwYXRoKSA9PiB7XG4gICAgbm9ybWFsaXplZFtwYXRoXSA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0b3IodmFsdWUpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgLi4uYmFzZSwgLi4ubm9ybWFsaXplZCB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVBc3luY1ZhbGlkYXRvcnMoXG4gIGJhc2U6IEFzeW5jVmFsaWRhdG9yTWFwLFxuICBmaWVsZENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIEZpZWxkQ29uZmlnPlxuKTogQXN5bmNWYWxpZGF0b3JNYXAge1xuICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPj4+KCk7XG5cbiAgZm9yIChjb25zdCBbcGF0aCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhiYXNlKSkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYnVja2V0cy5nZXQocGF0aCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaCh2YWxpZGF0b3IpO1xuICAgIGJ1Y2tldHMuc2V0KHBhdGgsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3BhdGgsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoZmllbGRDb25maWdzKSkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0b1ZhbGlkYXRvckFycmF5KGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgIGlmICh2YWxpZGF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYnVja2V0cy5nZXQocGF0aCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaCguLi52YWxpZGF0b3JzKTtcbiAgICBidWNrZXRzLnNldChwYXRoLCBleGlzdGluZyk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkOiBBc3luY1ZhbGlkYXRvck1hcCA9IHt9O1xuICBidWNrZXRzLmZvckVhY2goKHZhbGlkYXRvcnMsIHBhdGgpID0+IHtcbiAgICBub3JtYWxpemVkW3BhdGhdID0gYXN5bmMgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiB2YWxpZGF0b3JzKSB7XG4gICAgICAgIGNvbnN0IG1heWJlQXN5bmMgPSB2YWxpZGF0b3IodmFsdWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpc09ic2VydmFibGUobWF5YmVBc3luYylcbiAgICAgICAgICA/IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1heWJlQXN5bmMpXG4gICAgICAgICAgOiBhd2FpdCBtYXliZUFzeW5jO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgLi4uYmFzZSwgLi4ubm9ybWFsaXplZCB9O1xufVxuXG5mdW5jdGlvbiB0b1ZhbGlkYXRvckFycmF5PFQ+KGlucHV0PzogUmVjb3JkPHN0cmluZywgVD4gfCBUW10pOiBUW10ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVJbml0aWFsVmFsdWVzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIGluaXRpYWxWYWx1ZXM6IFQsXG4gIHBlcnNpc3RLZXk/OiBzdHJpbmcsXG4gIHN0b3JhZ2U/OiBQaWNrPFN0b3JhZ2UsICdnZXRJdGVtJyB8ICdzZXRJdGVtJyB8ICdyZW1vdmVJdGVtJz5cbik6IHsgdmFsdWVzOiBUIH0ge1xuICBjb25zdCBiYXNlQ2xvbmUgPSBkZWVwQ2xvbmUoaW5pdGlhbFZhbHVlcyk7XG5cbiAgaWYgKCFwZXJzaXN0S2V5IHx8ICFzdG9yYWdlKSB7XG4gICAgcmV0dXJuIHsgdmFsdWVzOiBiYXNlQ2xvbmUgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RvcmVkUmF3ID0gc3RvcmFnZS5nZXRJdGVtKHBlcnNpc3RLZXkpO1xuICAgIGlmICghc3RvcmVkUmF3KSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGJhc2VDbG9uZSB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0b3JlZFJhdykgYXMgUGFydGlhbDxUPjtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZURlZXAoYmFzZUNsb25lLCBwYXJzZWQpO1xuICAgIHJldHVybiB7IHZhbHVlczogbWVyZ2VkIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IHZhbHVlczogYmFzZUNsb25lIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0VHJlZU5vZGU8VD4oc3RhdGU6IHVua25vd24pOiBhc3NlcnRzIHN0YXRlIGlzIFRyZWVOb2RlPFQ+IHtcbiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlIHN0cnVjdHVyZSBmb3IgZm9ybSB0cmVlJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpZWxkQ29uZmlnKFxuICBmaWVsZENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIEZpZWxkQ29uZmlnPixcbiAgcGF0aDogc3RyaW5nXG4pOiBGaWVsZENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChmaWVsZENvbmZpZ3NbcGF0aF0pIHtcbiAgICByZXR1cm4gZmllbGRDb25maWdzW3BhdGhdO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZpZWxkQ29uZmlncyk7XG4gIGxldCBtYXRjaDogeyBrZXk6IHN0cmluZzsgY29uZmlnOiBGaWVsZENvbmZpZyB9IHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoIWtleS5pbmNsdWRlcygnKicpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG1hdGNoUGF0aChrZXksIHBhdGgpKSB7XG4gICAgICBpZiAoIW1hdGNoIHx8IG1hdGNoLmtleS5sZW5ndGggPCBrZXkubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoID0geyBrZXksIGNvbmZpZzogZmllbGRDb25maWdzW2tleV0gfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guY29uZmlnO1xuICB9XG5cbiAgcmV0dXJuIGZpZWxkQ29uZmlnc1snKiddO1xufVxuXG5mdW5jdGlvbiBmaW5kVmFsaWRhdG9yPFQ+KG1hcDogUmVjb3JkPHN0cmluZywgVD4sIHBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICBpZiAobWFwW3BhdGhdKSB7XG4gICAgcmV0dXJuIG1hcFtwYXRoXTtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGU6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUIH0gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1hcCkpIHtcbiAgICBpZiAoIWtleS5pbmNsdWRlcygnKicpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG1hdGNoUGF0aChrZXksIHBhdGgpKSB7XG4gICAgICBpZiAoIWNhbmRpZGF0ZSB8fCBjYW5kaWRhdGUua2V5Lmxlbmd0aCA8IGtleS5sZW5ndGgpIHtcbiAgICAgICAgY2FuZGlkYXRlID0geyBrZXksIHZhbHVlOiBtYXBba2V5XSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjYW5kaWRhdGUpIHtcbiAgICByZXR1cm4gY2FuZGlkYXRlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG1hcFsnKiddO1xufVxuXG5pbnRlcmZhY2UgUGVyc2lzdENvbnRyb2xsZXIge1xuICBzY2hlZHVsZVBlcnNpc3Q6ICgpID0+IHZvaWQ7XG4gIHBlcnNpc3RJbW1lZGlhdGVseTogKCkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGVyc2lzdENvbnRyb2xsZXIoXG4gIGZvcm1Hcm91cDogRm9ybUdyb3VwLFxuICBwZXJzaXN0S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHN0b3JhZ2U6IFBpY2s8U3RvcmFnZSwgJ2dldEl0ZW0nIHwgJ3NldEl0ZW0nIHwgJ3JlbW92ZUl0ZW0nPiB8IHVuZGVmaW5lZCxcbiAgZGVib3VuY2VNczogbnVtYmVyLFxuICBjbGVhbnVwQ2FsbGJhY2tzOiBBcnJheTwoKSA9PiB2b2lkPlxuKTogUGVyc2lzdENvbnRyb2xsZXIge1xuICBpZiAoIXBlcnNpc3RLZXkgfHwgIXN0b3JhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZWR1bGVQZXJzaXN0OiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICBwZXJzaXN0SW1tZWRpYXRlbHk6ICgpID0+IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHBlcnNpc3QgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShmb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKSk7XG4gICAgICBzdG9yYWdlLnNldEl0ZW0ocGVyc2lzdEtleSwgcGF5bG9hZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IHBlcnNpc3RlbmNlIGVycm9ycyB0byBhdm9pZCBicmVha2luZyBmb3JtIHVwZGF0ZXNcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2NoZWR1bGVQZXJzaXN0ID0gKCkgPT4ge1xuICAgIGlmIChkZWJvdW5jZU1zIDw9IDApIHtcbiAgICAgIHBlcnNpc3QoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuXG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIHBlcnNpc3QoKTtcbiAgICB9LCBkZWJvdW5jZU1zKTtcbiAgfTtcblxuICBjbGVhbnVwQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc2NoZWR1bGVQZXJzaXN0LFxuICAgIHBlcnNpc3RJbW1lZGlhdGVseTogcGVyc2lzdCxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFOR1VMQVIgRElSRUNUSVZFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBkaXJlY3RpdmUgZm9yIHR3by13YXkgYmluZGluZyB3aXRoIHNpZ25hbHNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NpZ25hbFRyZWVTaWduYWxWYWx1ZV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNpZ25hbFZhbHVlRGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFNpZ25hbFZhbHVlRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHNpZ25hbFRyZWVTaWduYWxWYWx1ZSE6IFdyaXRhYmxlU2lnbmFsPHVua25vd24+O1xuICBAT3V0cHV0KCkgc2lnbmFsVHJlZVNpZ25hbFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gIHByaXZhdGUgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgLy8gRW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIH07XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWUoKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0Py52YWx1ZTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgIHRoaXMuc2lnbmFsVHJlZVNpZ25hbFZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXG4gIGhhbmRsZUJsdXIoKSB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWUuc2V0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgIGlzRGlzYWJsZWRcbiAgICApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgU0lHTkFMX0ZPUk1fRElSRUNUSVZFUyA9IFtTaWduYWxWYWx1ZURpcmVjdGl2ZV07XG4iXX0=","export function required(message = 'Required') {\n return (value) => (!value ? message : null);\n}\nexport function email(message = 'Invalid email') {\n return (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n };\n}\nexport function minLength(min, message) {\n return (value) => {\n const strValue = value;\n const errorMsg = message ?? `Min ${min} characters`;\n return strValue && strValue.length < min ? errorMsg : null;\n };\n}\nexport function maxLength(max, message) {\n return (value) => {\n const strValue = value;\n const errorMsg = message ?? `Max ${max} characters`;\n return strValue && strValue.length > max ? errorMsg : null;\n };\n}\nexport function pattern(regex, message = 'Invalid format') {\n return (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n };\n}\nexport function min(min, message) {\n return (value) => {\n const numValue = value;\n const errorMsg = message ?? `Must be at least ${min}`;\n return numValue < min ? errorMsg : null;\n };\n}\nexport function max(max, message) {\n return (value) => {\n const numValue = value;\n const errorMsg = message ?? `Must be at most ${max}`;\n return numValue > max ? errorMsg : null;\n };\n}\nexport function compose(validators) {\n return (value) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) {\n return error;\n }\n }\n return null;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9jb3JlL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMEJBLE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBTyxHQUFHLFVBQVU7SUFDM0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBaUJELE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBTyxHQUFHLGVBQWU7SUFDN0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxPQUFPLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUMsQ0FBQztBQUNKLENBQUM7QUFtQkQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7SUFDckQsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQztRQUNwRCxPQUFPLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQW1CRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxPQUFnQjtJQUNyRCxPQUFPLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBZSxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDO1FBQ3BELE9BQU8sUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBbUJELE1BQU0sVUFBVSxPQUFPLENBQ3JCLEtBQWEsRUFDYixPQUFPLEdBQUcsZ0JBQWdCO0lBRTFCLE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFlLENBQUM7UUFDakMsT0FBTyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBbUJELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLE9BQWdCO0lBQy9DLE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFlLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUN0RCxPQUFPLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFtQkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7SUFDL0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ3JELE9BQU8sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXFCRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFVBQTRCO0lBQ2xELE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVHJlZS1zaGFrZWFibGUgdmFsaWRhdG9yIGZ1bmN0aW9ucyBmb3IgZm9ybSBmaWVsZHNcbiAqXG4gKiBUaGVzZSB2YWxpZGF0b3JzIGFyZSBleHBvcnRlZCBhcyBpbmRpdmlkdWFsIGZ1bmN0aW9ucyB0byBlbmFibGVcbiAqIHRyZWUtc2hha2luZy4gT25seSB0aGUgdmFsaWRhdG9ycyB5b3UgYWN0dWFsbHkgdXNlIHdpbGwgYmUgaW5jbHVkZWRcbiAqIGluIHlvdXIgYnVuZGxlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmllbGRWYWxpZGF0b3IgfSBmcm9tICcuL25nLWZvcm1zJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVxdWlyZWQgZmllbGQgdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBDdXN0b20gZXJyb3IgbWVzc2FnZSAoZGVmYXVsdDogXCJSZXF1aXJlZFwiKVxuICogQHJldHVybnMgVmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlcnJvciBtZXNzYWdlIGlmIHZhbHVlIGlzIGZhbHN5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIG5hbWU6IHJlcXVpcmVkKCksXG4gKiAgICAgZW1haWw6IHJlcXVpcmVkKCdFbWFpbCBpcyByZXF1aXJlZCcpXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlID0gJ1JlcXVpcmVkJyk6IEZpZWxkVmFsaWRhdG9yIHtcbiAgcmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4gKCF2YWx1ZSA/IG1lc3NhZ2UgOiBudWxsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVtYWlsIGZvcm1hdCB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIChkZWZhdWx0OiBcIkludmFsaWQgZW1haWxcIilcbiAqIEByZXR1cm5zIFZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgQCBzeW1ib2xcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY3JlYXRlRm9ybVRyZWUoZGF0YSwge1xuICogICB2YWxpZGF0b3JzOiB7XG4gKiAgICAgZW1haWw6IGVtYWlsKCdQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJylcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2UgPSAnSW52YWxpZCBlbWFpbCcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXN0clZhbHVlLmluY2x1ZGVzKCdAJykgPyBtZXNzYWdlIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWluaW11bSBsZW5ndGggdmFsaWRhdG9yIGZvciBzdHJpbmdzXG4gKlxuICogQHBhcmFtIG1pbiAtIE1pbmltdW0gcmVxdWlyZWQgbGVuZ3RoXG4gKiBAcGFyYW0gbWVzc2FnZSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3Mgc3RyaW5nIGxlbmd0aFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICBwYXNzd29yZDogbWluTGVuZ3RoKDgpLFxuICogICAgIGRlc2NyaXB0aW9uOiBtaW5MZW5ndGgoMTAsICdEZXNjcmlwdGlvbiBtdXN0IGJlIGF0IGxlYXN0IDEwIGNoYXJhY3RlcnMnKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluTGVuZ3RoKG1pbjogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3Qgc3RyVmFsdWUgPSB2YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBtZXNzYWdlID8/IGBNaW4gJHttaW59IGNoYXJhY3RlcnNgO1xuICAgIHJldHVybiBzdHJWYWx1ZSAmJiBzdHJWYWx1ZS5sZW5ndGggPCBtaW4gPyBlcnJvck1zZyA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1heGltdW0gbGVuZ3RoIHZhbGlkYXRvciBmb3Igc3RyaW5nc1xuICpcbiAqIEBwYXJhbSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAcGFyYW0gbWVzc2FnZSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3Mgc3RyaW5nIGxlbmd0aFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICB1c2VybmFtZTogbWF4TGVuZ3RoKDIwKSxcbiAqICAgICBiaW86IG1heExlbmd0aCg1MDAsICdCaW8gbXVzdCBiZSB1bmRlciA1MDAgY2hhcmFjdGVycycpXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhMZW5ndGgobWF4OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBlcnJvck1zZyA9IG1lc3NhZ2UgPz8gYE1heCAke21heH0gY2hhcmFjdGVyc2A7XG4gICAgcmV0dXJuIHN0clZhbHVlICYmIHN0clZhbHVlLmxlbmd0aCA+IG1heCA/IGVycm9yTXNnIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVnZXggcGF0dGVybiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gcmVnZXggLSBSZWd1bGFyIGV4cHJlc3Npb24gdG8gdGVzdCBhZ2FpbnN0XG4gKiBAcGFyYW0gbWVzc2FnZSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIChkZWZhdWx0OiBcIkludmFsaWQgZm9ybWF0XCIpXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCB0ZXN0cyB2YWx1ZSBhZ2FpbnN0IHJlZ2V4XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIHBob25lOiBwYXR0ZXJuKC9eXFxkezN9LVxcZHszfS1cXGR7NH0kLywgJ1Bob25lIG11c3QgYmUgaW4gZm9ybWF0OiAxMjMtNDU2LTc4OTAnKSxcbiAqICAgICB6aXBDb2RlOiBwYXR0ZXJuKC9eXFxkezV9JC8sICdaaXAgY29kZSBtdXN0IGJlIDUgZGlnaXRzJylcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdHRlcm4oXG4gIHJlZ2V4OiBSZWdFeHAsXG4gIG1lc3NhZ2UgPSAnSW52YWxpZCBmb3JtYXQnXG4pOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXJlZ2V4LnRlc3Qoc3RyVmFsdWUpID8gbWVzc2FnZSA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1pbmltdW0gdmFsdWUgdmFsaWRhdG9yIGZvciBudW1iZXJzXG4gKlxuICogQHBhcmFtIG1pbiAtIE1pbmltdW0gYWxsb3dlZCB2YWx1ZVxuICogQHBhcmFtIG1lc3NhZ2UgLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQHJldHVybnMgVmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIG51bWVyaWMgbWluaW11bVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICBhZ2U6IG1pbigxOCwgJ011c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkJyksXG4gKiAgICAgcXVhbnRpdHk6IG1pbigxKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluKG1pbjogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSB2YWx1ZSBhcyBudW1iZXI7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBtZXNzYWdlID8/IGBNdXN0IGJlIGF0IGxlYXN0ICR7bWlufWA7XG4gICAgcmV0dXJuIG51bVZhbHVlIDwgbWluID8gZXJyb3JNc2cgOiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXhpbXVtIHZhbHVlIHZhbGlkYXRvciBmb3IgbnVtYmVyc1xuICpcbiAqIEBwYXJhbSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBwYXJhbSBtZXNzYWdlIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIFZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBudW1lcmljIG1heGltdW1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY3JlYXRlRm9ybVRyZWUoZGF0YSwge1xuICogICB2YWxpZGF0b3JzOiB7XG4gKiAgICAgYWdlOiBtYXgoMTIwLCAnTXVzdCBiZSB1bmRlciAxMjAgeWVhcnMgb2xkJyksXG4gKiAgICAgcXVhbnRpdHk6IG1heCgxMDApXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgobWF4OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IHZhbHVlIGFzIG51bWJlcjtcbiAgICBjb25zdCBlcnJvck1zZyA9IG1lc3NhZ2UgPz8gYE11c3QgYmUgYXQgbW9zdCAke21heH1gO1xuICAgIHJldHVybiBudW1WYWx1ZSA+IG1heCA/IGVycm9yTXNnIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBtdWx0aXBsZSB2YWxpZGF0b3JzIGludG8gYSBzaW5nbGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHZhbGlkYXRvcnMgLSBBcnJheSBvZiB2YWxpZGF0b3IgZnVuY3Rpb25zIHRvIGNvbWJpbmVcbiAqIEByZXR1cm5zIENvbWJpbmVkIHZhbGlkYXRvciB0aGF0IHJldHVybnMgdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIGVtYWlsOiBjb21wb3NlKFtcbiAqICAgICAgIHJlcXVpcmVkKCdFbWFpbCBpcyByZXF1aXJlZCcpLFxuICogICAgICAgZW1haWwoJ0ludmFsaWQgZW1haWwgZm9ybWF0JyksXG4gKiAgICAgICBwYXR0ZXJuKC9AY29tcGFueVxcLmNvbSQvLCAnTXVzdCBiZSBhIGNvbXBhbnkgZW1haWwnKVxuICogICAgIF0pXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlKHZhbGlkYXRvcnM6IEZpZWxkVmFsaWRhdG9yW10pOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiB2YWxpZGF0b3JzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cbiJdfQ==","import { firstValueFrom, isObservable } from 'rxjs';\nexport function unique(checkFn, message = 'Already exists') {\n return async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n };\n}\nexport function debounce(validator, delayMs) {\n let timeoutId;\n return async (value) => {\n return new Promise((resolve) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(async () => {\n const maybeAsync = validator(value);\n const result = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n resolve(result);\n }, delayMs);\n });\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9jb3JlL2FzeW5jLXZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUErQnBELE1BQU0sVUFBVSxNQUFNLENBQ3BCLE9BQTZDLEVBQzdDLE9BQU8sR0FBRyxnQkFBZ0I7SUFFMUIsT0FBTyxLQUFLLEVBQUUsS0FBYyxFQUFFLEVBQUU7UUFDOUIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXFCRCxNQUFNLFVBQVUsUUFBUSxDQUN0QixTQUE0QyxFQUM1QyxPQUFlO0lBRWYsSUFBSSxTQUF3QyxDQUFDO0lBRTdDLE9BQU8sS0FBSyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDaEMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUNyQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDO29CQUNsQyxDQUFDLENBQUMsTUFBTSxVQUFVLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBUcmVlLXNoYWtlYWJsZSBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb25zIGZvciBmb3JtIGZpZWxkc1xuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuIH0gZnJvbSAnLi9uZy1mb3Jtcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhc3luYyB1bmlxdWVuZXNzIHZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSBjaGVja0ZuIC0gQXN5bmMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdmFsdWUgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSBtZXNzYWdlIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgKGRlZmF1bHQ6IFwiQWxyZWFkeSBleGlzdHNcIilcbiAqIEByZXR1cm5zIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIGFzeW5jVmFsaWRhdG9yczoge1xuICogICAgIGVtYWlsOiB1bmlxdWUoXG4gKiAgICAgICBhc3luYyAoZW1haWwpID0+IHtcbiAqICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9jaGVjay1lbWFpbD9lbWFpbD0ke2VtYWlsfWApO1xuICogICAgICAgICBjb25zdCB7IGV4aXN0cyB9ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICogICAgICAgICByZXR1cm4gZXhpc3RzO1xuICogICAgICAgfSxcbiAqICAgICAgICdUaGlzIGVtYWlsIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCdcbiAqICAgICApXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoXG4gIGNoZWNrRm46ICh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgbWVzc2FnZSA9ICdBbHJlYWR5IGV4aXN0cydcbik6IEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPiB7XG4gIHJldHVybiBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBjaGVja0ZuKHZhbHVlKTtcbiAgICByZXR1cm4gZXhpc3RzID8gbWVzc2FnZSA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBhc3luYyB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIGFzeW5jIHZhbGlkYXRvciB0byBkZWJvdW5jZVxuICogQHBhcmFtIGRlbGF5TXMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHJ1bm5pbmcgdmFsaWRhdGlvblxuICogQHJldHVybnMgRGVib3VuY2VkIGFzeW5jIHZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIGFzeW5jVmFsaWRhdG9yczoge1xuICogICAgIHVzZXJuYW1lOiBkZWJvdW5jZShcbiAqICAgICAgIHVuaXF1ZShjaGVja1VzZXJuYW1lLCAnVXNlcm5hbWUgdGFrZW4nKSxcbiAqICAgICAgIDUwMCAvLyBXYWl0IDUwMG1zIGFmdGVyIHVzZXIgc3RvcHMgdHlwaW5nXG4gKiAgICAgKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2UoXG4gIHZhbGlkYXRvcjogRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+LFxuICBkZWxheU1zOiBudW1iZXJcbik6IEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPiB7XG4gIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG4gIHJldHVybiBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1heWJlQXN5bmMgPSB2YWxpZGF0b3IodmFsdWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpc09ic2VydmFibGUobWF5YmVBc3luYylcbiAgICAgICAgICA/IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1heWJlQXN5bmMpXG4gICAgICAgICAgOiBhd2FpdCBtYXliZUFzeW5jO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9LCBkZWxheU1zKTtcbiAgICB9KTtcbiAgfTtcbn1cbiJdfQ==","import { signal } from '@angular/core';\nimport { deepClone, snapshotsEqual } from '@signaltree/shared';\nexport function withFormHistory(formTree, options = {}) {\n const capacity = Math.max(1, options.capacity ?? 10);\n const historySignal = signal({\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n }, ...(ngDevMode ? [{ debugName: \"historySignal\" }] : []));\n let recording = true;\n let suppressUpdates = 0;\n let internalHistory = {\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n };\n const subscription = formTree.form.valueChanges.subscribe(() => {\n if (suppressUpdates > 0) {\n suppressUpdates--;\n return;\n }\n if (!recording) {\n internalHistory = {\n ...internalHistory,\n present: deepClone(formTree.form.getRawValue()),\n };\n return;\n }\n const snapshot = deepClone(formTree.form.getRawValue());\n if (snapshotsEqual(internalHistory.present, snapshot)) {\n internalHistory = {\n ...internalHistory,\n present: snapshot,\n };\n historySignal.set(cloneHistory(internalHistory));\n return;\n }\n const updatedPast = [...internalHistory.past, internalHistory.present];\n if (updatedPast.length > capacity) {\n updatedPast.shift();\n }\n internalHistory = {\n past: updatedPast,\n present: snapshot,\n future: [],\n };\n historySignal.set(cloneHistory(internalHistory));\n });\n const originalDestroy = formTree.destroy;\n formTree.destroy = () => {\n subscription.unsubscribe();\n originalDestroy();\n };\n const undo = () => {\n const history = historySignal();\n if (history.past.length === 0) {\n return;\n }\n const previous = deepClone(history.past[history.past.length - 1]);\n recording = false;\n suppressUpdates++;\n formTree.setValues(previous);\n recording = true;\n internalHistory = {\n past: history.past.slice(0, -1),\n present: previous,\n future: [history.present, ...history.future],\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n const redo = () => {\n const history = historySignal();\n if (history.future.length === 0) {\n return;\n }\n const next = deepClone(history.future[0]);\n recording = false;\n suppressUpdates++;\n formTree.setValues(next);\n recording = true;\n internalHistory = {\n past: [...history.past, history.present],\n present: next,\n future: history.future.slice(1),\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n const clearHistory = () => {\n internalHistory = {\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n function cloneHistory(state) {\n return {\n past: state.past.map((entry) => deepClone(entry)),\n present: deepClone(state.present),\n future: state.future.map((entry) => deepClone(entry)),\n };\n }\n return Object.assign(formTree, {\n undo,\n redo,\n clearHistory,\n history: historySignal.asReadonly(),\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9oaXN0b3J5L2hpc3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBNEMvRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUFxQixFQUNyQixVQUFpQyxFQUFFO0lBT25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFpQjtRQUMzQyxJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQU8sQ0FBQztRQUNwRCxNQUFNLEVBQUUsRUFBRTtLQUNYLHlEQUFDLENBQUM7SUFFSCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDckIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksZUFBZSxHQUFtQjtRQUNwQyxJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQU8sQ0FBQztRQUNwRCxNQUFNLEVBQUUsRUFBRTtLQUNYLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQzdELElBQUksZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2Ys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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVlcENsb25lLCBzbmFwc2hvdHNFcXVhbCB9IGZyb20gJ0BzaWduYWx0cmVlL3NoYXJlZCc7XG5cbi8vIExvY2FsIHR5cGUgZGVmaW5pdGlvbiB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRzIGluIHNlY29uZGFyeSBlbnRyeSBwb2ludHNcbmludGVyZmFjZSBGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZm9ybTogYW55OyAvLyBGb3JtR3JvdXBcbiAgdW53cmFwKCk6IFQ7XG4gIGRlc3Ryb3koKTogdm9pZDtcbiAgc2V0VmFsdWVzKHZhbHVlczogUGFydGlhbDxUPik6IHZvaWQ7XG59XG5cbi8qKlxuICogRm9ybSBoaXN0b3J5IHN0YXRlIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1IaXN0b3J5PFQ+IHtcbiAgcGFzdDogVFtdO1xuICBwcmVzZW50OiBUO1xuICBmdXR1cmU6IFRbXTtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIEZvcm1UcmVlIHdpdGggdW5kby9yZWRvIGNhcGFiaWxpdGllcy5cbiAqIFByb3ZpZGVzIGZvcm0tc3BlY2lmaWMgaGlzdG9yeSBtYW5hZ2VtZW50IHdpdGggY2FwYWNpdHkgbGltaXRzIGFuZCBjaGFuZ2UgdHJhY2tpbmcuXG4gKlxuICogQHBhcmFtIGZvcm1UcmVlIC0gVGhlIGZvcm0gdHJlZSB0byBlbmhhbmNlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMuY2FwYWNpdHkgLSBNYXhpbXVtIG51bWJlciBvZiBoaXN0b3J5IGVudHJpZXMgKGRlZmF1bHQ6IDEwKVxuICogQHJldHVybnMgRXh0ZW5kZWQgRm9ybVRyZWUgd2l0aCB1bmRvLCByZWRvLCBhbmQgaGlzdG9yeSBhY2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1UcmVlKHsgbmFtZTogJycsIGVtYWlsOiAnJyB9KTtcbiAqIGNvbnN0IGZvcm1XaXRoSGlzdG9yeSA9IHdpdGhGb3JtSGlzdG9yeShmb3JtLCB7IGNhcGFjaXR5OiAyMCB9KTtcbiAqXG4gKiBmb3JtLiQubmFtZS5zZXQoJ0pvaG4nKTtcbiAqIGZvcm0uJC5lbWFpbC5zZXQoJ2pvaG5AZXhhbXBsZS5jb20nKTtcbiAqXG4gKiBmb3JtV2l0aEhpc3RvcnkudW5kbygpOyAvLyBSZXZlcnRzIGVtYWlsIGNoYW5nZVxuICogZm9ybVdpdGhIaXN0b3J5LnVuZG8oKTsgLy8gUmV2ZXJ0cyBuYW1lIGNoYW5nZVxuICogZm9ybVdpdGhIaXN0b3J5LnJlZG8oKTsgLy8gUmVhcHBsaWVzIG5hbWUgY2hhbmdlXG4gKlxuICogY29uc29sZS5sb2coZm9ybVdpdGhIaXN0b3J5Lmhpc3RvcnkoKS5wYXN0Lmxlbmd0aCk7IC8vIDFcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aEZvcm1IaXN0b3J5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIGZvcm1UcmVlOiBGb3JtVHJlZTxUPixcbiAgb3B0aW9uczogeyBjYXBhY2l0eT86IG51bWJlciB9ID0ge31cbik6IEZvcm1UcmVlPFQ+ICYge1xuICB1bmRvOiAoKSA9PiB2b2lkO1xuICByZWRvOiAoKSA9PiB2b2lkO1xuICBjbGVhckhpc3Rvcnk6ICgpID0+IHZvaWQ7XG4gIGhpc3Rvcnk6IFNpZ25hbDxGb3JtSGlzdG9yeTxUPj47XG59IHtcbiAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLm1heCgxLCBvcHRpb25zLmNhcGFjaXR5ID8/IDEwKTtcbiAgY29uc3QgaGlzdG9yeVNpZ25hbCA9IHNpZ25hbDxGb3JtSGlzdG9yeTxUPj4oe1xuICAgIHBhc3Q6IFtdLFxuICAgIHByZXNlbnQ6IGRlZXBDbG9uZShmb3JtVHJlZS5mb3JtLmdldFJhd1ZhbHVlKCkgYXMgVCksXG4gICAgZnV0dXJlOiBbXSxcbiAgfSk7XG5cbiAgbGV0IHJlY29yZGluZyA9IHRydWU7XG4gIGxldCBzdXBwcmVzc1VwZGF0ZXMgPSAwO1xuICBsZXQgaW50ZXJuYWxIaXN0b3J5OiBGb3JtSGlzdG9yeTxUPiA9IHtcbiAgICBwYXN0OiBbXSxcbiAgICBwcmVzZW50OiBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpLFxuICAgIGZ1dHVyZTogW10sXG4gIH07XG5cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gZm9ybVRyZWUuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICBpZiAoc3VwcHJlc3NVcGRhdGVzID4gMCkge1xuICAgICAgc3VwcHJlc3NVcGRhdGVzLS07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZWNvcmRpbmcpIHtcbiAgICAgIGludGVybmFsSGlzdG9yeSA9IHtcbiAgICAgICAgLi4uaW50ZXJuYWxIaXN0b3J5LFxuICAgICAgICBwcmVzZW50OiBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc25hcHNob3QgPSBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpO1xuICAgIGlmIChzbmFwc2hvdHNFcXVhbChpbnRlcm5hbEhpc3RvcnkucHJlc2VudCwgc25hcHNob3QpKSB7XG4gICAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICAgIC4uLmludGVybmFsSGlzdG9yeSxcbiAgICAgICAgcHJlc2VudDogc25hcHNob3QsXG4gICAgICB9O1xuICAgICAgaGlzdG9yeVNpZ25hbC5zZXQoY2xvbmVIaXN0b3J5KGludGVybmFsSGlzdG9yeSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkUGFzdCA9IFsuLi5pbnRlcm5hbEhpc3RvcnkucGFzdCwgaW50ZXJuYWxIaXN0b3J5LnByZXNlbnRdO1xuICAgIGlmICh1cGRhdGVkUGFzdC5sZW5ndGggPiBjYXBhY2l0eSkge1xuICAgICAgdXBkYXRlZFBhc3Quc2hpZnQoKTtcbiAgICB9XG4gICAgaW50ZXJuYWxIaXN0b3J5ID0ge1xuICAgICAgcGFzdDogdXBkYXRlZFBhc3QsXG4gICAgICBwcmVzZW50OiBzbmFwc2hvdCxcbiAgICAgIGZ1dHVyZTogW10sXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH0pO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGZvcm1UcmVlLmRlc3Ryb3k7XG4gIGZvcm1UcmVlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gIH07XG5cbiAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICBjb25zdCBoaXN0b3J5ID0gaGlzdG9yeVNpZ25hbCgpO1xuICAgIGlmIChoaXN0b3J5LnBhc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzID0gZGVlcENsb25lKGhpc3RvcnkucGFzdFtoaXN0b3J5LnBhc3QubGVuZ3RoIC0gMV0pO1xuICAgIHJlY29yZGluZyA9IGZhbHNlO1xuICAgIHN1cHByZXNzVXBkYXRlcysrO1xuICAgIGZvcm1UcmVlLnNldFZhbHVlcyhwcmV2aW91cyk7XG4gICAgcmVjb3JkaW5nID0gdHJ1ZTtcbiAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICBwYXN0OiBoaXN0b3J5LnBhc3Quc2xpY2UoMCwgLTEpLFxuICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICBmdXR1cmU6IFtoaXN0b3J5LnByZXNlbnQsIC4uLmhpc3RvcnkuZnV0dXJlXSxcbiAgICB9O1xuICAgIGhpc3RvcnlTaWduYWwuc2V0KGNsb25lSGlzdG9yeShpbnRlcm5hbEhpc3RvcnkpKTtcbiAgfTtcblxuICBjb25zdCByZWRvID0gKCkgPT4ge1xuICAgIGNvbnN0IGhpc3RvcnkgPSBoaXN0b3J5U2lnbmFsKCk7XG4gICAgaWYgKGhpc3RvcnkuZnV0dXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gZGVlcENsb25lKGhpc3RvcnkuZnV0dXJlWzBdKTtcbiAgICByZWNvcmRpbmcgPSBmYWxzZTtcbiAgICBzdXBwcmVzc1VwZGF0ZXMrKztcbiAgICBmb3JtVHJlZS5zZXRWYWx1ZXMobmV4dCk7XG4gICAgcmVjb3JkaW5nID0gdHJ1ZTtcbiAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICBwYXN0OiBbLi4uaGlzdG9yeS5wYXN0LCBoaXN0b3J5LnByZXNlbnRdLFxuICAgICAgcHJlc2VudDogbmV4dCxcbiAgICAgIGZ1dHVyZTogaGlzdG9yeS5mdXR1cmUuc2xpY2UoMSksXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYXJIaXN0b3J5ID0gKCkgPT4ge1xuICAgIGludGVybmFsSGlzdG9yeSA9IHtcbiAgICAgIHBhc3Q6IFtdLFxuICAgICAgcHJlc2VudDogZGVlcENsb25lKGZvcm1UcmVlLmZvcm0uZ2V0UmF3VmFsdWUoKSBhcyBUKSxcbiAgICAgIGZ1dHVyZTogW10sXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gY2xvbmVIaXN0b3J5KHN0YXRlOiBGb3JtSGlzdG9yeTxUPik6IEZvcm1IaXN0b3J5PFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFzdDogc3RhdGUucGFzdC5tYXAoKGVudHJ5KSA9PiBkZWVwQ2xvbmUoZW50cnkpKSxcbiAgICAgIHByZXNlbnQ6IGRlZXBDbG9uZShzdGF0ZS5wcmVzZW50KSxcbiAgICAgIGZ1dHVyZTogc3RhdGUuZnV0dXJlLm1hcCgoZW50cnkpID0+IGRlZXBDbG9uZShlbnRyeSkpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihmb3JtVHJlZSwge1xuICAgIHVuZG8sXG4gICAgcmVkbyxcbiAgICBjbGVhckhpc3RvcnksXG4gICAgaGlzdG9yeTogaGlzdG9yeVNpZ25hbC5hc1JlYWRvbmx5KCksXG4gIH0pO1xufVxuIl19"],"names":[],"mappings":";;;;;;;AAMO,MAAM,mBAAmB,SAAS,KAAK,CAAC;AAC/C,IAAI,MAAM;AACV,IAAI,WAAW;AACf,IAAI,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE;AACrC,QAAQ,KAAK,CAAC,wBAAwB,CAAC;AACvC,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM;AAC5B,QAAQ,IAAI,CAAC,WAAW,GAAG,WAAW;AACtC,QAAQ,IAAI,CAAC,IAAI,GAAG,qBAAqB;AACzC,IAAI;AACJ;AACA,MAAM,cAAc,GAAG,YAAY;AACnC,MAAM,eAAe,GAAG,iBAAiB;AAClC,SAAS,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,EAAE,EAAE;AAC3D,IAAI,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,EAAE,EAAE,eAAe,EAAE,mBAAmB,GAAG,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,GAAG,GAAG,EAAE,iBAAiB,GAAG,CAAC,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM;AAC3P,IAAI,MAAM,cAAc,GAAG,uBAAuB,CAAC,cAAc,EAAE,YAAY,CAAC;AAChF,IAAI,MAAM,eAAe,GAAG,wBAAwB,CAAC,mBAAmB,EAAE,YAAY,CAAC;AACvF,IAAI,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAG,oBAAoB,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC;AACtG,IAAI,MAAM,eAAe,GAAG,SAAS,CAAC,qBAAqB,CAAC;AAC5D,IAAI,MAAM,UAAU,GAAG,UAAU,CAAC,qBAAqB,EAAE,UAAU,CAAC;AACpE,IAAI,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC;AACpC,IAAI,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK;AAC3C,IAAI,wBAAwB,CAAC,cAAc,CAAC;AAC5C,IAAI,MAAM,SAAS,GAAG,qBAAqB,CAAC,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE,eAAe,CAAC;AACvG,IAAI,MAAM,UAAU,GAAG,kBAAkB,IAAI,mBAAmB,EAAE;AAClE,IAAI,MAAM,gBAAgB,GAAG,EAAE;AAC/B,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9E,IAAI,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxF,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAChF,IAAI,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAChG,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzF,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/G,IAAI,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzF,IAAI,MAAM,aAAa,GAAG,MAAM;AAChC,QAAQ,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,CAAC;AAC1D,QAAQ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;AACvC,QAAQ,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC7C,QAAQ,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;AACrC,QAAQ,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC7C,QAAQ,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;AAClC,QAAQ,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACxD,IAAI,CAAC;AACL,IAAI,IAAI,YAAY,GAAG,IAAI;AAC3B,IAAI,MAAM,iBAAiB,GAAG,CAAC,SAAS,GAAG,KAAK,KAAK;AACrD,QAAQ,IAAI,SAAS,IAAI,iBAAiB,IAAI,CAAC,EAAE;AACjD,YAAY,IAAI,YAAY,EAAE;AAC9B,gBAAgB,YAAY,CAAC,YAAY,CAAC;AAC1C,gBAAgB,YAAY,GAAG,IAAI;AACnC,YAAY;AACZ,YAAY,aAAa,EAAE;AAC3B,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,YAAY,EAAE;AAC1B,YAAY,YAAY,CAAC,YAAY,CAAC;AACtC,QAAQ;AACR,QAAQ,YAAY,GAAG,UAAU,CAAC,MAAM;AACxC,YAAY,YAAY,GAAG,IAAI;AAC/B,YAAY,aAAa,EAAE;AAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;AAC7B,IAAI,CAAC;AACL,IAAI,iBAAiB,CAAC,IAAI,CAAC;AAC3B,IAAI,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;AAC1H,IAAI,iBAAiB,CAAC,kBAAkB,EAAE;AAC1C,IAAI,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;AACnC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;AACtC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;AACvC,KAAK,CAAC;AACN,IAAI,MAAM,WAAW,GAAG,EAAE;AAC1B,IAAI,MAAM,gBAAgB,GAAG,EAAE;AAC/B,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK;AAC1C,QAAQ,WAAW,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;AACpE,QAAQ,gBAAgB,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;AAC9E,IAAI,CAAC,CAAC;AACN,IAAI,MAAM,iBAAiB,GAAG,CAAC,IAAI,KAAK,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC;AAC9E,IAAI,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK;AACvD,QAAQ,IAAI,OAAO,YAAY,SAAS,EAAE;AAC1C,YAAY,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;AACvE,gBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnE,YAAY,CAAC,CAAC;AACd,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,OAAO,YAAY,SAAS,EAAE;AAC1C,YAAY,MAAM,WAAW,GAAG,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC;AACrE,YAAY,IAAI,WAAW,EAAE;AAC7B,gBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,CAAC;AACjJ,YAAY;AACZ,YAAY,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK;AACvD,gBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7E,YAAY,CAAC,CAAC;AACd,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,YAAY,GAAG,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC;AAClE,QAAQ,IAAI,YAAY,EAAE;AAC1B,YAAY,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACrG,QAAQ;AACR,IAAI,CAAC;AACL,IAAI,uBAAuB,CAAC,SAAS,EAAE,EAAE,CAAC;AAC1C,IAAI,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAE;AACtC,IAAI,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,GAAG;AACpD,UAAU,MAAM;AAChB,YAAY,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE;AAClD,YAAY,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;AACvD,gBAAgB,IAAI,OAAO,GAAG,IAAI;AAClC,gBAAgB,IAAI;AACpB,oBAAoB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;AAC1C,gBAAgB;AAChB,gBAAgB,MAAM;AACtB,oBAAoB,OAAO,GAAG,IAAI;AAClC,gBAAgB;AAChB,gBAAgB,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK;AAC9C,oBAAoB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC5D,oBAAoB,IAAI,CAAC,OAAO,EAAE;AAClC,wBAAwB;AACxB,oBAAoB;AACpB,oBAAoB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;AACpE,oBAAoB,IAAI,QAAQ,KAAK,OAAO,EAAE;AAC9C,wBAAwB;AACxB,oBAAoB;AACpB,oBAAoB,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;AAC5D,oBAAoB,IAAI,OAAO,EAAE;AACjC,wBAAwB,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC5D,oBAAoB;AACpB,yBAAyB;AACzB,wBAAwB,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC7D,oBAAoB;AACpB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ;AACR,UAAU,MAAM,SAAS;AACzB,IAAI,iBAAiB,EAAE;AACvB,IAAI,MAAM,sBAAsB,GAAG,EAAE;AACrC,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM;AACvE,QAAQ,iBAAiB,EAAE;AAC3B,QAAQ,iBAAiB,CAAC,eAAe,EAAE;AAC3C,QAAQ,iBAAiB,EAAE;AAC3B,IAAI,CAAC,CAAC,CAAC;AACP,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;AAC7F,IAAI,IAAI,SAAS,CAAC,MAAM,EAAE;AAC1B,QAAQ,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;AAC1F,IAAI;AACJ,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM;AAChC,QAAQ,sBAAsB,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;AAClE,QAAQ,IAAI,YAAY,EAAE;AAC1B,YAAY,YAAY,CAAC,YAAY,CAAC;AACtC,QAAQ;AACR,IAAI,CAAC,CAAC;AACN,IAAI,IAAI,UAAU,EAAE;AACpB,QAAQ,UAAU,CAAC,SAAS,CAAC,MAAM;AACnC,YAAY,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAC5D,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ,IAAI,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK;AACvC,QAAQ,MAAM,YAAY,GAAG,eAAe,CAAC,cAAc,EAAE,KAAK,CAAC;AACnE,QAAQ,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5C,QAAQ,IAAI,YAAY,IAAI,KAAK,IAAI,YAAY,EAAE;AACnD,YAAY,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,QAAQ;AACR,aAAa,IAAI,OAAO,EAAE;AAC1B,YAAY,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACxD,QAAQ;AACR,QAAQ,IAAI,OAAO,EAAE;AACrB,YAAY,MAAM,cAAc,GAAG,OAAO;AAC1C,YAAY,cAAc,CAAC,aAAa,EAAE;AAC1C,YAAY,cAAc,CAAC,WAAW,EAAE;AACxC,YAAY,cAAc,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACtE,QAAQ;AACR,QAAQ,iBAAiB,CAAC,IAAI,CAAC;AAC/B,QAAQ,iBAAiB,CAAC,eAAe,EAAE;AAC3C,IAAI,CAAC;AACL,IAAI,MAAM,SAAS,GAAG,CAAC,MAAM,KAAK;AAClC,QAAQ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;AACzD,YAAY,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;AAChC,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC;AACL,IAAI,MAAM,KAAK,GAAG,MAAM;AACxB,QAAQ,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC;AACxC,QAAQ,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAQ,iBAAiB,CAAC,IAAI,CAAC;AAC/B,QAAQ,iBAAiB,CAAC,kBAAkB,EAAE;AAC9C,QAAQ,iBAAiB,EAAE;AAC3B,IAAI,CAAC;AACL,IAAI,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK;AACtC,QAAQ,IAAI,KAAK,EAAE;AACnB,YAAY,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAChD,YAAY,IAAI,CAAC,OAAO,EAAE;AAC1B,gBAAgB;AAChB,YAAY;AACZ,YAAY,OAAO,CAAC,aAAa,EAAE;AACnC,YAAY,OAAO,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/D,YAAY,iBAAiB,CAAC,IAAI,CAAC;AACnC,YAAY,MAAM,cAAc,CAAC,OAAO,CAAC;AACzC,YAAY,iBAAiB,CAAC,IAAI,CAAC;AACnC,YAAY;AACZ,QAAQ;AACR,QAAQ,SAAS,CAAC,gBAAgB,EAAE;AACpC,QAAQ,SAAS,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7D,QAAQ,iBAAiB,CAAC,IAAI,CAAC;AAC/B,QAAQ,MAAM,cAAc,CAAC,SAAS,CAAC;AACvC,QAAQ,iBAAiB,CAAC,IAAI,CAAC;AAC/B,IAAI,CAAC;AACL,IAAI,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK;AACvC,QAAQ,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAQ,IAAI;AACZ,YAAY,MAAM,QAAQ,EAAE;AAC5B,YAAY,IAAI,CAAC,KAAK,EAAE,EAAE;AAC1B,gBAAgB,MAAM,IAAI,mBAAmB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC;AACtE,YAAY;AACZ,YAAY,MAAM,aAAa,GAAG,SAAS,CAAC,WAAW,EAAE;AACzD,YAAY,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC;AACxD,YAAY,OAAO,MAAM;AACzB,QAAQ;AACR,gBAAgB;AAChB,YAAY,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,YAAY,iBAAiB,CAAC,IAAI,CAAC;AACnC,QAAQ;AACR,IAAI,CAAC;AACL,IAAI,MAAM,OAAO,GAAG,MAAM;AAC1B,QAAQ,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACxD,IAAI,CAAC;AACL,IAAI,MAAM,QAAQ,GAAG;AACrB,QAAQ,KAAK,EAAE,cAAc;AAC7B,QAAQ,CAAC,EAAE,cAAc;AACzB,QAAQ,IAAI,EAAE,SAAS;AACvB,QAAQ,MAAM;AACd,QAAQ,WAAW;AACnB,QAAQ,OAAO;AACf,QAAQ,eAAe;AACvB,QAAQ,KAAK;AACb,QAAQ,KAAK;AACb,QAAQ,UAAU;AAClB,QAAQ,MAAM,EAAE,MAAM,UAAU,EAAE;AAClC,QAAQ,QAAQ;AAChB,QAAQ,SAAS;AACjB,QAAQ,KAAK;AACb,QAAQ,MAAM;AACd,QAAQ,QAAQ;AAChB,QAAQ,aAAa,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,SAAS,CAAC;AACjF,QAAQ,kBAAkB,EAAE,CAAC,KAAK,KAAK,gBAAgB,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,SAAS,CAAC;AAC3F,QAAQ,eAAe,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC;AAC1F,QAAQ,YAAY,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,MAAM;AAChD,YAAY,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAChD,YAAY,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO;AACjE,QAAQ,CAAC,CAAC;AACV,QAAQ,sBAAsB,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;AAC1F,QAAQ,WAAW;AACnB,QAAQ,gBAAgB;AACxB,QAAQ,MAAM,EAAE,UAAU;AAC1B,QAAQ,OAAO;AACf,KAAK;AACL,IAAI,OAAO,QAAQ;AACnB;AACO,SAAS,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,cAAc,GAAG,CAAC,KAAK,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;AAChH,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC;AACjD,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;AACjD,IAAI,MAAM,QAAQ,GAAG;AACrB,SAAS,KAAK,CAAC,KAAK,EAAE,GAAG;AACzB,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AACpE,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC;AAClC;AACA,SAAS,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,OAAO,EAAE,EAAE;AAChE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAC1B,QAAQ;AACR,IAAI;AACJ,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AACpB,IAAI,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;AAC3B,QAAQ,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;AAC9B,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAY,MAAM,WAAW,GAAG,KAAK,EAAE;AACvC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC5C,gBAAgB,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;AAC9C,YAAY;AACZ,QAAQ;AACR,aAAa,IAAI,OAAO,KAAK,KAAK,QAAQ;AAC1C,YAAY,KAAK,KAAK,IAAI;AAC1B,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACnC,YAAY,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC;AACpD,QAAQ;AACR,IAAI;AACJ;AACA,MAAM,YAAY,GAAG,CAAC,WAAW,KAAK;AACtC,IAAI,MAAM,QAAQ,GAAG,WAAW;AAChC,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK;AAC9B,QAAQ,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;AACnD,IAAI,CAAC;AACL,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,KAAK,KAAK;AACnC,QAAQ,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AACtE,IAAI,CAAC;AACL,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK;AACvC,QAAQ,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;AACvF,IAAI,CAAC;AACL,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK;AACzC,QAAQ,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;AACpC,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAClC,YAAY,IAAI;AAChB,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;AAC/B,SAAS,CAAC;AACV,IAAI,CAAC;AACL,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK;AAClC,QAAQ,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;AACpC,YAAY,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC;AACnC,YAAY,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,YAAY,IAAI,IAAI,KAAK,SAAS,EAAE;AACpC,gBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;AAC1C,YAAY;AACZ,YAAY,OAAO,MAAM;AACzB,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC;AACL,IAAI,QAAQ,CAAC,KAAK,GAAG,MAAM;AAC3B,QAAQ,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,IAAI,CAAC;AACL,IAAI,OAAO,QAAQ;AACnB,CAAC;AACD,SAAS,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE;AACrC,IAAI,IAAI,CAAC,IAAI,EAAE;AACf,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC;AACpC,IAAI,IAAI,OAAO,GAAG,IAAI;AACtB,IAAI,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AACpC,QAAQ,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACrD,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AAClC,IAAI;AACJ,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC3B,QAAQ,OAAO,OAAO;AACtB,IAAI;AACJ,IAAI,OAAO,IAAI;AACf;AACA,SAAS,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE;AACnC,IAAI,OAAO,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO;AACpD;AACA,SAAS,iBAAiB,CAAC,SAAS,EAAE;AACtC,IAAI,OAAO,CAAC,OAAO,KAAK;AACxB,QAAQ,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/C,QAAQ,OAAO,MAAM,GAAG,EAAE,CAAC,cAAc,GAAG,MAAM,EAAE,GAAG,IAAI;AAC3D,IAAI,CAAC;AACL;AACA,SAAS,kBAAkB,CAAC,SAAS,EAAE;AACvC,IAAI,OAAO,OAAO,OAAO,KAAK;AAC9B,QAAQ,IAAI;AACZ,YAAY,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AACvD,YAAY,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU;AACpD,kBAAkB,MAAM,cAAc,CAAC,UAAU;AACjD,kBAAkB,MAAM,UAAU;AAClC,YAAY,OAAO,QAAQ,GAAG,EAAE,CAAC,eAAe,GAAG,QAAQ,EAAE,GAAG,IAAI;AACpE,QAAQ;AACR,QAAQ,MAAM;AACd,YAAY,OAAO,EAAE,CAAC,eAAe,GAAG,kBAAkB,EAAE;AAC5D,QAAQ;AACR,IAAI,CAAC;AACL;AACA,SAAS,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE;AACzE,IAAI,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC;AACzD,IAAI,MAAM,cAAc,GAAG,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC;AAC/D,IAAI,MAAM,OAAO,GAAG;AACpB,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC;AAC3C,UAAU,SAAS;AACnB,IAAI,MAAM,QAAQ,GAAG;AACrB,UAAU,CAAC,kBAAkB,CAAC,cAAc,CAAC;AAC7C,UAAU,SAAS;AACnB,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC9B,QAAQ,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAC5I,QAAQ,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AACzD,IAAI;AACJ,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;AAC9B,QAAQ,MAAM,QAAQ,GAAG,EAAE;AAC3B,QAAQ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC1D,YAAY,QAAQ,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC;AAC1G,QAAQ;AACR,QAAQ,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;AACvC,YAAY,UAAU,EAAE,OAAO;AAC/B,YAAY,eAAe,EAAE,QAAQ;AACrC,SAAS,CAAC;AACV,IAAI;AACJ,IAAI,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE;AAClC,QAAQ,UAAU,EAAE,OAAO;AAC3B,QAAQ,eAAe,EAAE,QAAQ;AACjC,QAAQ,WAAW,EAAE,KAAK;AAC1B,KAAK,CAAC;AACN;AACA,SAAS,uBAAuB,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE;AACtF,IAAI,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO;AACxC,IAAI,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE;AAC5C,QAAQ,IAAI;AACZ,YAAY,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;AAC/D,YAAY,IAAI,GAAG;AACnB,gBAAgB,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU,EAAE;AACvD,gBAAgB,gBAAgB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;AAC9D,YAAY;AACZ,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM;AACd,QAAQ;AACR,IAAI;AACJ,IAAI,IAAI,mBAAmB,GAAG,KAAK;AACnC,IAAI,IAAI,kBAAkB,GAAG,KAAK;AAClC,IAAI,IAAI,cAAc,GAAG,CAAC;AAC1B,IAAI,IAAI,kBAAkB,GAAG,CAAC;AAC9B,IAAI,IAAI,oBAAoB,GAAG,IAAI;AACnC,IAAI,MAAM,UAAU,GAAG,WAAW,EAAE,UAAU,IAAI,CAAC;AACnD,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;AACzD,IAAI,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/D,IAAI,MAAM,iBAAiB,GAAG,CAAC,KAAK,KAAK;AACzC,QAAQ,kBAAkB,GAAG,IAAI;AACjC,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;AAC9C,YAAY,MAAM,cAAc,GAAG,OAAO;AAC1C,YAAY,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/D,YAAY,cAAc,CAAC,WAAW,EAAE;AACxC,QAAQ;AACR,QAAQ,kBAAkB,GAAG,KAAK;AAClC,IAAI,CAAC;AACL,IAAI,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK;AACjC,QAAQ,MAAM,cAAc,GAAG,EAAE,cAAc;AAC/C,QAAQ,WAAW,CAAC,KAAK,CAAC;AAC1B,QAAQ,IAAI,mBAAmB,EAAE;AACjC,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,kBAAkB,GAAG,cAAc,EAAE;AACjD,YAAY;AACZ,QAAQ;AACR,QAAQ,iBAAiB,CAAC,KAAK,CAAC;AAChC,IAAI,CAAC;AACL,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,OAAO,KAAK;AACtC,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;AAC3C,QAAQ,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,IAAI,CAAC;AACL,IAAI,MAAM,qBAAqB,GAAG,CAAC,KAAK,KAAK;AAC7C,QAAQ,mBAAmB,GAAG,IAAI;AAClC,QAAQ,kBAAkB,GAAG,EAAE,cAAc;AAC7C,QAAQ,WAAW,CAAC,KAAK,CAAC;AAC1B,QAAQ,mBAAmB,GAAG,KAAK;AACnC,IAAI,CAAC;AACL,IAAI,MAAM,mBAAmB,GAAG,CAAC,KAAK,KAAK;AAC3C,QAAQ,IAAI,kBAAkB,EAAE;AAChC,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,UAAU,GAAG,CAAC,EAAE;AAC5B,YAAY,IAAI,oBAAoB,EAAE;AACtC,gBAAgB,YAAY,CAAC,oBAAoB,CAAC;AAClD,YAAY;AACZ,YAAY,oBAAoB,GAAG,UAAU,CAAC,MAAM;AACpD,gBAAgB,oBAAoB,GAAG,IAAI;AAC3C,gBAAgB,qBAAqB,CAAC,KAAK,CAAC;AAC5C,YAAY,CAAC,EAAE,UAAU,CAAC;AAC1B,YAAY;AACZ,QAAQ;AACR,QAAQ,qBAAqB,CAAC,KAAK,CAAC;AACpC,IAAI,CAAC;AACL,IAAI,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK;AACnE,QAAQ,mBAAmB,CAAC,KAAK,CAAC;AAClC,IAAI,CAAC,CAAC;AACN,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM;AAChC,QAAQ,YAAY,CAAC,WAAW,EAAE;AAClC,QAAQ,WAAW,CAAC,GAAG,GAAG,WAAW;AACrC,QAAQ,WAAW,CAAC,MAAM,GAAG,cAAc;AAC3C,QAAQ,IAAI,oBAAoB,EAAE;AAClC,YAAY,YAAY,CAAC,oBAAoB,CAAC;AAC9C,QAAQ;AACR,IAAI,CAAC,CAAC;AACN;AACA,SAAS,yBAAyB,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE;AACzI,IAAI,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO;AAC1C,IAAI,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE;AAC5C,QAAQ,IAAI;AACZ,YAAY,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;AACjE,YAAY,IAAI,GAAG;AACnB,gBAAgB,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU,EAAE;AACvD,gBAAgB,gBAAgB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;AAC9D,YAAY;AACZ,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM;AACd,QAAQ;AACR,IAAI;AACJ,IAAI,IAAI,mBAAmB,GAAG,KAAK;AACnC,IAAI,IAAI,kBAAkB,GAAG,KAAK;AAClC,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;AACzD,IAAI,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/D,IAAI,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK;AACjC,QAAQ,WAAW,CAAC,KAAK,CAAC;AAC1B,QAAQ,IAAI,mBAAmB,EAAE;AACjC,YAAY;AACZ,QAAQ;AACR,QAAQ,kBAAkB,GAAG,IAAI;AACjC,QAAQ,sBAAsB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,CAAC;AAC5G,QAAQ,SAAS,CAAC,WAAW,EAAE;AAC/B,QAAQ,kBAAkB,GAAG,KAAK;AAClC,IAAI,CAAC;AACL,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,OAAO,KAAK;AACtC,QAAQ,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;AAC3C,QAAQ,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,IAAI,CAAC;AACL,IAAI,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK;AACrE,QAAQ,IAAI,kBAAkB,EAAE;AAChC,YAAY;AACZ,QAAQ;AACR,QAAQ,mBAAmB,GAAG,IAAI;AAClC,QAAQ,WAAW,CAAC,KAAK,CAAC;AAC1B,QAAQ,mBAAmB,GAAG,KAAK;AACnC,IAAI,CAAC,CAAC;AACN,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM;AAChC,QAAQ,YAAY,CAAC,WAAW,EAAE;AAClC,QAAQ,WAAW,CAAC,GAAG,GAAG,WAAW;AACrC,QAAQ,WAAW,CAAC,MAAM,GAAG,cAAc;AAC3C,IAAI,CAAC,CAAC;AACN,IAAI,sBAAsB,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,CAAC;AAChH;AACA,SAAS,sBAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,EAAE;AAClH,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AACnC,QAAQ,SAAS,GAAG,EAAE;AACtB,IAAI;AACJ,IAAI,OAAO,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE;AAChD,QAAQ,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,IAAI;AACJ,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;AACvC,QAAQ,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACvD,QAAQ,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC;AAC5C,QAAQ,IAAI,CAAC,QAAQ,EAAE;AACvB,YAAY,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC;AAC/F,YAAY,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;AAC5C,YAAY,uBAAuB,CAAC,OAAO,EAAE,SAAS,CAAC;AACvD,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,QAAQ,YAAY,SAAS,EAAE;AAC3C,YAAY,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,CAAC;AAC9I,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,QAAQ,YAAY,SAAS,EAAE;AAC3C,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AACrC,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;AACxC,oBAAoB,SAAS,EAAE,KAAK;AACpC,iBAAiB,CAAC;AAClB,YAAY;AACZ,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;AAC9C,YAAY,MAAM,eAAe,GAAG,QAAQ;AAC5C,YAAY,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAChE,QAAQ;AACR,IAAI,CAAC,CAAC;AACN;AACA,SAAS,sBAAsB,CAAC,OAAO,EAAE;AACzC,IAAI,MAAM,QAAQ,GAAG;AACrB,QAAQ,UAAU,EAAE,EAAE;AACtB,QAAQ,WAAW,EAAE,EAAE;AACvB,QAAQ,OAAO,EAAE,EAAE;AACnB,QAAQ,OAAO,EAAE,EAAE;AACnB,KAAK;AACL,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,cAAc,KAAK;AAC/D,QAAQ,IAAI,CAAC,WAAW,EAAE;AAC1B,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,cAAc,CAAC,OAAO,EAAE;AACpC,YAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;AAChD,QAAQ;AACR,QAAQ,IAAI,cAAc,CAAC,OAAO,EAAE;AACpC,YAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;AAChD,QAAQ;AACR,QAAQ,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM;AAC5C,QAAQ,IAAI,CAAC,MAAM,EAAE;AACrB,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;AAClD,QAAQ,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AAC7C,YAAY,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,WAAW;AAC1D,QAAQ;AACR,QAAQ,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC;AACpD,QAAQ,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;AAC9C,YAAY,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY;AAC5D,QAAQ;AACR,IAAI,CAAC,EAAE,EAAE,CAAC;AACV,IAAI,OAAO,QAAQ;AACnB;AACA,SAAS,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE;AACvD,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AAC1B,IAAI,IAAI,OAAO,YAAY,SAAS,EAAE;AACtC,QAAQ,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;AACnE,YAAY,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjE,QAAQ,CAAC,CAAC;AACV,QAAQ;AACR,IAAI;AACJ,IAAI,IAAI,OAAO,YAAY,SAAS,EAAE;AACtC,QAAQ,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK;AACnD,YAAY,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ;AACA,SAAS,cAAc,CAAC,OAAO,EAAE;AACjC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAC1B,QAAQ,OAAO,OAAO,CAAC,OAAO,EAAE;AAChC,IAAI;AACJ,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK;AACpC,QAAQ,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM;AACnE,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAClC,gBAAgB,YAAY,CAAC,WAAW,EAAE;AAC1C,gBAAgB,OAAO,EAAE;AACzB,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN;AACA,SAAS,aAAa,CAAC,KAAK,EAAE;AAC9B,IAAI,QAAQ,CAAC,CAAC,KAAK;AACnB,QAAQ,OAAO,KAAK,KAAK,QAAQ;AACjC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAC7B,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB;AACnE;AACA,SAAS,mBAAmB,GAAG;AAC/B,IAAI,IAAI;AACR,QAAQ,OAAO,MAAM,CAAC,UAAU,CAAC;AACjC,IAAI;AACJ,IAAI,MAAM;AACV,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA,SAAS,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE;AACrD,IAAI,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE;AAC7B,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC1D,QAAQ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;AAChD,QAAQ,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;AAChC,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;AACnC,IAAI;AACJ,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;AAC/D,QAAQ,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC;AAC9D,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;AAChD,QAAQ,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AACpC,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;AACnC,IAAI;AACJ,IAAI,MAAM,UAAU,GAAG,EAAE;AACzB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,IAAI,KAAK;AAC1C,QAAQ,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK;AACtC,YAAY,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAChD,gBAAgB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;AAC/C,gBAAgB,IAAI,MAAM,EAAE;AAC5B,oBAAoB,OAAO,MAAM;AACjC,gBAAgB;AAChB,YAAY;AACZ,YAAY,OAAO,IAAI;AACvB,QAAQ,CAAC;AACT,IAAI,CAAC,CAAC;AACN,IAAI,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU,EAAE;AACrC;AACA,SAAS,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE;AACtD,IAAI,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE;AAC7B,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC1D,QAAQ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;AAChD,QAAQ,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;AAChC,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;AACnC,IAAI;AACJ,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;AAC/D,QAAQ,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC;AACnE,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;AAChD,QAAQ,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AACpC,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;AACnC,IAAI;AACJ,IAAI,MAAM,UAAU,GAAG,EAAE;AACzB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,IAAI,KAAK;AAC1C,QAAQ,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK;AAC5C,YAAY,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAChD,gBAAgB,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC;AACnD,gBAAgB,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU;AACtD,sBAAsB,MAAM,cAAc,CAAC,UAAU;AACrD,sBAAsB,MAAM,UAAU;AACtC,gBAAgB,IAAI,MAAM,EAAE;AAC5B,oBAAoB,OAAO,MAAM;AACjC,gBAAgB;AAChB,YAAY;AACZ,YAAY,OAAO,IAAI;AACvB,QAAQ,CAAC;AACT,IAAI,CAAC,CAAC;AACN,IAAI,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU,EAAE;AACrC;AACA,SAAS,gBAAgB,CAAC,KAAK,EAAE;AACjC,IAAI,IAAI,CAAC,KAAK,EAAE;AAChB,QAAQ,OAAO,EAAE;AACjB,IAAI;AACJ,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC9B,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/B;AACA,SAAS,oBAAoB,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE;AAClE,IAAI,MAAM,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC;AAC9C,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE;AACjC,QAAQ,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;AACpC,IAAI;AACJ,IAAI,IAAI;AACR,QAAQ,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;AACrD,QAAQ,IAAI,CAAC,SAAS,EAAE;AACxB,YAAY,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;AACxC,QAAQ;AACR,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC5C,QAAQ,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;AACnD,QAAQ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;AACjC,IAAI;AACJ,IAAI,MAAM;AACV,QAAQ,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;AACpC,IAAI;AACJ;AACA,SAAS,cAAc,CAAC,KAAK,EAAE;AAC/B,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7C,QAAQ,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;AAChE,IAAI;AACJ;AACA,SAAS,kBAAkB,CAAC,YAAY,EAAE,IAAI,EAAE;AAChD,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AAC5B,QAAQ,OAAO,YAAY,CAAC,IAAI,CAAC;AACjC,IAAI;AACJ,IAAI,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC1C,IAAI,IAAI,KAAK;AACb,IAAI,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AAC5B,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAChC,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;AAClC,YAAY,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE;AACzD,gBAAgB,KAAK,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE;AAC1D,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ,IAAI,IAAI,KAAK,EAAE;AACf,QAAQ,OAAO,KAAK,CAAC,MAAM;AAC3B,IAAI;AACJ,IAAI,OAAO,YAAY,CAAC,GAAG,CAAC;AAC5B;AACA,SAAS,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE;AAClC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;AACnB,QAAQ,OAAO,GAAG,CAAC,IAAI,CAAC;AACxB,IAAI;AACJ,IAAI,IAAI,SAAS;AACjB,IAAI,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACxC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAChC,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;AAClC,YAAY,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE;AACjE,gBAAgB,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE;AACpD,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ,IAAI,IAAI,SAAS,EAAE;AACnB,QAAQ,OAAO,SAAS,CAAC,KAAK;AAC9B,IAAI;AACJ,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC;AACnB;AACA,SAAS,uBAAuB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE;AAC/F,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE;AACjC,QAAQ,OAAO;AACf,YAAY,eAAe,EAAE,MAAM,SAAS;AAC5C,YAAY,kBAAkB,EAAE,MAAM,SAAS;AAC/C,SAAS;AACT,IAAI;AACJ,IAAI,IAAI,KAAK,GAAG,IAAI;AACpB,IAAI,MAAM,OAAO,GAAG,MAAM;AAC1B,QAAQ,IAAI;AACZ,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AACnE,YAAY,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC;AAChD,QAAQ;AACR,QAAQ,MAAM;AACd,QAAQ;AACR,IAAI,CAAC;AACL,IAAI,MAAM,eAAe,GAAG,MAAM;AAClC,QAAQ,IAAI,UAAU,IAAI,CAAC,EAAE;AAC7B,YAAY,OAAO,EAAE;AACrB,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,KAAK,EAAE;AACnB,YAAY,YAAY,CAAC,KAAK,CAAC;AAC/B,QAAQ;AACR,QAAQ,KAAK,GAAG,UAAU,CAAC,MAAM;AACjC,YAAY,KAAK,GAAG,IAAI;AACxB,YAAY,OAAO,EAAE;AACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;AACtB,IAAI,CAAC;AACL,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM;AAChC,QAAQ,IAAI,KAAK,EAAE;AACnB,YAAY,YAAY,CAAC,KAAK,CAAC;AAC/B,QAAQ;AACR,IAAI,CAAC,CAAC;AACN,IAAI,OAAO;AACX,QAAQ,eAAe;AACvB,QAAQ,kBAAkB,EAAE,OAAO;AACnC,KAAK;AACL;AACO,MAAM,oBAAoB,CAAC;AAClC,IAAI,qBAAqB;AACzB,IAAI,2BAA2B,GAAG,IAAI,YAAY,EAAE;AACpD,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACnC,IAAI,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAChC,IAAI,QAAQ,GAAG,MAAM;AACrB,IAAI,CAAC;AACL,IAAI,SAAS,GAAG,MAAM;AACtB,IAAI,CAAC;AACL,IAAI,QAAQ,GAAG;AACf,QAAQ,MAAM,CAAC,MAAM;AACrB,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACtD,YAAY,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC;AACpF,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ,IAAI,YAAY,CAAC,KAAK,EAAE;AACxB,QAAQ,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;AACnC,QAAQ,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK;AACnC,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE;AACjC,YAAY,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjD,YAAY,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;AACxD,YAAY,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAChC,QAAQ;AACR,IAAI;AACJ,IAAI,UAAU,GAAG;AACjB,QAAQ,IAAI,CAAC,SAAS,EAAE;AACxB,IAAI;AACJ,IAAI,UAAU,CAAC,KAAK,EAAE;AACtB,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE;AACjC,YAAY,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjD,QAAQ;AACR,IAAI;AACJ,IAAI,gBAAgB,CAAC,EAAE,EAAE;AACzB,QAAQ,IAAI,CAAC,QAAQ,GAAG,EAAE;AAC1B,IAAI;AACJ,IAAI,iBAAiB,CAAC,EAAE,EAAE;AAC1B,QAAQ,IAAI,CAAC,SAAS,GAAG,EAAE;AAC3B,IAAI;AACJ,IAAI,gBAAgB,CAAC,UAAU,EAAE;AACjC,QAAQ,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;AACxF,IAAI;AACJ,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;AAC/K,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE;AAC/a,YAAY;AACZ,gBAAgB,OAAO,EAAE,iBAAiB;AAC1C,gBAAgB,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnE,gBAAgB,KAAK,EAAE,IAAI;AAC3B,aAAa;AACb,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1B;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC;AAC/H,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,QAAQ,EAAE,yBAAyB;AACvD,oBAAoB,SAAS,EAAE;AAC/B,wBAAwB;AACxB,4BAA4B,OAAO,EAAE,iBAAiB;AACtD,4BAA4B,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AAC/E,4BAA4B,KAAK,EAAE,IAAI;AACvC,yBAAyB;AACzB,qBAAqB;AACrB,oBAAoB,UAAU,EAAE,IAAI;AACpC,iBAAiB;AACjB,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,qBAAqB,EAAE,CAAC;AACtD,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,2BAA2B,EAAE,CAAC;AAC9C,gBAAgB,IAAI,EAAE;AACtB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;AAC/B,gBAAgB,IAAI,EAAE,YAAY;AAClC,gBAAgB,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;AAC1C,aAAa,EAAE;AACf,gBAAgB,IAAI,EAAE,YAAY;AAClC,gBAAgB,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAC3C,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC;AAC7B,gBAAgB,IAAI,EAAE,YAAY;AAClC,gBAAgB,IAAI,EAAE,CAAC,MAAM;AAC7B,aAAa,CAAC,EAAE,EAAE,CAAC;AACP,MAAC,sBAAsB,GAAG,CAAC,oBAAoB;;ACx2BpD,SAAS,QAAQ,CAAC,OAAO,GAAG,UAAU,EAAE;AAC/C,IAAI,OAAO,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;AAC/C;AACO,SAAS,KAAK,CAAC,OAAO,GAAG,eAAe,EAAE;AACjD,IAAI,OAAO,CAAC,KAAK,KAAK;AACtB,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAC9B,QAAQ,OAAO,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI;AACnE,IAAI,CAAC;AACL;AACO,SAAS,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE;AACxC,IAAI,OAAO,CAAC,KAAK,KAAK;AACtB,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAC9B,QAAQ,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC;AAC3D,QAAQ,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI;AAClE,IAAI,CAAC;AACL;AACO,SAAS,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE;AACxC,IAAI,OAAO,CAAC,KAAK,KAAK;AACtB,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAC9B,QAAQ,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC;AAC3D,QAAQ,OAAO,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI;AAClE,IAAI,CAAC;AACL;AACO,SAAS,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,EAAE;AAC3D,IAAI,OAAO,CAAC,KAAK,KAAK;AACtB,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAC9B,QAAQ,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,IAAI;AACjE,IAAI,CAAC;AACL;AACO,SAAS,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE;AAClC,IAAI,OAAO,CAAC,KAAK,KAAK;AACtB,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAC9B,QAAQ,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAC7D,QAAQ,OAAO,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI;AAC/C,IAAI,CAAC;AACL;AACO,SAAS,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE;AAClC,IAAI,OAAO,CAAC,KAAK,KAAK;AACtB,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAC9B,QAAQ,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AAC5D,QAAQ,OAAO,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI;AAC/C,IAAI,CAAC;AACL;AACO,SAAS,OAAO,CAAC,UAAU,EAAE;AACpC,IAAI,OAAO,CAAC,KAAK,KAAK;AACtB,QAAQ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAC5C,YAAY,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;AAC1C,YAAY,IAAI,KAAK,EAAE;AACvB,gBAAgB,OAAO,KAAK;AAC5B,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI,CAAC;AACL;;ACpDO,SAAS,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,EAAE;AAC5D,IAAI,OAAO,OAAO,KAAK,KAAK;AAC5B,QAAQ,IAAI,CAAC,KAAK;AAClB,YAAY,OAAO,IAAI;AACvB,QAAQ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;AAC3C,QAAQ,OAAO,MAAM,GAAG,OAAO,GAAG,IAAI;AACtC,IAAI,CAAC;AACL;AACO,SAAS,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE;AAC7C,IAAI,IAAI,SAAS;AACjB,IAAI,OAAO,OAAO,KAAK,KAAK;AAC5B,QAAQ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK;AACxC,YAAY,YAAY,CAAC,SAAS,CAAC;AACnC,YAAY,SAAS,GAAG,UAAU,CAAC,YAAY;AAC/C,gBAAgB,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC;AACnD,gBAAgB,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU;AACtD,sBAAsB,MAAM,cAAc,CAAC,UAAU;AACrD,sBAAsB,MAAM,UAAU;AACtC,gBAAgB,OAAO,CAAC,MAAM,CAAC;AAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;AACvB,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC;AACL;;ACrBO,SAAS,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,EAAE,EAAE;AACxD,IAAI,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AACxD,IAAI,MAAM,aAAa,GAAG,MAAM,CAAC;AACjC,QAAQ,IAAI,EAAE,EAAE;AAChB,QAAQ,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACvD,QAAQ,MAAM,EAAE,EAAE;AAClB,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9D,IAAI,IAAI,SAAS,GAAG,IAAI;AACxB,IAAI,IAAI,eAAe,GAAG,CAAC;AAC3B,IAAI,IAAI,eAAe,GAAG;AAC1B,QAAQ,IAAI,EAAE,EAAE;AAChB,QAAQ,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACvD,QAAQ,MAAM,EAAE,EAAE;AAClB,KAAK;AACL,IAAI,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM;AACpE,QAAQ,IAAI,eAAe,GAAG,CAAC,EAAE;AACjC,YAAY,eAAe,EAAE;AAC7B,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,CAAC,SAAS,EAAE;AACxB,YAAY,eAAe,GAAG;AAC9B,gBAAgB,GAAG,eAAe;AAClC,gBAAgB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/D,aAAa;AACb,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/D,QAAQ,IAAI,cAAc,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;AAC/D,YAAY,eAAe,GAAG;AAC9B,gBAAgB,GAAG,eAAe;AAClC,gBAAgB,OAAO,EAAE,QAAQ;AACjC,aAAa;AACb,YAAY,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AAC5D,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC;AAC9E,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,QAAQ,EAAE;AAC3C,YAAY,WAAW,CAAC,KAAK,EAAE;AAC/B,QAAQ;AACR,QAAQ,eAAe,GAAG;AAC1B,YAAY,IAAI,EAAE,WAAW;AAC7B,YAAY,OAAO,EAAE,QAAQ;AAC7B,YAAY,MAAM,EAAE,EAAE;AACtB,SAAS;AACT,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AACxD,IAAI,CAAC,CAAC;AACN,IAAI,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO;AAC5C,IAAI,QAAQ,CAAC,OAAO,GAAG,MAAM;AAC7B,QAAQ,YAAY,CAAC,WAAW,EAAE;AAClC,QAAQ,eAAe,EAAE;AACzB,IAAI,CAAC;AACL,IAAI,MAAM,IAAI,GAAG,MAAM;AACvB,QAAQ,MAAM,OAAO,GAAG,aAAa,EAAE;AACvC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACvC,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzE,QAAQ,SAAS,GAAG,KAAK;AACzB,QAAQ,eAAe,EAAE;AACzB,QAAQ,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;AACpC,QAAQ,SAAS,GAAG,IAAI;AACxB,QAAQ,eAAe,GAAG;AAC1B,YAAY,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,YAAY,OAAO,EAAE,QAAQ;AAC7B,YAAY,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;AACxD,SAAS;AACT,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AACxD,IAAI,CAAC;AACL,IAAI,MAAM,IAAI,GAAG,MAAM;AACvB,QAAQ,MAAM,OAAO,GAAG,aAAa,EAAE;AACvC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACzC,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjD,QAAQ,SAAS,GAAG,KAAK;AACzB,QAAQ,eAAe,EAAE;AACzB,QAAQ,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;AAChC,QAAQ,SAAS,GAAG,IAAI;AACxB,QAAQ,eAAe,GAAG;AAC1B,YAAY,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC;AACpD,YAAY,OAAO,EAAE,IAAI;AACzB,YAAY,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,SAAS;AACT,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AACxD,IAAI,CAAC;AACL,IAAI,MAAM,YAAY,GAAG,MAAM;AAC/B,QAAQ,eAAe,GAAG;AAC1B,YAAY,IAAI,EAAE,EAAE;AACpB,YAAY,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC3D,YAAY,MAAM,EAAE,EAAE;AACtB,SAAS;AACT,QAAQ,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AACxD,IAAI,CAAC;AACL,IAAI,SAAS,YAAY,CAAC,KAAK,EAAE;AACjC,QAAQ,OAAO;AACf,YAAY,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC;AAC7D,YAAY,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;AAC7C,YAAY,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC;AACjE,SAAS;AACT,IAAI;AACJ,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;AACnC,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,YAAY;AACpB,QAAQ,OAAO,EAAE,aAAa,CAAC,UAAU,EAAE;AAC3C,KAAK,CAAC;AACN;;;;"}
|
package/index.d.ts
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { WritableSignal, DestroyRef, Signal, OnInit, EventEmitter } from '@angular/core';
|
|
3
|
-
import { FormGroup, AbstractControl, FormArray, ControlValueAccessor } from '@angular/forms';
|
|
4
|
-
import { Observable } from 'rxjs';
|
|
5
|
-
import { TreeConfig, TreeNode, SignalTree } from '@signaltree/core';
|
|
6
|
-
|
|
7
|
-
type FormTreeAsyncValidatorFn<T> = (value: T) => Observable<string | null> | Promise<string | null>;
|
|
8
|
-
type EnhancedArraySignal<T> = WritableSignal<T[]> & {
|
|
9
|
-
push: (item: T) => void;
|
|
10
|
-
removeAt: (index: number) => void;
|
|
11
|
-
setAt: (index: number, value: T) => void;
|
|
12
|
-
insertAt: (index: number, item: T) => void;
|
|
13
|
-
move: (from: number, to: number) => void;
|
|
14
|
-
clear: () => void;
|
|
15
|
-
};
|
|
16
|
-
type FieldValidator = (value: unknown) => string | null;
|
|
17
|
-
interface FieldConfig {
|
|
18
|
-
debounceMs?: number;
|
|
19
|
-
validators?: Record<string, FieldValidator> | FieldValidator[];
|
|
20
|
-
asyncValidators?: Record<string, FormTreeAsyncValidatorFn<unknown>> | Array<FormTreeAsyncValidatorFn<unknown>>;
|
|
21
|
-
}
|
|
22
|
-
interface ConditionalField<T> {
|
|
23
|
-
when: (values: T) => boolean;
|
|
24
|
-
fields: string[];
|
|
25
|
-
}
|
|
26
|
-
interface FormTreeOptions<T extends Record<string, unknown>> extends TreeConfig {
|
|
27
|
-
validators?: SyncValidatorMap;
|
|
28
|
-
asyncValidators?: AsyncValidatorMap;
|
|
29
|
-
destroyRef?: DestroyRef;
|
|
30
|
-
fieldConfigs?: Record<string, FieldConfig>;
|
|
31
|
-
conditionals?: Array<ConditionalField<T>>;
|
|
32
|
-
persistKey?: string;
|
|
33
|
-
storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
|
|
34
|
-
persistDebounceMs?: number;
|
|
35
|
-
validationBatchMs?: number;
|
|
36
|
-
}
|
|
37
|
-
type FormTree$1<T extends Record<string, unknown>> = {
|
|
38
|
-
state: TreeNode<T>;
|
|
39
|
-
$: TreeNode<T>;
|
|
40
|
-
form: FormGroup;
|
|
41
|
-
errors: WritableSignal<Record<string, string>>;
|
|
42
|
-
asyncErrors: WritableSignal<Record<string, string>>;
|
|
43
|
-
touched: WritableSignal<Record<string, boolean>>;
|
|
44
|
-
asyncValidating: WritableSignal<Record<string, boolean>>;
|
|
45
|
-
dirty: WritableSignal<boolean>;
|
|
46
|
-
valid: WritableSignal<boolean>;
|
|
47
|
-
submitting: WritableSignal<boolean>;
|
|
48
|
-
unwrap(): T;
|
|
49
|
-
setValue(field: string, value: unknown): void;
|
|
50
|
-
setValues(values: Partial<T>): void;
|
|
51
|
-
reset(): void;
|
|
52
|
-
submit<TResult>(submitFn: (values: T) => Promise<TResult>): Promise<TResult>;
|
|
53
|
-
validate(field?: string): Promise<void>;
|
|
54
|
-
getFieldError(field: string): Signal<string | undefined>;
|
|
55
|
-
getFieldAsyncError(field: string): Signal<string | undefined>;
|
|
56
|
-
getFieldTouched(field: string): Signal<boolean | undefined>;
|
|
57
|
-
isFieldValid(field: string): Signal<boolean>;
|
|
58
|
-
isFieldAsyncValidating(field: string): Signal<boolean | undefined>;
|
|
59
|
-
fieldErrors: Record<string, Signal<string | undefined>>;
|
|
60
|
-
fieldAsyncErrors: Record<string, Signal<string | undefined>>;
|
|
61
|
-
values: SignalTree<T>;
|
|
62
|
-
destroy(): void;
|
|
63
|
-
};
|
|
64
|
-
declare class FormValidationError extends Error {
|
|
65
|
-
readonly errors: Record<string, string>;
|
|
66
|
-
readonly asyncErrors: Record<string, string>;
|
|
67
|
-
constructor(errors: Record<string, string>, asyncErrors: Record<string, string>);
|
|
68
|
-
}
|
|
69
|
-
type SyncValidatorMap = Record<string, (value: unknown) => string | null>;
|
|
70
|
-
type AsyncValidatorMap = Record<string, FormTreeAsyncValidatorFn<unknown>>;
|
|
71
|
-
declare function createFormTree<T extends Record<string, unknown>>(initialValues: T, config?: FormTreeOptions<T>): FormTree$1<T>;
|
|
72
|
-
declare function createVirtualFormArray<T>(items: T[], visibleRange: {
|
|
73
|
-
start: number;
|
|
74
|
-
end: number;
|
|
75
|
-
}, controlFactory?: (value: T, index: number) => AbstractControl): FormArray;
|
|
76
|
-
declare class SignalValueDirective implements ControlValueAccessor, OnInit {
|
|
77
|
-
signalTreeSignalValue: WritableSignal<unknown>;
|
|
78
|
-
signalTreeSignalValueChange: EventEmitter<unknown>;
|
|
79
|
-
private elementRef;
|
|
80
|
-
private renderer;
|
|
81
|
-
private onChange;
|
|
82
|
-
private onTouched;
|
|
83
|
-
ngOnInit(): void;
|
|
84
|
-
handleChange(event: Event): void;
|
|
85
|
-
handleBlur(): void;
|
|
86
|
-
writeValue(value: unknown): void;
|
|
87
|
-
registerOnChange(fn: (value: unknown) => void): void;
|
|
88
|
-
registerOnTouched(fn: () => void): void;
|
|
89
|
-
setDisabledState?(isDisabled: boolean): void;
|
|
90
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SignalValueDirective, never>;
|
|
91
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<SignalValueDirective, "[signalTreeSignalValue]", never, { "signalTreeSignalValue": { "alias": "signalTreeSignalValue"; "required": false; }; }, { "signalTreeSignalValueChange": "signalTreeSignalValueChange"; }, never, never, true, never>;
|
|
92
|
-
}
|
|
93
|
-
declare const SIGNAL_FORM_DIRECTIVES: (typeof SignalValueDirective)[];
|
|
94
|
-
|
|
95
|
-
declare function required(message?: string): FieldValidator;
|
|
96
|
-
declare function email(message?: string): FieldValidator;
|
|
97
|
-
declare function minLength(min: number, message?: string): FieldValidator;
|
|
98
|
-
declare function maxLength(max: number, message?: string): FieldValidator;
|
|
99
|
-
declare function pattern(regex: RegExp, message?: string): FieldValidator;
|
|
100
|
-
declare function min(min: number, message?: string): FieldValidator;
|
|
101
|
-
declare function max(max: number, message?: string): FieldValidator;
|
|
102
|
-
declare function compose(validators: FieldValidator[]): FieldValidator;
|
|
103
|
-
|
|
104
|
-
declare function unique(checkFn: (value: unknown) => Promise<boolean>, message?: string): FormTreeAsyncValidatorFn<unknown>;
|
|
105
|
-
declare function debounce(validator: FormTreeAsyncValidatorFn<unknown>, delayMs: number): FormTreeAsyncValidatorFn<unknown>;
|
|
106
|
-
|
|
107
|
-
interface FormTree<T extends Record<string, unknown>> {
|
|
108
|
-
form: any;
|
|
109
|
-
unwrap(): T;
|
|
110
|
-
destroy(): void;
|
|
111
|
-
setValues(values: Partial<T>): void;
|
|
112
|
-
}
|
|
113
|
-
interface FormHistory<T> {
|
|
114
|
-
past: T[];
|
|
115
|
-
present: T;
|
|
116
|
-
future: T[];
|
|
117
|
-
}
|
|
118
|
-
declare function withFormHistory<T extends Record<string, unknown>>(formTree: FormTree<T>, options?: {
|
|
119
|
-
capacity?: number;
|
|
120
|
-
}): FormTree<T> & {
|
|
121
|
-
undo: () => void;
|
|
122
|
-
redo: () => void;
|
|
123
|
-
clearHistory: () => void;
|
|
124
|
-
history: Signal<FormHistory<T>>;
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
export { FormValidationError, SIGNAL_FORM_DIRECTIVES, SignalValueDirective, compose, createFormTree, createVirtualFormArray, debounce, email, max, maxLength, min, minLength, pattern, required, unique, withFormHistory };
|
|
128
|
-
export type { ConditionalField, EnhancedArraySignal, FieldConfig, FieldValidator, FormHistory, FormTree$1 as FormTree, FormTreeAsyncValidatorFn, FormTreeOptions };
|
package/src/audit/index.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Middleware } from '@signaltree/core';
|
|
2
|
-
|
|
3
|
-
interface AuditEntry<T = unknown> {
|
|
4
|
-
timestamp: number;
|
|
5
|
-
changes: Partial<T>;
|
|
6
|
-
metadata?: {
|
|
7
|
-
userId?: string;
|
|
8
|
-
source?: string;
|
|
9
|
-
description?: string;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
declare function createAuditMiddleware<T>(auditLog: AuditEntry<T>[], getMetadata?: () => AuditEntry<T>['metadata']): Middleware<T>;
|
|
13
|
-
|
|
14
|
-
export { createAuditMiddleware };
|
|
15
|
-
export type { AuditEntry };
|
package/src/history/index.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Signal } from '@angular/core';
|
|
2
|
-
|
|
3
|
-
interface FormTree<T extends Record<string, unknown>> {
|
|
4
|
-
form: any;
|
|
5
|
-
unwrap(): T;
|
|
6
|
-
destroy(): void;
|
|
7
|
-
setValues(values: Partial<T>): void;
|
|
8
|
-
}
|
|
9
|
-
interface FormHistory<T> {
|
|
10
|
-
past: T[];
|
|
11
|
-
present: T;
|
|
12
|
-
future: T[];
|
|
13
|
-
}
|
|
14
|
-
declare function withFormHistory<T extends Record<string, unknown>>(formTree: FormTree<T>, options?: {
|
|
15
|
-
capacity?: number;
|
|
16
|
-
}): FormTree<T> & {
|
|
17
|
-
undo: () => void;
|
|
18
|
-
redo: () => void;
|
|
19
|
-
clearHistory: () => void;
|
|
20
|
-
history: Signal<FormHistory<T>>;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export { withFormHistory };
|
|
24
|
-
export type { FormHistory };
|