app-studio 0.7.8 → 0.7.10

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.
@@ -1065,12 +1065,15 @@
1065
1065
  }
1066
1066
  return merged;
1067
1067
  };
1068
+ // Stable default references to prevent unnecessary re-renders and cache invalidation
1069
+ const DEFAULT_THEME_OVERRIDE = {};
1070
+ const DEFAULT_COLORS_OVERRIDE = {};
1068
1071
  const ThemeProvider = _ref => {
1069
1072
  let {
1070
- theme: themeOverride = {},
1073
+ theme: themeOverride = DEFAULT_THEME_OVERRIDE,
1071
1074
  mode: initialMode = 'light',
1072
- dark: darkOverride = {},
1073
- light: lightOverride = {},
1075
+ dark: darkOverride = DEFAULT_COLORS_OVERRIDE,
1076
+ light: lightOverride = DEFAULT_COLORS_OVERRIDE,
1074
1077
  children,
1075
1078
  strict = false,
1076
1079
  targetWindow
@@ -1808,12 +1811,53 @@
1808
1811
  'textJustify', 'lineClamp', 'textIndent', 'perspective']);
1809
1812
  // Common React event handlers that should not be treated as style props
1810
1813
  const commonEventHandlers = /*#__PURE__*/new Set(['onClick', 'onChange', 'onSubmit', 'onFocus', 'onBlur', 'onKeyDown', 'onKeyUp', 'onKeyPress', 'onMouseDown', 'onMouseUp', 'onMouseMove', 'onMouseEnter', 'onMouseLeave', 'onTouchStart', 'onTouchEnd', 'onTouchMove', 'onScroll', 'onWheel', 'onDrag', 'onDragStart', 'onDragEnd', 'onDrop']);
1814
+ // Non-hyphenated HTML/SVG attributes that must never be treated as style props.
1815
+ // Hyphenated attributes (aria-*, data-*, etc.) are caught by a prefix/hyphen check below.
1816
+ const htmlOnlyAttributes = /*#__PURE__*/new Set([
1817
+ // Accessibility
1818
+ 'role', 'tabIndex',
1819
+ // Global HTML attributes
1820
+ 'id', 'title', 'lang', 'dir', 'hidden', 'draggable', 'contentEditable', 'spellCheck', 'nonce', 'slot', 'is', 'inputMode', 'enterKeyHint', 'autofocus', 'autoFocus', 'translate',
1821
+ // Form attributes
1822
+ 'autoComplete', 'name', 'disabled', 'readOnly', 'required', 'checked', 'selected', 'multiple', 'value', 'defaultValue', 'defaultChecked', 'placeholder', 'htmlFor', 'type', 'accept', 'maxLength', 'minLength', 'pattern', 'noValidate', 'formAction', 'formEncType', 'formMethod', 'formNoValidate', 'formTarget',
1823
+ // Link/navigation attributes
1824
+ 'href', 'target', 'rel', 'download', 'referrerPolicy', 'integrity', 'crossOrigin',
1825
+ // Form container attributes
1826
+ 'action', 'method', 'encType',
1827
+ // Media attributes
1828
+ 'autoPlay', 'controls', 'loop', 'muted', 'playsInline', 'poster', 'preload', 'mediaGroup',
1829
+ // Image/embed attributes
1830
+ 'loading', 'decoding', 'sizes', 'srcDoc', 'srcLang', 'srcSet', 'useMap',
1831
+ // Table attributes
1832
+ 'colSpan', 'rowSpan', 'cols', 'rows', 'headers', 'scope', 'span',
1833
+ // Iframe/embed attributes
1834
+ 'sandbox', 'allowFullScreen', 'frameBorder', 'scrolling', 'seamless', 'allow',
1835
+ // Interactive attributes
1836
+ 'open', 'cite', 'dateTime', 'reversed', 'start', 'high', 'low', 'optimum', 'wrap', 'shape', 'size', 'summary',
1837
+ // Script/resource attributes
1838
+ 'async', 'defer', 'noModule', 'charSet', 'httpEquiv', 'manifest',
1839
+ // Microdata/RDFa attributes
1840
+ 'about', 'datatype', 'inlist', 'prefix', 'property', 'resource', 'typeof', 'vocab', 'itemProp', 'itemScope', 'itemType', 'itemID', 'itemRef',
1841
+ // Deprecated but still used
1842
+ 'classID', 'contextMenu', 'keyParams', 'keyType', 'kind', 'label', 'list', 'profile', 'radioGroup', 'wmode', 'capture', 'challenge', 'scoped', 'step', 'form',
1843
+ // SVG-only attributes (not CSS properties)
1844
+ 'viewBox', 'preserveAspectRatio', 'xmlns', 'xlinkHref', 'xmlBase', 'xmlLang', 'xmlSpace', 'd', 'pathLength', 'points', 'markerEnd', 'markerMid', 'markerStart', 'clipPathUnits', 'gradientUnits', 'gradientTransform', 'patternUnits', 'patternTransform', 'patternContentUnits', 'spreadMethod', 'startOffset', 'stdDeviation', 'stitchTiles', 'surfaceScale', 'textLength', 'lengthAdjust', 'maskUnits', 'maskContentUnits', 'filterUnits', 'primitiveUnits', 'numOctaves', 'baseFrequency', 'seed', 'result', 'in2', 'values', 'keyTimes', 'keySplines', 'repeatCount', 'repeatDur', 'calcMode', 'attributeName', 'attributeType', 'begin', 'dur', 'end', 'by']);
1811
1845
  // Improved style prop detection
1812
1846
  const isStyleProp = prop => {
1813
1847
  // First check if it's a common event handler (these should never be treated as style props)
1814
1848
  if (commonEventHandlers.has(prop)) {
1815
1849
  return false;
1816
1850
  }
1851
+ // HTML attributes should never be treated as style props
1852
+ if (htmlOnlyAttributes.has(prop)) {
1853
+ return false;
1854
+ }
1855
+ // Any prop containing a hyphen is an HTML attribute (aria-*, data-*, accept-charset, etc.)
1856
+ // In React, CSS properties are always camelCase — only CSS custom properties use hyphens (--*),
1857
+ // and data-style-* is a special convention handled separately below.
1858
+ if (prop.includes('-') && !prop.startsWith('--') && !prop.startsWith('data-style-')) {
1859
+ return false;
1860
+ }
1817
1861
  // Check if it's a valid CSS property or custom style prop
1818
1862
  if (cssProperties.has(prop) || extraKeys.has(prop) || prop.startsWith('--') || prop.startsWith('data-style-') && !includeKeys.has(prop)) {
1819
1863
  return true;
@@ -2949,10 +2993,11 @@
2949
2993
  trackEvent,
2950
2994
  children
2951
2995
  } = _ref;
2996
+ const value = React.useMemo(() => ({
2997
+ trackEvent
2998
+ }), [trackEvent]);
2952
2999
  return /*#__PURE__*/React__default.createElement(AnalyticsContext.Provider, {
2953
- value: {
2954
- trackEvent
2955
- }
3000
+ value: value
2956
3001
  }, children);
2957
3002
  };
2958
3003
 
@@ -2984,12 +3029,10 @@
2984
3029
  */
2985
3030
  function useStableStyleMemo(propsToProcess, getColor, mediaQueries, devices, manager, theme) {
2986
3031
  const cacheRef = React.useRef(null);
2987
- // Compute hash of current props
2988
- const currentHash = React.useMemo(() => {
2989
- // Include theme in hash to bust cache on theme changes
2990
- const themeHash = theme ? JSON.stringify(theme) : '';
2991
- return hashStyleProps(propsToProcess) + '|' + hash(themeHash);
2992
- }, [propsToProcess, theme]);
3032
+ // Compute hash directly no useMemo since propsToProcess is always a new
3033
+ // reference (from destructuring), so the memo deps would always change.
3034
+ const themeHash = theme ? JSON.stringify(theme) : '';
3035
+ const currentHash = hashStyleProps(propsToProcess) + '|' + hash(themeHash);
2993
3036
  // Only recompute classes if hash changed
2994
3037
  if (!cacheRef.current || cacheRef.current.hash !== currentHash) {
2995
3038
  const classes = extractUtilityClasses(propsToProcess, getColor, mediaQueries, devices, manager);
@@ -3081,44 +3124,44 @@
3081
3124
  };
3082
3125
  }, [animateOut, manager]);
3083
3126
  // Prepare props for processing (apply view/scroll timeline if needed)
3084
- const propsToProcess = React.useMemo(() => {
3085
- const processed = {
3086
- ...rest,
3087
- blend
3088
- };
3089
- // Apply view() timeline ONLY if animateOn='View' (not Both or Mount)
3090
- if (animateOn === 'View' && processed.animate) {
3091
- const animations = Array.isArray(processed.animate) ? processed.animate : [processed.animate];
3092
- processed.animate = animations.map(anim => {
3093
- // Only add timeline if not already specified
3094
- if (!anim.timeline) {
3095
- return {
3096
- ...anim,
3097
- timeline: 'view()',
3098
- range: anim.range || 'entry',
3099
- fillMode: anim.fillMode || 'both'
3100
- };
3101
- }
3102
- return anim;
3103
- });
3104
- }
3105
- // Apply scroll() timeline if animateOn='Scroll'
3106
- if (animateOn === 'Scroll' && processed.animate) {
3107
- const animations = Array.isArray(processed.animate) ? processed.animate : [processed.animate];
3108
- processed.animate = animations.map(anim => {
3109
- // Only add timeline if not already specified
3110
- if (!anim.timeline) {
3111
- return {
3112
- ...anim,
3113
- timeline: 'scroll()',
3114
- fillMode: anim.fillMode || 'both'
3115
- };
3116
- }
3117
- return anim;
3118
- });
3119
- }
3120
- return processed;
3121
- }, [rest, blend, animateOn]);
3127
+ // No useMemo `rest` is always a new reference from destructuring, so
3128
+ // memo deps would always change. useStableStyleMemo handles the real
3129
+ // memoization via hash-based comparison.
3130
+ const propsToProcess = {
3131
+ ...rest,
3132
+ blend
3133
+ };
3134
+ // Apply view() timeline ONLY if animateOn='View' (not Both or Mount)
3135
+ if (animateOn === 'View' && propsToProcess.animate) {
3136
+ const animations = Array.isArray(propsToProcess.animate) ? propsToProcess.animate : [propsToProcess.animate];
3137
+ propsToProcess.animate = animations.map(anim => {
3138
+ // Only add timeline if not already specified
3139
+ if (!anim.timeline) {
3140
+ return {
3141
+ ...anim,
3142
+ timeline: 'view()',
3143
+ range: anim.range || 'entry',
3144
+ fillMode: anim.fillMode || 'both'
3145
+ };
3146
+ }
3147
+ return anim;
3148
+ });
3149
+ }
3150
+ // Apply scroll() timeline if animateOn='Scroll'
3151
+ if (animateOn === 'Scroll' && propsToProcess.animate) {
3152
+ const animations = Array.isArray(propsToProcess.animate) ? propsToProcess.animate : [propsToProcess.animate];
3153
+ propsToProcess.animate = animations.map(anim => {
3154
+ // Only add timeline if not already specified
3155
+ if (!anim.timeline) {
3156
+ return {
3157
+ ...anim,
3158
+ timeline: 'scroll()',
3159
+ fillMode: anim.fillMode || 'both'
3160
+ };
3161
+ }
3162
+ return anim;
3163
+ });
3164
+ }
3122
3165
  // Use hash-based memoization for style extraction
3123
3166
  const utilityClasses = useStableStyleMemo(propsToProcess, getColor, mediaQueries, devices, manager, theme);
3124
3167
  const newProps = {
@@ -5040,14 +5083,28 @@
5040
5083
  width: win?.innerWidth || 0,
5041
5084
  height: win?.innerHeight || 0
5042
5085
  });
5086
+ const timeoutRef = React.useRef();
5043
5087
  React.useEffect(() => {
5044
5088
  if (!win) return;
5045
- const handleResize = () => setSize({
5046
- width: win.innerWidth,
5047
- height: win.innerHeight
5048
- });
5089
+ const handleResize = () => {
5090
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
5091
+ timeoutRef.current = setTimeout(() => {
5092
+ const newWidth = win.innerWidth;
5093
+ const newHeight = win.innerHeight;
5094
+ setSize(prev => {
5095
+ if (prev.width === newWidth && prev.height === newHeight) return prev;
5096
+ return {
5097
+ width: newWidth,
5098
+ height: newHeight
5099
+ };
5100
+ });
5101
+ }, 100);
5102
+ };
5049
5103
  win.addEventListener('resize', handleResize);
5050
- return () => win.removeEventListener('resize', handleResize);
5104
+ return () => {
5105
+ win.removeEventListener('resize', handleResize);
5106
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
5107
+ };
5051
5108
  }, [win]);
5052
5109
  return /*#__PURE__*/React__default.createElement(WindowSizeContext.Provider, {
5053
5110
  value: size
@@ -5080,12 +5137,13 @@
5080
5137
  return [ref, active];
5081
5138
  }
5082
5139
 
5140
+ const DEFAULT_CLICK_OUTSIDE_OPTIONS = {};
5083
5141
  function useClickOutside(options) {
5084
5142
  const [clickedOutside, setClickedOutside] = React.useState(false);
5085
5143
  const ref = React.useRef(null);
5086
5144
  const {
5087
5145
  targetWindow
5088
- } = options || {};
5146
+ } = options || DEFAULT_CLICK_OUTSIDE_OPTIONS;
5089
5147
  React.useEffect(() => {
5090
5148
  const win = targetWindow || (typeof window !== 'undefined' ? window : null);
5091
5149
  if (!win) return;
@@ -5105,13 +5163,14 @@
5105
5163
  return [ref, clickedOutside];
5106
5164
  }
5107
5165
 
5166
+ const DEFAULT_ELEMENT_POSITION_OPTIONS = {};
5108
5167
  /**
5109
5168
  * A React hook to determine an element's relative position within the viewport
5110
5169
  * and where the most available space is around it within the viewport.
5111
5170
  */
5112
5171
  function useElementPosition(options) {
5113
5172
  if (options === void 0) {
5114
- options = {};
5173
+ options = DEFAULT_ELEMENT_POSITION_OPTIONS;
5115
5174
  }
5116
5175
  const {
5117
5176
  trackChanges = true,
@@ -5283,18 +5342,21 @@
5283
5342
  }
5284
5343
 
5285
5344
  const useMount = callback => {
5345
+ const callbackRef = React.useRef(callback);
5346
+ callbackRef.current = callback;
5286
5347
  React.useEffect(() => {
5287
- callback();
5348
+ callbackRef.current();
5288
5349
  }, []);
5289
5350
  };
5290
5351
 
5352
+ const DEFAULT_ON_SCREEN_OPTIONS = {};
5291
5353
  function useOnScreen(options) {
5292
5354
  const ref = React.useRef(null);
5293
5355
  const [isOnScreen, setOnScreen] = React.useState(false);
5294
5356
  const {
5295
5357
  targetWindow,
5296
5358
  ...observerOptions
5297
- } = options || {};
5359
+ } = options || DEFAULT_ON_SCREEN_OPTIONS;
5298
5360
  React.useEffect(() => {
5299
5361
  const node = ref.current;
5300
5362
  if (!node) return;
@@ -5313,7 +5375,7 @@
5313
5375
  return () => {
5314
5376
  observer.disconnect();
5315
5377
  };
5316
- }, [targetWindow, options]);
5378
+ }, [targetWindow, observerOptions.root, observerOptions.rootMargin, observerOptions.threshold]);
5317
5379
  return [ref, isOnScreen];
5318
5380
  }
5319
5381
 
@@ -5338,14 +5400,14 @@
5338
5400
  devices
5339
5401
  } = context;
5340
5402
  // Helper to check if current screen matches a breakpoint or device
5341
- const on = s => devices[s] ? devices[s].includes(screen) : s === screen;
5342
- return {
5403
+ const on = React.useCallback(s => devices[s] ? devices[s].includes(screen) : s === screen, [devices, screen]);
5404
+ return React.useMemo(() => ({
5343
5405
  ...context,
5344
5406
  screen,
5345
5407
  orientation,
5346
5408
  on,
5347
5409
  is: on
5348
- };
5410
+ }), [context, screen, orientation, on]);
5349
5411
  };
5350
5412
  /**
5351
5413
  * Hook for components that need exact window dimensions.
@@ -5376,17 +5438,21 @@
5376
5438
  orientation,
5377
5439
  devices
5378
5440
  } = context;
5379
- const on = s => devices[s] ? devices[s].includes(screen) : s === screen;
5380
- const result = {
5441
+ const on = React.useCallback(s => devices[s] ? devices[s].includes(screen) : s === screen, [devices, screen]);
5442
+ return React.useMemo(() => ({
5381
5443
  ...context,
5382
5444
  screen,
5383
5445
  orientation,
5384
5446
  on,
5385
5447
  is: on
5386
- };
5387
- return result;
5448
+ }), [context, screen, orientation, on]);
5388
5449
  };
5389
5450
 
5451
+ // Stable default references to prevent unnecessary re-renders
5452
+ const DEFAULT_SCROLL_OFFSET = [0, 0];
5453
+ const DEFAULT_SCROLL_OPTIONS = {};
5454
+ const DEFAULT_SCROLL_ANIMATION_OPTIONS = {};
5455
+ const DEFAULT_INFINITE_SCROLL_OPTIONS = {};
5390
5456
  // Helper to check if element is a Window object (works across iframes)
5391
5457
  const isWindow = obj => {
5392
5458
  return obj && obj.window === obj;
@@ -5420,10 +5486,10 @@
5420
5486
  const useScroll = function (_temp) {
5421
5487
  let {
5422
5488
  container,
5423
- offset = [0, 0],
5489
+ offset = DEFAULT_SCROLL_OFFSET,
5424
5490
  throttleMs = 100,
5425
5491
  disabled = false
5426
- } = _temp === void 0 ? {} : _temp;
5492
+ } = _temp === void 0 ? DEFAULT_SCROLL_OPTIONS : _temp;
5427
5493
  const [scrollPosition, setScrollPosition] = React.useState({
5428
5494
  x: 0,
5429
5495
  y: 0,
@@ -5562,7 +5628,7 @@
5562
5628
  // Enhanced useScrollAnimation with callback support and iframe support
5563
5629
  const useScrollAnimation = function (ref, options) {
5564
5630
  if (options === void 0) {
5565
- options = {};
5631
+ options = DEFAULT_SCROLL_ANIMATION_OPTIONS;
5566
5632
  }
5567
5633
  const [isInView, setIsInView] = React.useState(false);
5568
5634
  const [progress, setProgress] = React.useState(0);
@@ -5630,7 +5696,7 @@
5630
5696
  // Enhanced useInfiniteScroll with debouncing
5631
5697
  const useInfiniteScroll = function (callback, options) {
5632
5698
  if (options === void 0) {
5633
- options = {};
5699
+ options = DEFAULT_INFINITE_SCROLL_OPTIONS;
5634
5700
  }
5635
5701
  const [sentinel, setSentinel] = React.useState(null);
5636
5702
  const callbackRef = React.useRef(callback);
@@ -5725,12 +5791,13 @@
5725
5791
 
5726
5792
  const useWindowSize = () => React.useContext(WindowSizeContext);
5727
5793
 
5794
+ const DEFAULT_IN_VIEW_OPTIONS = {};
5728
5795
  function useInView(options) {
5729
5796
  const {
5730
5797
  triggerOnce = false,
5731
5798
  targetWindow,
5732
5799
  ...observerOptions
5733
- } = options || {};
5800
+ } = options || DEFAULT_IN_VIEW_OPTIONS;
5734
5801
  const ref = React.useRef(null);
5735
5802
  const [inView, setInView] = React.useState(false);
5736
5803
  React.useEffect(() => {
@@ -5760,7 +5827,7 @@
5760
5827
  return () => {
5761
5828
  observer.disconnect();
5762
5829
  };
5763
- }, [triggerOnce, targetWindow, ...Object.values(observerOptions || {})]);
5830
+ }, [triggerOnce, targetWindow, observerOptions.root, observerOptions.rootMargin, observerOptions.threshold]);
5764
5831
  return {
5765
5832
  ref,
5766
5833
  inView
@@ -5845,7 +5912,7 @@
5845
5912
  if (!iframe) return;
5846
5913
  const updateState = () => {
5847
5914
  const win = iframe.contentWindow;
5848
- const doc = iframe.contentDocument || win?.document;
5915
+ const doc = win?.document || iframe.contentDocument;
5849
5916
  if (win && doc) {
5850
5917
  setIframeWindow(win);
5851
5918
  setIframeDocument(doc);
@@ -1 +1 @@
1
- {"version":3,"file":"app-studio.umd.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"app-studio.umd.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}